Python 비동기 처리 성능 개선 - asyncio와 aiohttp
문제 상황
레거시 API 서버가 외부 결제/알림 서비스를 순차적으로 호출하면서 응답 시간이 3초 이상 걸렸다. requests 라이브러리로 동기 방식으로 처리하고 있었고, 각 외부 API 호출마다 0.5~1초씩 소요되었다.
import requests
def process_order(order_id):
# 결제 API 호출
payment = requests.post(PAYMENT_API, json=data)
# 알림 API 호출
notification = requests.post(NOTIFICATION_API, json=data)
# 재고 API 호출
inventory = requests.post(INVENTORY_API, json=data)
return result
해결 방법
asyncio와 aiohttp를 사용해 비동기 처리로 전환했다. Python 3.7부터 async/await 문법이 안정화되어 프로덕션에 적용하기에 무리가 없다고 판단했다.
import asyncio
import aiohttp
async def call_api(session, url, data):
async with session.post(url, json=data) as response:
return await response.json()
async def process_order(order_id):
async with aiohttp.ClientSession() as session:
tasks = [
call_api(session, PAYMENT_API, payment_data),
call_api(session, NOTIFICATION_API, noti_data),
call_api(session, INVENTORY_API, inv_data)
]
results = await asyncio.gather(*tasks)
return results
결과
3개의 외부 API 호출이 병렬로 처리되면서 응답 시간이 1초 내외로 줄었다. 다만 Flask에서 asyncio를 사용하려니 제약이 있어서, 새 프로젝트에서는 FastAPI나 aiohttp 기반 프레임워크 도입을 검토 중이다.
에러 핸들링과 타임아웃 설정이 동기 방식보다 까다로웠지만, 트래픽이 많은 구간에서는 성능 개선 효과가 확실했다.