참고 출처 : https://skibis.tistory.com/310
RabbitMQ란 AMQP을 기반으로 만들어진 프로그램이다.
RabbitMQ와 관련된 주요 용어는 아래와 같다.
producer : 메세지를 보내는 App
publish : Producer가 메세지를 보내는 것
Queue : 메세지를 저장하는 버퍼, Queue는 Exchange에 Binding 된다.
Consumer : 메세지를 수신하는 App
- 동일 업무를 처리하는 Consumer는 보통 한개의 Queue를 본다.
- 여러 Consumer가 같은 Queue를 볼 때 자동으로 메세지가 분배되서 전달된다.
Subscribe : Consumer가 메세지를 수신하기 위해 Queue를 실시간 리스닝 하도록 한다.
Exchange : Producer가 전달한 메세지를 Queue에 전달하는 역할을 한다.
- 메세지가 Queue에 직접 전달되지 않고 exchange type에 정의한 대로 동작한다.
ExchangeType : type에는 fanout, direct, topic, header 4가지가 존재한다.
Binding : Exchange와 Queue를 연결해주는 작업
Routing : Exchange와 Queue에 메세지를 전달하는 과정을 의미한다.
RoutingKey : Exchange와 Queue가 binding 될 때 Exchange가 Queue에 메세지를 전달할지 여부를 결정한다.
Exchange를 별도로 명시하지 않은 경우, RabbitMQ의 기본적인 흐름은 아래와 같다.
1. Producer가 메세지를 생성하여 전송.
2. Queue가 이 메세지들을 순차적으로 쌓는다.
3. Consumer가 Queue에 대한 Biunding을 가지고 있다가 메세지를 Queue에서 수신한다.
메세지의 분배 [ Round - robin Dispatching ]
RabbitMq는 Consumer가 병렬처리를 쉽게 할 수 있도록 같은 Queue를 바라보고 있는 Consumer에게 균등 분배한다.
즉, 첫 메세지는 Consumer1, 두번째 메세지는 Consumer2에게 주는 식으로 중복처리되지 않게 자동 분배를 해준다.
- 이 특징을 통해서 RabbitMQ는 수평적 확장이 용이하다.
공평한 분배 [ Fair dispatch ]
여러 consumer에게 round robin을 통해 메세지를 균등하게 전달하지만 완전한 균등은 아니다.
이 때 Busy한 서버에게 메세지가 계속 전달되지 않도록 prefetchCountㄹ하는 개념을 사용한다.
prefetchCount가 1일 때는 아직 sck를 받지목한 메세지가 1개라도 존재 시,
해당 Consumer에게 메세지를 할당하지 않는다.
[prefetchCount는 해당 Consumer의 동시 처리가능한 메세지 갯수를 의미하는 듯]
메세지 수신 통보 [ Acknowledgement ]
많은 프로토콜이 메세지 전달 보장을 위해서 Acnowledgement( ACK ) 라는 개념을 사용해서
메세지에 대한 응답을 보내주도록 되어 있다.
ACK의 중요성은 메세지가 확실히 처리되었는지를 확인할 수 있게 해주며 ACK가 온 메세지에 한해서만
Queue에서 삭제를 진행하기 때문이다.
Consumer 중 일부가 죽었을 시 대응방법
ACK가 오지 않는 Consumer가 존재 시(Disconnect등의 경우) 해당 메세지를 다음 Consumer에게 할당한다.
RabbitMQ가 죽었을 경우 대응 방법
RabbitMQ는 Queue에 메세지를 보관하고 ACK를 받은 경우에만 메세지를 Queue에서 삭제한다.
Consumer가 죽었을 시 메세지를 보존할 수 있지만 RabbitMQ가 죽은 경우는 어떻게 해야할까
RabbitMQ가 죽는다면 Queue에 있는 메세지들 역시 날아가 버릴 것이다.
이 경우에 대한 대비책은 메세지들을 Queue에 저장 시 File에도 기록하는 것이다.