JaeWon's Devlog
article thumbnail
Published 2022. 10. 22. 16:00
RabbitMQ 정리 Tool, 이론 및 기타
반응형

회사에서 서버간 간단한 데이터 전달로는 RabbitMQ를 사용하고 있었습니다.

최근 많은 회사에서 다양한 AMQP의 MQ 들을 사용하는데, 이번 글에서는 RabbitMQ 에 대해 정리해보고자 합니다.


1. RabbitMQ 란?

- 서버간 메세지(데이터)를 전달해주는 오픈소스 메세지 브로커입니다.

- 1:1 또는 1:N 등 메세지를 특정 사용자에게 전달하려고 할 때, RabbitMQ 가 메세지를 받아 알맞게 전달하는 역할을 합니다.

- AMQP 프로토콜을 구현한 메세지 브로커입니다.

 

Message Broker(메시지브로커) 및 Message Queue(메시지큐) 정리

이직을 한 지 6개월이 돼가면서, 새로운 경험도 하고 있고 기존에 아는 내용에 대해서도 조금 더 확실하게 이해할 수 있는 기간이었다고 생각한다. 그러면서 대부분 주말을 통해 공부를 (조금)하

dev-jwblog.tistory.com

- 서버간 요청에 대한 처리 시간이 길 때, 해당 요청을 다른 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
profile

JaeWon's Devlog

@Wonol

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!