RabbitMQ

Panda·2023년 6월 14일

RabbitMQ를 실무에서 접해서 코드를 볼 때 진짜 하나도 이해가 안되더라고요.
전에 한번 개념만 익혔다가 다 까먹어서 제대로 공부해보려고 합니다.

RabbitMQ란?

AMQP를 구현한 오픈소스 메세지 브로커
Producers에서 Consumers로 메세지를 전달할 때 중간 브로커 역할

AMQP를 구현했다고 하는데 AMQP가 뭔지 한번 알아볼까요?

AMQP (Advanced Message Queuing Protocol)

AMQP는 밑에와 같은 형식으로 통신하는 하나의 프로토콜 입니다.

  • Producer: 메시지를 보내는 곳 (발행자, Publisher)
  • Consumer: 메시지를 받는 곳 (구독자, Subscriber)
  • Exchange: Producer로부터 메시지를 수신하는 곳. 수신한 메시지를 큐에 분배한다.
  • Queue: 메시지를 저장하는 곳. 저장했다가 Consumer에게 전달한다.
  • Binding: Exchange와 Queue의 관계, 1:1 또는 1:N.

Binding 종류

  • Direct exchange : 메시지의 라우팅 키와 일치하는 Queue로 메시지를 전달 (1:1)
  • Fanout exchange : Exchange에 binding 된 모든 Queue에 메시지를 전달(1:N)
    약간 브로드캐스팅같은 거네요 ㅋㅋ
  • Topic exchange : Exchange에 binding 된 Queue 중에 메시지의 라우팅 키 패턴이 일치하는 모든 Queue에 메시지를 전달 (Mulicast)

Exchange 속성

  • Name: Exchange 이름
  • Type: 메시지 전달 방식
    • Direct
    • Fanout
    • Topic
    • Headers
  • Durability: 브로커가 재시작될 때 남아있는지 여부
    • Durable: 브로커가 재시작되어도 디스크에 저장되어 남아있음
    • Transient: 브로커가 재시작되면 사라짐
  • Auto-delete: 마지막 Queue 연결이 해제되면 삭제

Queue 속성

  • Name: Queue 이름, amq.은 예약어로써 사용 불가
  • Durability: 브로커가 재시작될 때 남아있는지 여부
    • Durable: 브로커가 재시작되어도 디스크에 저장되어 남아있음
    • Transient: 브로커가 재시작되면 사라짐
  • Auto delete: 마지막 Consumer가 consume을 끝낼 경우 자동 삭제
  • Argument: 메시지 TTL, Max Length 같은 추가 기능 명시

분산 RabbitMQ

RabbitMQ는 분산 시스템 구성이 가능한데요
위에 그림처럼 Exchange가 Message를 로드밸런싱하여 Queue들에게 넣어준다고 보시면 될 것 같네요.

Prefetch Count

Prefetch Count 값은 Consumer에게 동시에 전송되는 메시지 수를 지정하는 데 사용됩니다.
예를 들어 Prefetch Count가 1이라면 하나의 메시지가 처리되기 전에는 새로운 메시지를 받지 않습니다.

위와 같이 Prefetch Count가 1이면 메세지를 전송하고 다 처리가 된 이후에 작업을 진행할 수 있어서
125ms 이후에 또 다른 메세지를 보낼수 있겠네요.

반면에 Prefetch Count가 많으면 Queue에서 많은 메시지를 가져와 Consumer에게 전달하여 다른 Consumer를 Idle 상태로 유지할 수 있습니다.

적절한 Prefetch Count를 설정하여 운영하는 것이 좋을 것 같습니다.

느낀 점

코드에서 rabbitmq exchange 메소드가 무엇인지, Topic Exchange가 뭔지 등등 궁금했는데
한방에 해소되었네요.
그리고 원래는 왜 쓰는지도 쓰려고 했는데 너무 당연한 이야기인 것 같고 RabbitMQ 자체에 집중하려고 해서 제외했습니다.

제가 지금 하고 있는 실무에서도 분산으로 구성되어있는데 공부했던 내용들을 기반으로 안정화 작업을 해야겠네요!

제가 알기로는 RabbitMQ는 메세지를 보관하는게 휘발성인걸로 알고있긴한데 디스크에 저장할 수 있는 옵션도 있네요?? 이거는 한번 자세히 알아봐야겠습니다.

스프링에서 RabbitMQ를 사용하는 라이브러리가 있으니 해당 라이브러리를 사용하여 편하게 사용해야겠습니다.

참조 사이트

profile
실력있는 개발자가 되보자!

0개의 댓글