컨슈머 프리패치
컨슈머 프리패치 (Consumer Prefetch)
컨슈머 프리패치는 채널 프리패치 메커니즘을 확장한 개념이에요. 컨슈밍할 때 채널(또는 연결)의 미확인(unacknowledged) 메시지 수를 제한하기 위해 AMQP 0-9-1은 basic.qos 메서드를 제공해요. 이 값을 "프리패치 카운트(prefetch count)"라고 불러요.
채널 스코프의 한계
문제는 채널이 프리패치를 적용하기에 이상적인 스코프가 아니라는 점이에요. 채널 하나가 여러 큐에서 컨슘할 수 있기 때문에, 한도 초과를 막으려면 보내는 모든 메시지마다 채널과 큐가 서로 조율해야 해요. 이는 단일 머신에서도 느리고, 클러스터의 여러 노드에 걸쳐 컨슘하면 더욱 느려져요.
게다가 많은 용도에서는 컨슈머 하나마다 적용되는 프리패치 카운트를 지정하는 것이 더 자연스러워요. 그래서 RabbitMQ는 채널 위 여러 컨슈머에 프리패치가 적용되는 방식에서 AMQP 0-9-1 스펙을 조금 다르게 해석해요.
| AMQP 0-9-1에서의 prefetch_count 의미 | RabbitMQ에서의 prefetch_count 의미 |
|---|---|
| 채널의 모든 컨슈머에 공유 | 채널의 각 새 컨슈머에 개별 적용 |
단일 컨슈머 예시
아래 Java 예시는 한 번에 최대 10개의 미확인 메시지를 받도록 설정해요.
Channel channel = ...;
Consumer consumer = ...;
channel.basicQos(10); // 컨슈머당 한도
channel.basicConsume("my-queue", false, consumer);
0 값은 컨슈머가 미확인 메시지 수에 제한을 받지 않는다는 뜻이에요. 이렇게 컨슈머 단위로 프리패치를 지정하면, 한 채널에서 여러 큐를 컨슘해도 각 컨슈머가 독립적인 한도를 유지할 수 있어요. 프리패치 값을 잘 정하면 컨슘 처리량과 메모리 사용 사이의 균형을 잡을 수 있어요.