BE & Infra
RabbitMQ
hyukji
2024. 8. 23. 01:28
RabbitMQ란?
AMQP(Advanced Message Queuing Protocol)를 구현하여 메세지 생성자와 소비자 사이에서 메세지를 중계해주는 메세지 브로커 이다.
- AMQP는 메세지 지향 미들웨어를 위한 개방형 표준 응용 계층 프로토콜
- 메세지 지향 미들웨어는 비동기 메세지를 사용하는 응용프로그램들 사이에서 데이터를 송수신 하는 것을 의미. 이러한 시스템을 구현한 솔루션을 메세지 큐 라고 한다.
메세지 큐를 사용하는 이유
- 비동기
- 메세지 큐의 경우 생산된 메세지의 저장, 전송에 대해 동기화 처리 하지 않고 Queue에 넣어두기 때문에 나중에 처리가 가능하다. 이로 인해 병목현상을 방지할 수 있음
- 낮은 결합도
- Producer와 Consumer가 독립적으로 행동하면서 서비스 간의 결합도가 낮아진다.
- 확장성
- 다수의 프로세스들이 메세지 큐를 통해 메세지를 보낼 수 있어 확장성 및 분산처리에 대한 장점을 가짐
- 탄력성
- 메세지를 받아서 처리하는 서비스가 중지되어도 메세지큐가 중지된 것이 아니여서, 서비스가 재시작되면 Queue에 있는 메세지 다시 처리할 수 있음
- 보장성
- 메세지 큐는 보관되는 모든 메세지가 결국 Consumer 서비스에게 전달된다는 일반적인 보장을 제공
추가적으로 메세지 브로커의 경우 메세지를 받아서 처리하고 나면 즉시 또는 짧은 시간 내에 메세지가 삭제되는 구조이며 RabbitMQ, Redis 가 메세지 브로커에 해당된다.
반면에 이벤트 브로커의 경우 발생한 이벤트를 보존한다는 특징을 가지며 Kafka는 이벤트 브로커에 해당한다.
RabbitMQ 구조
- Producer
- 메세지를 생성하고 발송하는 주체.
- Producer는 메세지를 Queue에 직접 보내는 것이 아니라 Exchange에 Publish한다.
- Consumer
- 메세지를 받아서 처리하는 주체
- Exchage
- Producer로 부터 받은 메세지를 어떤 Queue에 발송할지 결정하는 객체.
- 4가지 타입 존재 : Direct, Topic, Headers, Fanout
- 각각의 타입과 Binding 규칙에 따라 적절한 Queue로 메세지를 전달
- Binding
- Exchange와 Queue를 연결하는 관계
- Exchange Type과 Binding 규칙에 따라 적절한 Queue로 메세지가 전달된다.
- Queue
- RabbitMQ안에서 메세지를 일시적으로 저장하는 장소.
- Consumer들은 Queue에 저장된 메세지를 읽어들인다.
- Queue는 RabbitMQ서버가 설치되는 호스트의 디스크 용량 및 메모리에 한정된다.
Exchange Type
- Direct Exchange
- 메세지를 포함한 routing key를 기반으로 queue에 메세지 전달
- 하나의 queue에 여러가지 key, 여러 queue에 같은 key를 지저할 수도 있음
- Topic Exchange
- 메세지에 포함된 routing key의 패턴을 이용하여 라우팅하는 기법.
- 여러 consumer에서 메세지 형태에 따라 선택적으로 수신해야 하는 경우와 같이 다양한 publish/subscribe 패턴 구현에 활용된다.
- 위의 경우에서 quick.black.cat 은 q1, q2 모두 전달된다.
- Headers Exchange
- 메세지 라우팅을 위해 header를 사용하는 방식. binding key만을 사용하는 것보다 다양한 속성을 사용할 수 있다.
- routing key 속성은 무시되고 headers 속성의 값이 바인딩 시 지정된 값과 같은 경우에 일치하는 것으로 간주된다.
- Fanout Exchange
- routing key에 관계 없이 Exchange에 등록된 모든 Queue에 동일한 메세지를 전달하는 BroadCast 방식으로 동작
Round-Robin Dispatch, Fair Dispatch
- 만일 하나의 Queue에 여러 개의 Consumer가 붙어있다면 RabbitMQ에서는 RR 방식을 통해 Consumer에게 메세지를 균등하게 분배한다. → 하지만 특정 Consumer에게만 무거운 메세지만 계속 갈 수도 있다.
- Prefetch로 해결 : Queue의 메세지를 Consumer의 메모리에 쌓아둘 수 있는 최대 메세지의 양으로 Prefetch count 값을 설정하면 하나의 메세지가 처리되기 전에는 새로운 메세지를 받지 않는다.
- default값 : 250으로 메세지를 250개 이상 못가져 간다.
ref
https://wildeveloperetrain.tistory.com/317