RabbitMQ란?

GwanMtCat·2023년 10월 10일
0

개념

오픈 소스 메시지 브로커 소프트웨어로서, AMQP를 구현하였다.

                          Broker
Producers -> [Exchange -- Binding --> Queue] -> Consumers

메시지를 발행하는 생산자(Producer)에서 브로커의 Exchange로 메시지를 전달하면,
Queue에 Binding된 규칙에 따라 메시지가 큐로 복사된다.
그리고 Consumer에서는 브로커의 큐를 통해 메시지를 받아가서 처리한다.


동작

AMQP 에서는 네트워크에 문제가 있거나, 메시지를 처리하지 못하는 경우에 대비하여 2가지 수신 확인 모델을 가지고 있다.

1. 소비자가 메시지를 받으면 명시적으로 브로커에게 통지하고, 브로커는 이 알람을 받았을 때만 큐에서 메시지를 삭제 (At Least Once)

2. 브로커가 메시지를 전달하면 자동으로 삭제한다. (At Most Once)

모든 메시지는 큐에 직접 전달되지 않고, 반드시 Exchange 라고 불리우는 메시지를 큐로 전달하는 컴포넌트에 먼저 전달이 되며 Routing Key 및 Header 바인딩 규칙에 따라 적절한 큐로 전달이 된다.

규칙은 여기를 참조하자.


특징

  • 클라이언트는 RabbitMQ 브로커와 TCP Connection을 맺고 Connection 안에 Channel 이라는 가상의 통로를 만들어서 큐에 메시지를 발행하거나 메시지를 소비할 수 있다.

  • RabbitMQ는 Push, Polling 두 방법으로 소비자가 메시지를 전달 받을 수 있다.

  • 소비자가 여러 개 일때, 메시지를 보내는 방식은 라운드 로빈 방식으로 연결된 소비자들에 대해서 돌아가면서 메시지를 분배하여, 모든 소비자가 평균적으로 같은 메시지를 받게 된다.

  • 소비자가 메시지를 처리하고 나서 완료했다는 ack를 보내지 않으면, 메시지가 완벽히 처리 되지 않았다고 간주하여, 다시 해당 메시지를 큐에 집어 넣는다.

  • 테스크가 처리 되는 시간은 상황에 따라 다르기 때문에 ack가 언제까지 오지 않았을 때, 메시지가 정상적으로 처리되지 않았다는 것을 인지하고 메시지를 다시 큐에 넣을 것인지 판단하는 기준인 timeout을 설정해야 한다.

  • RabbitMQ를 호스팅하고 있는 서버가 죽는 경우, 큐에 있는 메시지들이 전부 유실되는데 RabbitMQ에서는 큐와 메시지를 durable 하게 만들 수 있는 메커니즘을 제공한다. 옵션을 설정하는 경우 메모리에 있던 메시지들을 disk로 저장하게 된다. 메모리에 있던 메시지가 disk로 전달되기 전 서버가 죽을 수 있어 100% 보장을 하지는 않는다.

  • 라운드 로빈 방식으로 메시지를 소비하게 되므로 특정 소비자에게만 유독 처리가 긴 태스크가 몰리는 일이 발생할 수 있다. prefetch_count라는 세팅을 통해 하나의 워커가 하나의 메시지만 전달 받고, 그 메시지에 대한 ack를 보내기 전까지는 새로운 메시지를 받지 않는 설정을 하여 작업을 처리하고 있지 않은 워커에게 메시지를 분배할 수 있는 기능이 있다.

  • RabbitMQ 서버를 클러스터로 묶어 수평적 확장이 쉽다.


용어

  • Vhost(Virtual host)

    • Virtual Host를 통해서 하나의 RabbitMQ 인스턴스 안에 사용하고 있는 Application을 분리할 수 있다.
  • Connection

    • 물리적인 TCP Connection, HTTPS -> TLS(SSL) Connection을 사용
  • Channel

    • 하나의 물리적인 Connection 내에 생성되는 가상의 Connection
      Consumer의 process나 thread는 각자 Channel을 통해 Queue에 연결 될 수 있다.
  • Prefetch

    • Queue의 메세지를 Consumer의 메모리에 쌓아놓을 수 있는 최대 메세지의 양

참조한 책 및 사이트

https://guide.ncloud-docs.com/docs/rabbitmq-rabbitmq-1-1
https://nrise.github.io/posts/using-rabbitmq/
https://stackoverflow.com/questions/29697703/rabbitmq-in-pub-sub-is-the-consumer-polling-the-queue-for-new-messages-or-does
https://recordsoflife.tistory.com/865
https://nesoy.github.io/articles/2019-02/RabbitMQ
https://velog.io/@power0080/Message-QueueRabbitMQ%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%B4-%EB%A9%94%EC%84%B8%EC%A7%80-%EC%A3%BC%EA%B3%A0-%EB%B0%9B%EA%B8%B0
https://stackoverflow.com/questions/26521854/is-rabbitmq-capable-of-pushing-messages-from-a-queue-to-a-consumer
https://kamang-it.tistory.com/entry/AMQPRabbitMQRabbitMQ%EC%95%84%EC%A3%BC-%EA%B8%B0%EC%B4%88%EC%A0%81%EC%9D%B4%EA%B2%8C-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0-JavafeatHello-World-2
https://mentha2.tistory.com/259

0개의 댓글