RabbitMQ

[RabbitMQ] 기초 개념 - 2 (Work queues)

zamezzz 2022. 4. 8. 10:58

첫 번째 포스팅에서는 하나의 Producer가 하나의 Consumer에게 메시지를 전달하는 형태에 대해 정리했습니다.

이번에는 하나의 Producer가 여러개의 Consumer에게 메시지를 전달하는 형태에 대해 정리 하겠습니다.

Round-robin dispatching


Queue는 병렬화 할 수 있다는 장점이 있습니다.
즉, 같은 Queue의 Consumer에게 메시지를 균등 분배 할 수 있습니다.
또한 Consumer 갯수를 계속 추가하면서 쉽게 수평 확장이 가능합니다.
이 방식에서 모든 Consumer는 평균적으로 동일한 수의 메시지를 처리합니다.

 

Message acknowledgment


특정 처리를 하다가 Consumer가 하나 죽으면, 해당 Consumer가 처리하던 메시지를 잃게됩니다..

이를 방지하기 위해 ack를 활용합니다. 
consumer가 ack를 보내면 메시지 처리가 완료되었다는 뜻이며, ack를 보내지 않고 consumer가 죽으면 RabbitMQ는 메시지가 처리되지 않았다는 것을 인지하고 다시 대기열에 넣습니다. 그리고 이후 다시 처리됩니다.

 

Message durability


특정 Consumer가 아니라 RabbitMQ 자체가 죽을 경우도 있습니다.
이때의 손실을 방지하는 방법도 물론 있다고 합니다.
queue 또는 메시지에 durable을 표시하는 방법인데, 공식문서의 예제를 보면 다음과 같습니다.

- Queue

boolean durable = true;
channel.queueDeclare("hello", durable, false, false, null);



- 메시지

channel.basicPublish("", "task_queue", MessageProperties.PERSISTENT_TEXT_PLAIN, message.getBytes());

 

Fair dispatch


처리하는 메시지의 처리 난이도에 따라 특정 Consumer만 바쁘게 처리될 수 있습니다.
쉬운 처리만 하는 Consumer는 놀고, 어려운 처리만 하는 Consumer는 바쁠 수 있기 때문입니다.

이를 해결하기 위해 다음 메서드 사용합니다.

int prefetchCount = 1;
channel.basicQos(prefetchCount);


해당 메서드의 의미는 RabbitMQ에게 한번에 한명 이상의 작업자에게 메시지를 보내지 말라고 전달하는 것이며,
이전 메시지를 처리하고 승인 할 떄까지 작업자에게 새 메시지를 발송하지 않고 아직 바쁘지않은 다음 작업자에게 전달합니다.

 

 

반응형

'RabbitMQ' 카테고리의 다른 글

[RabbitMQ] Exchange Type  (0) 2022.05.18
[RabbitMQ] 기초 개념 - 5 (Topic)  (0) 2022.05.16
[RabbitMQ] 기초 개념 - 4 (Routing)  (0) 2022.05.16
[RabbitMQ] 기초 개념 - 3 (Pub/Sub)  (0) 2022.04.12
[RabbitMQ] 기초 개념 - 1  (0) 2022.04.01