들어가며: 왜 지금 멀티 에이전트 아키텍처인가?

스포티파이가 광고 플랫폼을 멀티 에이전트 아키텍처로 재구축했다는 소식은 단순한 기술 업그레이드 이상의 의미를 갖습니다. 이는 AI 에이전트 시대에 맞춰 인프라 자체를 재설계한 사례이기 때문입니다.

Cloudflare의 Browser Run 팀은 기존 Browser Isolation(BISO)과의 인프라 공유에서 발생하던 여러 문제를 해결하기 위해 Durable Object(DO) 기반 Containers로의 전면 마이그레이션을 단행했습니다. 이 글에서는 그 결정의 배경, 구체적인 아키텍처 변화, 그리고 실무에서 얻을 수 있는 교훈을 살펴보겠습니다.

본 사례의 원문은 Cloudflare 블로그에서 확인할 수 있습니다.

Cloudflare server infrastructure with multiple browser containers running globally Technical Structure Concept

아키텍처 변화의 핵심: Containers 도입과 리전별 풀 전략

1. 기존 아키텍처의 한계

BISO와의 공유 인프라는 다음과 같은 문제를 안고 있었습니다.

  • 느린 컨테이너 이미지: BISO의 큰 이미지 크기로 인해 시작 시간이 길어짐
  • 글로벌 분산 부족: 최적의 리전에 브라우저가 배치되지 않아 레이턴시 증가
  • 사용 패턴 충돌: BISO의 긴 세션과 Browser Run의 짧고 폭발적인 사용 패턴이 맞지 않아 스케일링 병목 발생

2. Containers로의 점진적 마이그레이션

Cloudflare 팀은 Worker를 요청 경로에 삽입하여 일부 사용자에게만 Container 기반 브라우저를 제공하는 방식으로 점진적 전환을 시작했습니다. 이는 A/B 테스트 성격의 안전한 접근법이었습니다.

3. 리전별 프리워밍 풀 (Pre-warmed Pools)

DO와 Container 간의 지리적 거리 문제를 해결하기 위해 리전별로 미리 워밍된 브라우저 풀을 구성했습니다.

# 의사 코드: 리전별 풀에서 가장 가까운 브라우저 할당
def assign_browser(user_region):
    # 리전별 DO-Container 쌍 중 최저 레이턴시 선택
    best_pair = min(
        region_pools[user_region],
        key=lambda pair: latency(user_region, pair.do) + latency(pair.do, pair.container)
    )
    return best_pair.container

이 전략 덕분에 사용자 → DO, DO → Container 두 구간 모두에서 레이턴시를 최소화할 수 있었습니다.

Diagram of multi-agent architecture with Durable Objects and regional container pools Software Concept Art

실시간 상태 관리: KV에서 D1 + Queues로의 전환

초기에는 Workers KV를 사용해 컨테이너 상태를 저장했지만, KV의 결과적 일관성(최소 30초 캐시 TTL) 이 치명적인 병목이 되었습니다.

"KV에서 컨테이너를 'available'로 읽었지만, 실제로 라우팅할 때는 이미 할당된 상태인 경쟁 조건(Race Condition)이 발생"

해결책: D1 + Queues

D1의 트랜잭션 특성을 활용해 원자적 할당을 보장했습니다.

-- 브라우저 획득 쿼리 (의사 코드)
WITH candidate_pool AS (
    -- 레이턴시 기반 후보 풀 선정
)
UPDATE containers
SET status = 'picked'
WHERE sessionId IN (
    SELECT sessionId
    FROM candidate_pool
    ORDER BY RANDOM()
    LIMIT ?5
)
RETURNING data

배치 쓰기(100행 배치) 를 통해 P95 쓰기 시간 0.1ms를 달성했으며, Queue를 이용한 비동기 상태 업데이트로 지연 시간 2초 미만을 유지했습니다.

{
  "queues": {
    "consumers": [
      {
        "queue": "production-core-containers-queue-weur",
        "max_batch_size": 100,
        "max_batch_timeout": 1,
        "max_retries": 1
      }
    ]
  }
}

한국 개발 생태계에서의 적용 맥락

국내 SI/스타트업 환경에서도 실시간 상태 공유가 필요한 서비스 (예: 실시간 채팅, 협업 툴, 게임 서버)에서 유사한 패턴을 적용할 수 있습니다. 특히 KV 대신 RDBMS(MySQL, PostgreSQL)의 트랜잭션을 활용하거나, Redis Streams + 배치 처리 조합으로 대체할 수 있습니다.

Performance comparison chart showing latency improvements after migration to Cloudflare Containers Developer Related Image

결론: 멀티 에이전트 아키텍처의 교훈

Cloudflare Browser Run 사례는 다음과 같은 핵심 인사이트를 제공합니다.

  1. 점진적 전환(A/B 테스트) 이 대규모 마이그레이션의 리스크를 줄인다.
  2. 지리적 분산 아키텍처에서는 리전별 프리워밍 풀이 레이턴시 해결의 핵심이다.
  3. 실시간 상태 관리는 결과적 일관성보다 트랜잭션 기반 접근이 더 적합할 수 있다.
  4. Customer Zero 전략(자사 제품을 먼저 사용)은 제품 품질 향상에 큰 도움이 된다.

다음 단계 학습 방향

이 기술의 한계 및 주의사항

  • 초기 Containers 플랫폼은 문서화와 관측성이 부족하여 초기 학습 비용이 높습니다.
  • Queue 백로그로 인한 상태 지연 가능성이 있으며, 이에 대한 fallback 전략(백업 리전)이 필수적입니다.
  • 모든 서비스에 이 아키텍처가 적합한 것은 아닙니다. 트래픽 패턴이 짧고 폭발적인 경우에 특히 효과적입니다.
본 콘텐츠는 신뢰할 수 있는 출처를 바탕으로 AI 도구를 활용하여 초안이 작성되었으며, 편집자의 검토를 거쳐 발행되었습니다. 전문가의 조언을 대체하지 않습니다.