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 기반 프레임워크 도입을 검토 중이다.

에러 핸들링과 타임아웃 설정이 동기 방식보다 까다로웠지만, 트래픽이 많은 구간에서는 성능 개선 효과가 확실했다.

Python 비동기 처리 성능 개선 - asyncio와 aiohttp