RabbitMQ

Dev. Hedy·2022년 12월 26일
post-thumbnail

회사에서 AWS SQS에서 Rabbit MQ 로 이관작업을 하면서 정리해보았다. 현재 회사의 서비스가 대부분 mq로 작업을 하고 있다.
스택오버플로우 링크
회사에서는 큰 이유로 비용 절감을 위해 이관하였지만, 위의 링크에 따르면
SQS는 간단한 큐서비스이다. 메세지의 라우팅 서비스 등을 지원하지 않는다. 단순히 메세지 생산자가 만들어낸 메세지를 메세지 소비자가 가져가는 것이 전부이다.
MQ는 Fulled message service로 복잡한 요규사항들이 있는 메세지를 구현할때 유용하다.

RabbitMQ 소개

RabbitMQ는 AMQP를 구현한 메세지 브로커이다.
AMQP란 클라이언트 메세지가 미들웨어 브로커와 통신할 수 있게 해주는 메세징 프로토콜이다.

Producer: 메세지를 보내는 프로그램
Consumer: 메세지를 받기 기다리는 프로그램
Queue: Producer 들이 발송한 메세지들이 Consumer 소비전까지 보관되는 장소. RabbitMQ의 우편함.

Producer -> Broker(Exchange/Binding/Queue) -> Consumer
메세지를 보내는 Producer에서 Broker의 Exchange로 메세지를 전달하면 Binding이라는 규칙에 의해 연결된 Queue로 메세지가 복사된다. 메세지를 받아가는 Consumer에서는 Broker의 Queue를 통해 메세지를 처리한다.
Exchange: Producer들에게 전달받은 메세지를 어떤 Queue에 발송할지 결정하는 객체
Binding: Exchange에게 받은 메세지를 라우팅 할 규칙을 지정하는 행위. ch.bindQueue('큐이름','익스체인지이름')
Producer와 Consumer, Broker은 같은 호스트 내에 존재할 필요는 없다.

전송

RabbitMQ서버에 접속-> 채널생성 -> 큐 선언( 큐가 없으면 생성) -> 큐에 메세지 전송

수신

RabbitMQ서버에 접속-> 채널생성 -> 큐 선언( 큐가 없으면 생성) -> 서버에 메세지 전달을 요청후 대기 -> 큐에 메세지가 들어오면 콜백 호출

Exchange

RabbitMQ에서 프로듀서는 큐에 메세지를 다이렉트로 전송하지 않는다. Exchange에만 메세지를 전송 할 수 있다.

Exchange의 type: Direct/Fanout/Topic/Headers

Direct: Exchange의 디폴트이다. 라운드로빈 방식이다. routing Key와 일치하는 큐에 메세지를 전달한다.
Fanout: routing Key관계없이 모든 큐에 동일한 메세지를 전달한다.
Topic: routing Key전체가 일치하거나 일부 패턴에 맞는 모든 큐에 동일한 메세지를 전달한다.
Headers: routing Key대신 메세지 해더에 여러 속성들을 더해 속성이 매칭되는 큐에 메세지를 전달한다.

RPC(Remote Procedure Call)

RabbitMQ의 RPC는 단방향 메세지 전송이 아닌, Request-Response로 Client와 Server를 이어준다.

RabbitMQ는 callback_queue를 이용해 RPC 기능을 지원한다.
Client에서
reply_to는 callback_queue의 이름, correlation_id는 각 리퀘스트마다 고유한 값으로 설정한다.
리퀘스트는 RPC큐에 전송된다.
Server은
메세지 수신 후 작업을 수행한다. 결과를 reply_to 필드 이름의 큐로 전송한다.
Client는 callback_queue에 메세지 도착을 기다리고 correlation_id 값이 일치시에 메세지를 받는다.

profile
Code by hedy

0개의 댓글