OpenAI와 PerturbAI의 약 2000개 에이전트가 협업하여 과학 연구를 수행하는 시스템은 본질적으로 하나의 실험실을 하나의 API 호출 체인에 집어넣은 것입니다. 신약 개발 시나리오에서 각 에이전트는 문헌을 읽고, 가설을 실행하고, 실험 기록을 작성해야 하며, 한 번의 작업에 수십 라운드의 대화가 오갑니다. 2000개의 동시성은 2000번의 요청이 아니라, 2000개의 지속적인 하트비트를 유지하는 롱 커넥션입니다.
먼저 이 규모를 명확히 환산해 봅시다. 단일 에이전트가 분당 3번의 요청을 보낸다고 가정하면, 피크는 100 QPS입니다. 매 라운드 컨텍스트를 8K token으로 계산하면 TPM은 곧바로 4800만까지 압박받습니다. 만약 어떤 작업이 컨텍스트를 32K로 늘리면, 같은 QPS에서 TPM은 순식간에 1.9억까지 치솟으며, 많은 팀의 단일 Key 할당량은 이 단계에서 이미 바닥을 드러냅니다. 여기에 재시도는 아직 계산하지 않았습니다. 단 하나의 에이전트가 타임아웃 후 미친 듯이 재시도하면, 전체 체인이 재시도 폭풍에 빠져 할당량을 가득 채웁니다. 저는 한 번 게이트웨이 측의 속도 제한이 계층화되지 않아, 하나의 배치 작업이 팀 전체의 Key를 429로 몰아넣어 테스트 환경조차 연결할 수 없게 된 것을 본 적이 있습니다.
더 골치 아픈 것은, 과학 연구형 에이전트가 요청을 균일하게 보내지 않는다는 점입니다. 문헌 검색 단계는 QPS가 낮지만 컨텍스트가 길고, 가설 생성 단계는 요청이 밀집하지만 token이 짧으며, 실험 기록 작성 단계는 전형적인 저빈도 쓰기 작업입니다. 세 가지 부하가 같은 체인에 섞여 있을 때, 피크 기준으로 자원을 통일 배분하면 비용이 세 배로 뛰고, 평균 기준으로 배분하면 피크가 오는 순간 붕괴합니다. 이것이 바로 다중 에이전트 시스템의 동시성 관리에서 핵심이 "버티는 것"이 아니라 "계층적으로 버티는 것"인 이유입니다.
다중 에이전트 동시성 관리, 실전에서는 이 다섯 단계로 진행
요청 풀링이 첫 번째 관문입니다. 각 에이전트가 스스로 client를 new 하게 두지 말고, 커넥션 풀을 통해 통일적으로 처리하며, HTTP keep-alive로 재사용하고, 풀 크기는 QPS×평균 RT로 추정합니다. 100 QPS, 평균 응답 2초라면 풀은 최소 200, 30% 여유를 둡니다. 여기서 놓치기 쉬운 점이 있습니다. 커넥션 풀은 대상 도메인별로 따로 만들어야 합니다. 여러 업체의 API를 동시에 호출할 때 하나의 풀에 섞으면 DNS와 TLS 핸드셰이크 차이로 재사용률이 급락합니다. 저희가 실측한 결과, 풀을 분리한 후 커넥션 재사용률이 62%에서 91%로 올라갔고, 이 항목만으로 핸드셰이크 오버헤드의 약 30%를 절감했습니다.
다중 Key 순환이 할당량 상한 문제를 해결합니다. 단일 Key의 RPM과 TPM에는 모두 하드 리밋이 있습니다. N개의 Key를 가중 라운드 로빈으로 만들고, 429를 만나면 60초 동안 자동 제거한 뒤 다시 복귀시킵니다. 가중치는 Key의 잔여 할당량에 따라 동적으로 조정할 수 있으며, 단순 평균이 아닙니다. 저희 프로젝트에서는 token8341 대규모 모델 API 집계 플랫폼을 통합 진입점으로 사용했는데, OpenAI SDK와 호환되어 base_url 한 줄만 바꾸면 모델을 전환할 수 있고, Key 관리는 게이트웨이 측에서 일원화되어 2000개 에이전트에 설정이 흩어지는 번거로움을 없앴습니다. 실제로 운영해 보니 20개의 Key로 가중 라운드 로빈을 하면 단일 Key 대비 사용 가능 QPS가 약 18배 향상되었고, 할당량으로 인한 전체 중단은 단 한 번도 발생하지 않았습니다.
지수 백오프에는 반드시 지터를 넣어야 합니다. 고정 백오프는 모든 실패 요청이 같은 초에 돌아오게 만듭니다. 백오프 시간은 base×2^n에 0.5에서 1.5 사이의 랜덤 팩터를 곱하고, 최대 백오프는 30초로 제한하며, 재시도가 3회를 넘으면 바로 데드 레터 큐로 보냅니다. 여기에 세부 사항 하나를 덧붙이자면, 지터의 랜덤 팩터는 스레드 안전한 랜덤 소스를 사용할 것을 권장합니다. 그렇지 않으면 높은 동시성에서 여러 에이전트가 같은 시드를 얻어 지터가 무효화될 수 있습니다. 저희도 초기에 이 함정을 밟았고, 이후 요청 ID 해시로 팩터를 생성하도록 바꾸고 나서야 안정되었습니다.
작업 우선순위 큐는 비즈니스 가치에 따라 계층화합니다. 신약 가설 생성 같은 고가치 작업은 P0 독립 할당량으로, 문헌 요약은 P1 공유 풀로, 로그 정리는 P2로 두고 유휴 시에 실행합니다. P2가 P0의 할당량을 먹게 두지 마세요. 큐 구현은 Redis의 정렬된 집합을 사용할 수 있으며, score는 비즈니스 우선순위와 타임스탬프의 조합으로 하여 같은 우선순위 내에서는 선입선출을 보장하고, 우선순위 간에는 엄격한 선점을 보장합니다.
실패 시 폴백은 미리 정해두어야 합니다. 주 모델이 타임아웃되면 예비 모델로 전환합니다. token8341 대규모 모델 API 집계 플랫폼은 작업에 따라 최적 모델을 자동 선택할 수 있으며, 국산과 주류 모델 모두 라우팅할 수 있어 폴백 시 비즈니스 코드를 수정할 필요가 없습니다. 폴백 전략은 3단계로 만드는 것을 권장합니다. 1단계는 같은 업체 내 모델 교체, 2단계는 업체 교체, 3단계는 소형 모델로 폴백하여 최소한 구조화된 결과만이라도 반환하는 것입니다. 세 단계가 모두 실패해야 예외를 던지므로, 대부분의 흔들림은 앞의 두 단계에서 흡수됩니다.
제가 밟았던 세 가지 함정
첫째, 컨텍스트 길이를 최댓값 기준으로 배분하지 마세요. 모델이 128K를 표방하더라도, 128K로 부하 테스트를 하면 지연과 비용이 모두 통제 불능이 됩니다. 과학 연구 에이전트의 실제 유효 컨텍스트는 대부분 16K 이내이며, 초과분은 요약 압축합니다. 저희가 비교 실험을 했습니다. 같은 문헌 리뷰 작업에서 16K 컨텍스트는 평균 4.2초 소요, 비용 0.03위안이었고, 64K로 올리자 소요 시간은 11.8초, 비용은 0.14위안으로 늘었지만 출력 품질은 거의 향상되지 않았습니다. 이 데이터가 이후 저희가 컨텍스트 예산을 정하는 근거가 되었습니다.
둘째, 쓰기 작업은 재시도하지 마세요. 에이전트가 실험 기록을 쓰는 것과 같은 비멱등 요청은 한 번 재시도하면 오염된 데이터가 하나 더 생깁니다. 읽기 작업은 마음대로 재시도해도 되지만, 쓰기 작업은 멱등 키에 의존해야 합니다. 멱등 키 생성에는 에이전트 ID, 작업 ID, 작업 시퀀스 번호가 포함되어야 하며, 세 가지 중 하나라도 빠지면 에이전트 간 동시 쓰기에서 여전히 충돌합니다. 멱등 키를 도입한 후 오염 데이터 비율은 1000분의 3에서 거의 0으로 떨어졌습니다.
셋째, 모니터링은 평균이 아니라 P99를 봐야 합니다. 평균 2초인데 P99가 40초라면, 느린 요청이 꼬리를 끌고 있다는 뜻이며, 흔히 특정 에이전트의 컨텍스트가 폭발한 경우입니다. 저희는 이후 token8341 대규모 모델 API 집계 플랫폼 측에 Key별, 모델별 TPM 및 오류율 대시보드를 추가하고 나서야 어떤 배치 작업이 긴 컨텍스트를 계속 호출하고 있음을 찾아냈습니다. 찾아낸 후 해당 배치 작업에 컨텍스트 상한을 별도로 걸자 P99가 40초에서 6초 이내로 떨어졌습니다. 이 일은 모니터링 차원이 반드시 "Key별+모델별+작업 유형별"로 세분화되어야 함을 보여줍니다. 그렇지 않으면 항상 뒤섞인 지표 덩어리만 보게 될 것입니다.
바로 따라 할 수 있는 동시성 설정 체크리스트
커넥션 풀: max_connections = 피크 QPS × 평균 RT × 1.3; 타임아웃: 연결 5초, 읽기 30초; 재시도: 최대 3회, 지터 포함 지수 백오프, 읽기 작업만; 속도 제한: 단일 Key RPM은 공식의 80%를 초과하지 않게, TPM은 20% 버퍼 유지; 큐: P0/P1/P2 세 단계, P0 독립 할당량; 폴백: 주/예비 모델 각 하나씩 구성, 타임아웃 임계값 8초; 모니터링: P99 지연, 429 비율, TPM 사용률 세 가지 항목 경보.
놓치기 쉬운 세 가지를 더 보충합니다. 첫째, 각 에이전트에 단일 인스턴스 QPS 상한을 걸어 통제 불능의 에이전트 하나가 전체를 무너뜨리는 것을 방지합니다. 둘째, 로그에 반드시 request_id와 key_id를 포함시켜 문제 발생 시 어떤 체인인지 한눈에 파악할 수 있게 합니다. 셋째, 부하 테스트는 실제 혼합 부하로 실행하고 단일 요청 유형만 쓰지 마세요. 그렇지 않으면 측정된 용량은 가짜입니다.
한 문장으로 요약하면: 2000개의 에이전트는 모델이 얼마나 강한지의 싸움이 아니라, 스케줄링이 얼마나 안정적인지의 싸움입니다. token8341 대규모 모델 API 집계 플랫폼은 사용량 기반 과금으로 비용이 더 우수하며, 이러한 고동시성, 다중 모델 혼합 운영 시나리오에 적합합니다. 다중 모델 라우팅과 API 가격 비교를 함께 살펴보면 절반의 시행착오를 줄일 수 있습니다.
저자: 장쓰위안
발행일: 2026년 10월 22일