본문 바로가기
1. 개발/1.8. ActiveMQ

'Consumer Window Size'와 네트워크 대역폭의 관계는?

by 엉짱 2026. 3. 20.
반응형

"Consumer Window Size"와 네트워크 대역폭의 관계는?

엔터프라이즈 메시징 시스템을 설계할 때 초보 엔지니어들이 흔히 하는 오해가 있습니다. 컨슈머(Consumer)가 큐(Queue)에서 메시지를 하나씩 '당겨온다(Pull)'고 생각하는 것입니다. 하지만 실제 고성능 메시지 브로커(ActiveMQ, Artemis 등)의 기본 동작 방식은 브로커가 컨슈머에게 메시지를 뭉치로 '밀어내는(Push)' 방식입니다.

이때 브로커가 컨슈머의 응답(ACK)을 기다리지 않고, 네트워크 파이프라인을 통해 연속적으로 밀어 넣을 수 있는 최대 데이터의 양을 Consumer Window Size(컨슈머 윈도우 크기, 또는 Prefetch Size)라고 부릅니다. 이 설정값은 단순한 메모리 제어 도구를 넘어, 시스템의 네트워크 대역폭(Bandwidth) 활용률과 전체 처리량(Throughput)을 결정짓는 가장 핵심적인 튜닝 포인트입니다.

이 가이드에서는 Consumer Window Size가 네트워크 대역폭 효율성에 미치는 영향과, 아키텍처에 맞는 최적의 튜닝 전략을 상세히 분석합니다.


1. Consumer Window Size의 네트워크 파이프라이닝 원리

네트워크 통신에서 가장 큰 낭비는 데이터를 보내고 확인 응답(ACK)이 올 때까지 아무것도 하지 않고 기다리는 시간(네트워크 지연, Latency)입니다.

  • 윈도우 크기가 적용된 상태: 컨슈머가 브로커에 연결될 때 특정 크기(예: 1MB 또는 메시지 1,000개)의 윈도우를 할당받습니다. 브로커는 컨슈머의 로컬 버퍼가 윈도우 크기에 도달할 때까지 네트워크를 통해 메시지를 쉴 새 없이 스트리밍합니다.
  • ACK와 윈도우 슬라이딩: 컨슈머가 로컬 버퍼에 쌓인 메시지를 처리하고 브로커로 ACK를 보내면, 브로커는 그만큼 윈도우 공간이 비었다고 판단하고 즉시 다음 메시지들을 네트워크로 쏘아 보냅니다.

이러한 메커니즘을 통해 네트워크 파이프라인은 텅 비지 않고 항상 데이터로 가득 찬 상태를 유지하게 됩니다.


2. Window Size와 네트워크 대역폭의 3가지 상관관계 시나리오

윈도우 크기를 어떻게 설정하느냐에 따라 네트워크 대역폭의 활용 양상은 극단적으로 달라집니다.

A. Window Size가 0이거나 극단적으로 작을 때 (대역폭 낭비)

윈도우 크기를 0으로 설정하면, 컨슈머는 메시지 1개를 처리하고 ACK를 보낼 때까지 브로커로부터 다음 메시지를 받지 못합니다. (Stop-and-Wait 방식)

  • 결과: 10Gbps의 초고속 네트워크망을 갖추고 있더라도, 데이터 전송보다 네트워크 왕복 지연 시간(RTT)을 기다리는 데 대부분의 시간을 허비합니다. 대역폭 활용률이 바닥으로 곤두박질치며, 시스템 전체의 초당 처리량(TPS)이 극심하게 저하됩니다.

B. Window Size가 적절할 때 (대역폭 최적화)

네트워크 파이프라인의 물리적인 용량과 지연 시간을 커버할 수 있을 만큼 충분한 윈도우 크기를 부여한 상태입니다.

  • 결과: 브로커가 보내는 데이터의 흐름과 컨슈머가 처리하며 보내는 ACK의 흐름이 끊기지 않고 톱니바퀴처럼 맞물려 돌아갑니다. 네트워크 대역폭을 100%에 가깝게 활용할 수 있으며, 시스템이 낼 수 있는 최대의 Throughput을 달성합니다.

C. Window Size가 과도하게 클 때 (대역폭 독점 및 분산 처리 실패)

