RabbitMQ

박우민·2020년 12월 16일
0

Overview


RabbitMQ는 Erlang으로 구현된 메세지 브로커 시스템이다.

메세지 생산자를 Producer, 메세지 소비자를 Consumer라고 한다.

생산자와 소비자 사이에는 메세지를 브로커가 존재하며, 브로커는 Exchange, Queue 등이 존재한다.

AMQP에는 네트워크나 메세지를 처리하지 못하는 경우를 대비하여, 두가지 수신 확인 모델을 가지고 있다고 한다.

Broker가 Consumer에게 메세지를 전달한 후 자동으로 삭제하는 방법과 Consumer에서 Broker에게 Ack를 통지하여 Broker가 Queue에 메세지를 삭제하는 방법이다.


Exchange

Exchange는 타입과 Binding 규칙에 따라 적절한 Queue에 메세지를 전달한다.

Property

  • Name
  • Type
    • Direct Exchange : Routing Key를 기반으로 Queue에 메세지를 전달(unicast), 여러 큐에 같은 라우팅 키를 지정하여 Fanout 처럼 동작하게 할 수도 있고, 일부 큐에 같은 라우팅 키를 지정하여 전체 매칭을 통해 topic 처럼 동작하게 할 수도 있음
    • Fanout Exchange : Routing Key 관계 없이 모든 Queue에 동일한 메세지를 전달(broadcast)
    • Topic Exchange : Routing Key가 전체가 일치하거나 일부 패턴과 일치하는 모든 Queue로 메세지를 전달(multicast)
    • Headers Exchange : Binding Key는 무시되고, 헤더 값이 바인딩 시 지정된 값과 같은 경우에만 일치하는 것으로 간주(multicast)
  • Durability
  • Auto-delete
  • Binding
    • Exchange에서 Queue의 이름만으로도 Binding을 추가할 수 있음
    • routing Key를 지정해서 메세지를 필터링하고 지정한 Queue로 보내도록 정의할 수 있음

Default Exchange

Default Exchange는 Direct 타입이며, RabbitMQ에서 생성되는 모든 Queue가 자동으로 binding되고, 각 Queue 이름이 라우팅 키로 지정 됨

Queue

메세지를 저장하는 부분으로
하나의 Queue에 여러 Consumer가 존재할 경우, Queue는 기본적으로 RR로 메세지를 분배할 수 있음

Property

  • Name: queue 이름
  • Durability: durable/transient가 있음
  • Auto delete:
  • Arguments: 메세지 TTL, Max Length 같은 추가 기능 명시

Prefetch Count

Channels

Consumer와 Bocker간의 많은 연결은 과부화라는 결과를 초래할 수 있음
따라서 Channel 이라는 개념을 통해 하나의 TCP 연결을 공유해서 사용할 수 있는 기능을 제공함

The AMQP protocol has a mechanism called channels that “multiplexes” a single TCP connection.

참고자료

https://www.cloudamqp.com/blog/2017-12-29-part1-rabbitmq-best-practice.html

https://jonnung.dev/rabbitmq/2019/02/06/about-amqp-implementtation-of-rabbitmq/
https://www.rabbitmq.com/tutorials/amqp-concepts.html

Consumer Priorities

우선 순위가 높은 소비자가 활성 상태인 동안에 메시지를 수신하는 것을 보장한다.
우선 순위가 높은 Consumer가 메세지를 받아 이미 사용중일 때 더 낮은 우선 순위 Consumer에게 전달되도록 할 수 있다.

일반적으로 큐에 연결된 활성 Consumer는 라운드 로빈 방식으로 메시지를 받는다. 소비자 우선 순위가 사용 중일 때 동일한 높은 우선 순위를 가진 여러 활성 Consumer가 존재하면 메시지가 라운드 로빈으로 전달된다.

다시말해 높은 우선순위를 가진 Consumer끼리 RR을 진행하고, 이 Consumer들이 모두 blocked 상태라면 우선 순위가 낮은 active 상태의 consumer에게 메세지를 전달하게 됨

https://www.rabbitmq.com/consumer-priority.html

RabbitMQ sharding

profile
안녕하세요 Software Development Engineer 입니다.

0개의 댓글