[AI] 여러 인스턴스에서 Gemini API 요청이 동시에 나가면, NAT 게이트웨이에서 병목이 발생하지 않을까? - 100-hours-a-week/5-yeosa-wiki GitHub Wiki

1. 문제 제기

[ "여러 인스턴스에서 Gemini API 요청이 동시에 나가면, NAT 게이트웨이에서 병목이 발생하지 않을까?" ]

  • 처음에는 NAT가 마치 하나의 출구로 모든 요청을 모아서 처리하는 구조처럼 느껴졌고,
  • 그래서 메시지 큐를 도입해서 요청을 순차적으로 조절해야 하는 게 아닐까? 하는 의심이 생겼다.

2. 학습 내용

a. NAT는 외부 요청을 한 군데서 처리하지 않는다

  • GCP Cloud NAT는 중앙 처리 장치처럼 보이지만, 실제로는

    각 외부 연결(요청)마다 개별 NAT 세션이 생성된다.

  • 즉, 요청이 몰려도 병목이 생기지 않도록 설계된 병렬 구조이며,

    NAT는 단순히 포트 매핑만 처리하는 네트워크 경로일 뿐이다.

    • NAT는 하나의 파이프라인이 아니라, 동시 연결에 대응 가능한 분산 라우터처럼 동작한다.

b. NAT 병목은 메시지 큐로 관리할 문제가 아니다

  • 메시지 큐는 애플리케이션 계층에서 작업 순서, 동시성, 비동기 처리량을 제어하는 도구다
  • NAT 병목은 다음과 같은 상황에서 발생할 수 있다:
    • 동시에 너무 많은 외부 연결이 생기고
    • NAT 포트(= 연결 수)가 포화 상태가 되며
    • 연결을 맺을 수 없게 되는 경우
  • 그러나 이건 애플리케이션 로직의 흐름 제어 문제가 아니며, 메시지 큐가 개입할 수 있는 구조도 아니다.

c. 대신 관리해야 하는 것: "외부 연결 수" → NAT 포트 소진 방지

  • GCP NAT는 한 외부 IP당 약 64,000개의 포트를 제공
  • 동시에 연결되는 커넥션이 많으면 NAT 세션이 부족해질 수 있음
  • 따라서 NAT 병목 예방을 위한 핵심은:
    • 연결 수 줄이기
    • 포트 수 늘리기
    • 재사용 가능한 구조로 바꾸기

d. Connection Pool: NAT 병목을 완화하는 도구

  • Connection Pool은 애플리케이션 계층에서 동작하며
  • 동일 서버에 대한 연결을 재사용함으로써
    • 새로운 NAT 세션 생성 횟수를 줄이고
    • 포트 소모도 줄임
  • 설정 예: pool_maxsize=100 → 최대 100개 연결을 돌려가며 사용
  • Pool을 도입하면 NAT 포트 사용을 최적화할 수 있다
    • 단, pool 크기보다 요청이 많아지면 일시적인 대기(지연) 발생 가능

e. Connection Pool 병목도 메시지 큐로 관리할 문제는 아니다

  • Pool 병목은 “연결이 부족해서 기다리는 상황”
  • 이는 pool_maxsize 설정만으로 해결할 수 있으며
  • 메시지 큐는 해당 연결 로직에 관여하지 않음
  • 애플리케이션 계층에서 해결할 문제,
    • 메시지 큐는 여기에서도 역할이 없다

3. 최종 요약

구분 병목 원인 해결 방법 메시지 큐와의 관계
NAT 병목 포트 부족 (연결 수 과다) 포트 확장, 연결 수 제한 ❌ 무관
Connection Pool 병목 재사용 연결 부족 Pool 크기 조정 ❌ 무관
메시지 큐 병목 태스크 폭주 / 처리 순서 Worker 수 조절 ✅ 큐에 해당
  • NAT 병목을 우려해서 메시지 큐를 도입할 필요는 없다.

    NAT는 연결 수에 민감하며, 그 관리는 커넥션 재사용과 처리량 제한으로 대응하는 게 맞다.