RabbitMQ는 Erlang으로 구현된 메세지 브로커 시스템이다.
메세지 생산자를 Producer, 메세지 소비자를 Consumer라고 한다.
생산자와 소비자 사이에는 메세지를 브로커가 존재하며, 브로커는 Exchange, Queue 등이 존재한다.
AMQP에는 네트워크나 메세지를 처리하지 못하는 경우를 대비하여, 두가지 수신 확인 모델을 가지고 있다고 한다.
Broker가 Consumer에게 메세지를 전달한 후 자동으로 삭제하는 방법과 Consumer에서 Broker에게 Ack를 통지하여 Broker가 Queue에 메세지를 삭제하는 방법이다.
Exchange는 타입과 Binding 규칙에 따라 적절한 Queue에 메세지를 전달한다.
Property
Default Exchange는 Direct 타입이며, RabbitMQ에서 생성되는 모든 Queue가 자동으로 binding되고, 각 Queue 이름이 라우팅 키로 지정 됨
메세지를 저장하는 부분으로
하나의 Queue에 여러 Consumer가 존재할 경우, Queue는 기본적으로 RR로 메세지를 분배할 수 있음
Property
Consumer와 Bocker간의 많은 연결은 과부화라는 결과를 초래할 수 있음
따라서 Channel 이라는 개념을 통해 하나의 TCP 연결을 공유해서 사용할 수 있는 기능을 제공함
The AMQP protocol has a mechanism called channels that “multiplexes” a single TCP connection.
참고자료
https://www.cloudamqp.com/blog/2017-12-29-part1-rabbitmq-best-practice.html
https://jonnung.dev/rabbitmq/2019/02/06/about-amqp-implementtation-of-rabbitmq/
https://www.rabbitmq.com/tutorials/amqp-concepts.html
우선 순위가 높은 소비자가 활성 상태인 동안에 메시지를 수신하는 것을 보장한다.
우선 순위가 높은 Consumer가 메세지를 받아 이미 사용중일 때 더 낮은 우선 순위 Consumer에게 전달되도록 할 수 있다.
일반적으로 큐에 연결된 활성 Consumer는 라운드 로빈 방식으로 메시지를 받는다. 소비자 우선 순위가 사용 중일 때 동일한 높은 우선 순위를 가진 여러 활성 Consumer가 존재하면 메시지가 라운드 로빈으로 전달된다.
다시말해 높은 우선순위를 가진 Consumer끼리 RR을 진행하고, 이 Consumer들이 모두 blocked 상태라면 우선 순위가 낮은 active 상태의 consumer에게 메세지를 전달하게 됨
https://www.rabbitmq.com/consumer-priority.html