성능을 높이겠다고 윈도우 크기를 무제한으로 열어두면 또 다른 형태의 장애가 발생합니다.

  • 네트워크 스파이크: 브로커가 큐에 쌓인 수만 개의 메시지를 한 번에 네트워크로 쏟아내면서 순간적인 네트워크 대역폭 폭주(Spike)를 일으켜 다른 서비스의 통신을 방해할 수 있습니다.
  • 메모리 고갈 (OOM): 컨슈머의 로컬 메모리에 너무 많은 메시지가 쌓여 JVM 힙 메모리가 고갈됩니다.
  • 로드 밸런싱 붕괴: 여러 대의 컨슈머 워커(Worker)가 큐를 공유할 때, 가장 먼저 연결된 컨슈머 하나가 거대한 윈도우 크기를 무기로 큐의 모든 메시지를 자신의 로컬 버퍼로 싹쓸이해 버립니다. 다른 컨슈머들은 놀고 있는데 한 대의 컨슈머만 압사당하는 '시끄러운 이웃(Noisy Neighbor)' 문제가 발생합니다.

3. 브로커별 구현 방식의 차이 (Classic vs Artemis)

아키텍처 설계 시 주의해야 할 점은 브로커의 세대별로 윈도우 크기를 통제하는 기준이 다르다는 것입니다.

  • ActiveMQ Classic (prefetchSize): 바이트(Byte) 크기가 아니라 '메시지의 개수'를 기준으로 동작합니다. 1,000개로 설정했을 때, 메시지 1개의 크기가 1KB라면 1MB의 메모리와 대역폭을 차지하지만, 1개의 크기가 10MB라면 순간적으로 10GB의 데이터를 네트워크로 쏟아내어 치명적인 장애를 유발합니다. 메시지 크기가 들쭉날쭉한 환경에서는 제어하기가 매우 까다롭습니다.
  • ActiveMQ Artemis (consumerWindowSize): 개수가 아닌 '바이트(Byte) 크기'를 기준으로 동작합니다. 윈도우를 1MB로 설정하면, 1KB 메시지든 10MB 메시지든 정확히 메모리와 대역폭의 물리적 한계 내에서만 데이터를 밀어냅니다. 네트워크 대역폭을 훨씬 안정적이고 예측 가능하게 통제할 수 있습니다.

4. 아키텍처 환경에 따른 최적화 튜닝 가이드

최적의 Consumer Window Size는 정해진 정답이 없으며, 비즈니스 워크로드의 특성에 따라 다르게 설정해야 합니다.

  1. 고속 로그 수집 및 단순 데이터 파이프라인:
  • 특징: 메시지 처리(DB 저장 등) 시간이 매우 짧고, 무조건 많은 데이터를 빨리 옮기는 것이 최우선인 환경.
  • 설정: 윈도우 크기를 크게(수 MB ~ 수십 MB) 설정하여 네트워크 대역폭을 한계치까지 활용하도록 파이프라이닝을 극대화합니다.
  1. 무거운 비즈니스 로직 및 동영상 인코딩 작업:
  • 특징: 메시지 1개를 처리하는 데 수 초에서 수 분이 걸리는 환경.
  • 설정: 윈도우 크기를 1 (또는 매우 작게)로 설정해야 합니다. 대역폭 활용도는 떨어지지만, 무거운 작업을 특정 워커가 독점하지 않고 유휴 상태인 다른 워커들에게 공평하게 분배(Fair Dispatching)하는 것이 시스템 전체 안정성에 훨씬 중요하기 때문입니다.
  1. 지리적으로 분산된 클라우드 환경 (Multi-Region):
  • 특징: 브로커는 서울 리전에 있고 컨슈머는 미국 리전에 있어 네트워크 지연 시간(RTT)이 매우 긴 환경.
  • 설정: 지연 시간이 길수록 네트워크 파이프라인의 물리적 거리가 멀다는 뜻이므로, 중간에 데이터가 비지 않도록 윈도우 크기를 로컬 환경보다 훨씬 크게 늘려주어야 대역폭 손실을 막을 수 있습니다.

5. 결론

Consumer Window Size는 브로커와 클라이언트 사이의 네트워크 대역폭이라는 파이프의 밸브를 조절하는 역할을 합니다.

밸브를 너무 조금 열면 물(데이터)이 졸졸 흘러 답답하고, 너무 확 열면 수압(메모리와 로드 밸런싱)을 견디지 못하고 파이프가 터지게 됩니다. 시스템이 다루는 메시지의 평균 크기, 비즈니스 로직의 처리 시간, 그리고 네트워크의 물리적 지연 시간을 종합적으로 고려하여 이 밸브를 세밀하게 조율하는 것이 고성능 메시징 아키텍처의 완성입니다.

반응형