피드로 돌아가기
Dev.toBackend
원문 읽기
asyncio 기반 I/O 최적화로 API 요청 처리 시간 40초에서 2초로 단축
asyncio Pitfalls: The 3-Hour Bug
AI 요약
Context
동기 방식의 sequential request 구조로 인해 200개 API 호출 시 40초 이상의 높은 Latency 발생. 단일 스레드 기반의 blocking I/O 한계로 인한 CPU 리소스 낭비 및 처리 효율 저하 상황.
Technical Solution
- Single-threaded Event Loop 도입을 통한 Non-blocking Concurrency 구현
- aiohttp 라이브러리 채택으로 네트워크 I/O 대기 시간 동안 제어권을 Event Loop에 반환하는 구조 설계
- asyncio.gather를 활용한 다수 코루틴의 병렬 스케줄링으로 전체 실행 시간을 최장 요청 시간 수준으로 수렴
- Synchronous Blocking Call 제거 및 불가피한 동기 작업 발생 시 loop.run_in_executor를 통한 Thread Pool offloading 적용
- return_exceptions=True 설정을 통한 개별 태스크 예외 격리 및 전체 파이프라인의 가용성 확보
- ClientTimeout 및 Retry 로직 구현으로 네트워크 불안정성에 대응하는 복원력 강화
Impact
- 전체 API 데이터 fetch 소요 시간: 41.23s $\rightarrow$ 2s 미만으로 단축
- 처리 효율: 200개 요청의 순차 처리에서 동시 처리 구조로 전환
실천 포인트
1. async def 내부에 requests.get 같은 동기 blocking 함수 사용 여부 확인
2. asyncio.gather 사용 시 개별 태스크 실패가 전체 결과값 손실로 이어지는지 return_exceptions 옵션 검토
3. CPU bound 작업이나 legacy 동기 라이브러리 사용 시 ThreadPoolExecutor 연동 고려
4. 모든 async I/O 호출에 적절한 timeout 설정 및 재시도 메커니즘 적용 여부 점검