회사에서 서버간 간단한 데이터 전달로는 RabbitMQ를 사용하고 있었습니다.
최근 많은 회사에서 다양한 AMQP의 MQ 들을 사용하는데, 이번 글에서는 RabbitMQ 에 대해 정리해보고자 합니다.
1. RabbitMQ 란?
- 서버간 메세지(데이터)를 전달해주는 오픈소스 메세지 브로커입니다.
- 1:1 또는 1:N 등 메세지를 특정 사용자에게 전달하려고 할 때, RabbitMQ 가 메세지를 받아 알맞게 전달하는 역할을 합니다.
- AMQP 프로토콜을 구현한 메세지 브로커입니다.
- 서버간 요청에 대한 처리 시간이 길 때, 해당 요청을 다른 API 에게 위임하고 빠른 응답을 할 때 주로 사용합니다.
- MQ 를 사용하면 어플리케이션 간에 결합도를 낮출 수 있다는 장접도 있습니다.
2. RabbitMQ 구성
- RabbitMQ 구조에 대한 대략적인 형태는 아래와 같습니다.
- 그림에서 확인하실 수 있듯이, Producer 는 Message 를 발행하여 Broker의 Exchange 로 전달을 하고, Exchange 는 Binding 규칙에 따라 연결된 Queue 에 Message 를 복사(보관)하여 마지막으로 Consumer 에게 전달합니다.
- Message
- 처리하고자 하는 메세지(데이터)가 담겨져 있습니다.
- Producer
- Message 를 Consumer 에게 전달하기 위해 Message 를 Exchange 에 Publish 합니다.
- Message 를 보내는 일 이외에는 아무것도 하지 않습니다.
- Queue 에 직접 접근하지 않고, 항상 Exchange 를 통해 접근합니다.
- Exchange
- Producer 에게 전달받은 Message 를 Queue 에게 전달해주는 일종의 라우터 역할을 합니다.
- Exhange 는 Message 를 어떤 Queue 에 추가할지, 버려야할지 등 Exchange 규칙에 의해 결정합니다.
- Exchange 의 규칙으로는 Fanout, Direct, Topic, Headers 4가지 타입이 있습니다.
- Binding
- Exchange 와 Queue 의 관계를 말하며, Binding 이 되어야 Exchange 가 알맞은 Queue 에게 Message 를 전달합니다.
- 일반적으로는 사용시 개발자가 어느 Exchange 가 어느 Queue 에 Binding 을 할 지 정의합니다.
- Queue
- Memory 나 Disk 에 Message 를 보관하고, 그것을 Consumer 에게 전달합니다.
- Queue 는 이름으로 구본되는데, 같은 이름과 같은 설정으로 Queue 를 생성하면 에러 없이 기존 Queue 에 연결되지만, 같은 이름과 다른 설정으로 Queue 를 생성하려고 시도하면 에러가 발생합니다.
- Consumer
- Message 를 수신하는 주체입니다.
- Queue 에 직접 접근하여 Message 를 가지고 옵니다.
3. Exchange Type
- 위에서 설명했듯이 Exchange 에는 4가지 타입이 있는데, 각 타입별 특징은 아래와 같습니다.
타입 | 설명 | 특징 |
Direct | Routing Key 가 정확히 일치하는 Queue 에게 Message 전송 | Unicast |
Topic | Routing Key 의 패턴이 일치하는 Queue 에게 Message 전송 | Multicast |
Headers | [Key:Value] 로 이루어진 Header 값 을 기준으로 일치하는 Queue 에게 Message 전송 | Multicast |
Fanout | 해당 Exchange 에 등록 된 모든 Queue 에게 Message 전송 | BroadCast |
3-1. Direct Exchange
- Message 의 Routing Key 와 정확히 일치하는 Binding 된 Queue 로 매칭 시킵니다.
- error 메세지만 c1에 전달하고, error, info 와 warning 을 포함한 모든 정보는 c2에 전달합니다.
- 즉, Exchange(X)로 전달된 메세지의 Routing Key 가 error 이면 c1,c2 에 전달하고 info,warning 인 경우 c2에 전달되며, 이외의 값들은 다 메세지가 무시됩니다.
Default Exchange 는 이름이 없는 Direct Exchange 한 형태입니다.
Default Exchange 는 전달될 목적지 Queue 이름과 동일한 Routing Key 를 부여합니다.
3-2. Topic Exchange
- Routing Key 패턴을 이용하여 일치하는 Binding 된 Queue 로 매칭 시킵니다.
- Topic 에서 사용하는 Binding Key 는 점(.) 으로 구분된 단어를 조합해서 사용합니다.
- *, # 을 이용해 와일드 카드를 표현할 수 있으며, * 는 단어 하나 일치, # 은 0 또는 1 개 이상의 단어 일치를 의미합니다.
- Routing Key 가 test.orange.rabbit 인 경우 C1, C2 에 모두 전달됩니다.
- Routing Key 가 test.orange.dog 인 경우 C1 에만 전달됩니다.
- Routing Key 가 lazy.test.rabbit 인 경우 C2 에 한 번만 전달됩니다.
Routing 패턴이 여러 개가 일치하더라도 하나의 Queue 에는 Message 가 한 번만 전달됩니다.
3-3. Headers Exchnage
- Key-Value 로 정의된 Header 속성을 토왜 일치하는 Binding 된 Queue 로 매칭 시킵니다.
- Message 를 전달하는 Producer 쪽에서 정의하는 Header 의 Key-Value 와 Message 를 받는 Consumer 쪽에서 정의된 Argument 의 Key-Value 가 일치해야만 합니다.
- Producer 에서 정의하는 Header 는 Message 와 함께 전송되고, Consumer 쪽에서는 Exchange 와 Queue 가 Binding 되는 시점에 Argument 를 정의합니다.
- Header 에는 x-match 라는 Key가 있고, 옵션으로는 any (최소 1개의 조건 충족) 와 all(모든 조건을 충족) 이 있습니다.
3-4. Fanout Exchange
- Exhange 와 Binding 된 모든 Queue 에 매칭 시킵니다.
4. Message 를 보관하는 Queue
- Consumer 어플리케이션은 Queue 를 통해 Message 를 전달받는다.
- Queue 는 반드시 미리 정의해야 사용할 수 있다.
- Round-Robin 스케줄링 방식으로 전달한다.(= 병렬 처리)
- Name
- Queue 이름.
- amq. 로 시작하는 이름은 예약되어 사용할 수 없다. - Durability
- durable 은 Broker 가 재시작 되어도 Disk 에 저장되어 남아있고 transient 으로 설정하면 Broker 가 재시작 되면 Message가 삭제된다.
- Queue 에 저장되는 Message 는 내구성을 갖지 않는다. - Auto Delete
- 마지막 Consumer 가 Subscriber(구독)을 끝내는 경우 자동으로 삭제한다. - Arguments
- Message 의 TTL, Max Length 같은 추가 기능을 명시한다.
4-1. Message Durability
- 만약 Queue 가 Consumer 에게 Message 를 전달하기 전에 RabbitMQ 서버가 죽는다면 Queue 는 메모리에 데이터를 쓰는 형식이므로 모든 데이터가 소멸됩니다.
- Message Durabilty 는 Message 가 Queue 에 저장될 때, Disk 의 파일에도 동시에 저장하는 방법입니다.
- 해당 방법을 통해서 RabbitMQ 서버가 죽더라도 Queue 의 데이터는 어느 정도 복구 할 수 있지만, Disk 에 쓰는 도중이라면 일부 데이터의 소실이 발생할 수 있습니다.
참고
- https://hwannny.tistory.com/82
- https://jin2rang.tistory.com/entry/RabbitMQ%EB%9E%80
- https://nesoy.github.io/articles/2019-02/RabbitMQ
- https://jonnung.dev/rabbitmq/2019/02/06/about-amqp-implementtation-of-rabbitmq/
'Tool, 이론 및 기타' 카테고리의 다른 글
MarkDown 작성 요령 (0) | 2023.01.23 |
---|