RabbitMQ 본문
RabbitMQ와 STOMP를 사용하는 채팅 서버를 만들던 중 RabbitMQ에 대한 이해가 부족했다는 것을 깨닫고 공부하기 위해 작성한 포스팅이다.
RabbitMQ란?
AMQP를 구현한 오픈소스 메세지 브로커
Producers 에서 Consumers 로 메세지를 전달할 때 그 중간에서 브로커 역할을 한다.
AMQP란?
Advanced Message Queueing Protocol의 줄임말로 MQ의 오픈소스에 기반한 표준 프로토콜을 의미한다. AMQP의 가장 대표적인 구현체가 바로 RabbitMQ라고 볼 수 있다.
RabbitMQ 구조
RabbitMQ는 Producer가 발행한 메세지를 Consumer가 소비하기 전까지 Queue에 저장하여 보관하는 일련의 과정을 중개한다.
Queue는 이름으로 구분되며, 같은 이름과 같은 설정으로 Queue를 생성하면 에러 없이 기존 Queue에 연결되지만, 동일한 이름과 다른 설정으로 생성을 시도하면 에러가 발생한다.
위의 그림을 살펴보면 메세지가 Queue에 보관되기 이전에 Exchange라는 중간 객체가 존재하는 것을 확인할 수 있는데, Exchange는 Producer가 발행한 메세지를 어떤 Queue로 발송할지 결정하는 객체다.
Producer가 발행한 메세지와 Queue를 연결짓는 라우터라고 생각하면 이해하기 쉬울 것이다. Exchange에는 네 가지 타입이 존재하는데, 각 타입마다 각기 다른 방식으로 메세지를 Queue에 전달한다.
Binding은 Exchange와 Queue의 관계를 나타내며, 특정 조건에 맞는 메세지를 특정한 Exchange로부터 특정한 Queue로 전송하도록 설정할 수 있다. 위에서 언급한 Exchange의 타입에 따라 Binding의 방식이 달라진다.
Queue의 속성
- Name
- Durability
- 브로커가 재시작될 때 남아있는지 여부
- Durable : 디스크에 저장되기 때문에 브로커를 재시작해도 남아있음
- Transient : 브로커가 재시작되면 사라짐
- Auto-delete
- Consumer가 consume 을 끝낼 경우 삭제
- Argument
- 메세지 TTL, Max-Length 같은 추가 기능을 명시Exchange의 속성
Exchange의 속성
- Name
- Type
- Durability
- 브로커가 재시작될 때 남아있는지 여부
- Durable : 디스크에 저장되기 때문에 브로커를 재시작해도 남아있음
- Transient : 브로커가 재시작되면 사라짐
- Auto-delete
- Queue 연결이 모두 해제되면 삭제Exchange의 타입Exchange의 타입
Direct Message
라우팅 키를 사용하여 메세지를 전달할 때 정확히 일치하는 Queue 에만 메세지를 전달한다.
하나의 Queue 에 여러 라우팅 키를 지정할 수 있고, 여러 Queue 에 같은 라우팅 키를 지정할 수도 있
다.
Topic Exchange
라우팅 키의 패턴을 이용해서 메세지를 라우팅한다.
위의 이미지는 라우팅 키 패턴이 일치하지 않아 Binding 이 제대로 이루어지지 않은 것을 나타내는 이미지이며, 아래의 이미지는 모든 Queue 에 Binding 이 성공적으로 이루어진 모습을 나타낸다.
#은 0개 이상의 단어를 의미한다
Headers Exchange
Topic 과 유사한 방법이지만, 라우팅을 위해 header 를 사용한다는 점에서 차이가 존재한다.
Producer 에서 정의된 header 의 Key-Value 쌍과 Consumer 에서 정의된 Argument 의 Key-Value 쌍이 일치하면 Binding 된다.
바인딩 키만을 사용하는 것보다 더 다양한 속성을 사용할 수 있다. 이 타입을 사용하게 되면 바인딩 키는 무시되고, 바인딩 시 지정된 값과 헤더 값이 동일한 경우에만 일치하는 것으로 간주한다.
Header Exchange 타입의 경우 x-match 의 값에 따라 다르게 동작한다.
all 인 경우 header 의 모든 Key-Value 쌍 값과 Argument 가 일치해야 Binding 되지만, any 인 경우 Key-Value 쌍 값과 Argument 가 하나라도 일치하는 경우에 Binding 된다
Fanout
Exchange 에 등록된 모든 Queue 에 메세지를 전송한다
Prefetch Count
하나의 Queue 에 여러 Consumer 가 존재하는 경우, Queue 는 기본적으로 Round-Robin 방식으로 메세지를 분배한다.
예를 들어, 홀수 번째 메세지 처리 시간은 짧고, 짝수 번째 메세지의 처리 시간 매우 길 경우 계속해서 하나의 Consumer 만 동작하는 경우가 발생한다.
이를 예방하기 위해 Prefetch Count 를 1로 설정하면, 하나의 메세지가 처리되기 전에는 새로운 메세지를 받지 않게 되므로 작업을 분산시킬 수 있다.
출처: https://velog.io/@sdb016/RabbitMQ-%EA%B8%B0%EC%B4%88-%EA%B0%9C%EB%85%90
'Dev' 카테고리의 다른 글
그림으로 이해하는 객체 지향 설계 5원칙 [SOLID] (2) | 2024.07.20 |
---|---|
CPU-Scheduling (2) | 2024.04.07 |
Redis를 사용한 분산락 (0) | 2024.03.24 |
운영체제와 시스템 콜 (1) | 2024.03.23 |
Thread Safe 와 동시성 제어 (0) | 2024.03.17 |