피드로 돌아가기
Dev.toBackend
원문 읽기
asyncio 도입을 통한 API 호출 시간 660초에서 14초로 단축
How I Boosted Concurrency 40x with asyncio — and Ops Thought We Were DDoSed
AI 요약
Context
200개의 Third-party API를 순차적으로 호출하는 Synchronous 구조로 인해 전체 실행 시간이 11분에 달하는 성능 병목 발생. I/O 대기 시간 동안 CPU 리소스가 유휴 상태로 방치되는 비효율적 아키텍처의 한계 직면.
Technical Solution
- Single-threaded Event Loop 기반의 asyncio 도입을 통한 I/O-bound 워크로드 최적화
- asyncio.gather를 활용해 200개 엔드포인트 요청을 동시 실행하여 전체 소요 시간을 최장 응답 시간 수준으로 단축
- asyncio.Semaphore를 통한 동시성 제어로 Upstream Gateway의 Rate Limit 초과(429 Error) 방지
- Exponential Backoff 전략과 Timeout 설정을 결합한 재시도 메커니즘 구현으로 시스템 안정성 확보
- Blocking Call을 배제하고 aiohttp 등 전용 비동기 라이브러리를 사용하여 Event Loop 정지 현상 제거
Impact
- 전체 실행 시간: 11분(660초) $\rightarrow$ 14초로 약 47배 성능 향상
- Concurrency 처리 능력 40배 이상 증폭
실천 포인트
1. Coroutine 호출 시 await 누락 여부 확인 및 RuntimeWarning 모니터링 설정
2. 비동기 함수 내부에서 requests.get과 같은 Synchronous Blocking 코드 사용 금지
3. 무제한 동시 요청 방지를 위해 Semaphore를 이용한 Concurrency Cap 설정
4. Blocking I/O 필수 사용 시 loop.run_in_executor를 통한 Thread Pool 오프로딩 검토