피드로 돌아가기
Dev.toBackend
원문 읽기
asyncio 도입을 통한 QPS 25배 향상 및 Latency 획기적 단축
I Rewrote Our Scraper with asyncio. My CTO Thought I Added Servers.
AI 요약
Context
200개 소스의 실시간 마켓 데이터 수집을 위해 10초 주기 갱신 및 2초 미만 Latency 요구사항 발생. 기존 Synchronous Request 기반 구조로 인해 CPU 사용률은 5% 미만임에도 Network I/O 대기 시간으로 인한 전체 라운드 14초 소요라는 병목 현상 직면.
Technical Solution
- Single-threaded Event Loop 기반의 asyncio 채택을 통한 Non-blocking I/O 구조 전환
- Coroutine 내 await 키워드 활용으로 I/O 대기 시 제어권을 Event Loop에 반환하여 타 작업 스케줄링 최적화
- asyncio.gather를 통한 다수 코루틴의 동시 실행으로 전체 소요 시간을 최장 Latency 요청 시간에 수렴하도록 설계
- httpx 라이브러리 도입을 통한 Native Async HTTP 요청 처리 체계 구축
- asyncio.Semaphore를 적용하여 Upstream API Rate Limit 및 포트 자원 고갈 방지를 위한 Concurrency 제어 로직 구현
- Blocking 함수 호출 시 Event Loop 전체가 정지되는 현상을 방지하기 위해 전용 Async 라이브러리 사용 및 run_in_executor 전략 수립
실천 포인트
- Coroutine 내부에서 requests.get과 같은 Synchronous Blocking 함수 호출 여부 확인 - 대규모 동시 요청 시 서버 부하 방지를 위한 asyncio.Semaphore 설정 검토 - I/O 대기 시간이 긴 서비스의 경우 CPU 사용률이 낮더라도 Network I/O 병목 가능성 분석