SDK 는 동기식 OpenAI() 와 비동기식 AsyncOpenAI() client 를 제공해. 둘 다 내부의 httpx connection pool 을 재사용하도록 만들어졌어. app 이 시작할 때 process 마다 하나를 만들고 종료할 때까지 함께 써. 호출할 때마다 새 client 를 만드는 건 눈에 잘 띄지 않는 성능 버그야.
왜 process 마다 하나일까?
OpenAI() 를 새로 만들 때마다 httpx client 와 connection pool 도 새로 생겨. 요청마다 만들고 버리면 TLS handshake 를 계속 되풀이하고 keep-alive 와 pooling 의 이점을 잃어. 부하가 늘면 긴 꼬리 지연과 connection 한도 경고로 나타나.
async framework 에서는 AsyncOpenAI
sync client 는 event loop 를 막아. FastAPI, Starlette, aiohttp 안에서는 AsyncOpenAI() 를 사용해. async handler 에 sync 호출을 섞으면 서버 전체가 느려질 수 있어.
한 호출만 설정을 바꾸는 법
특정 호출에만 다른 timeout 이나 재시도 횟수가 필요하다면 client.with_options(max_retries=5, timeout=120.0).chat.completions.create(...) 를 써. connection pool 은 그대로 재사용하면서 그 호출의 설정만 바꿀 수 있어.