RabbitMQ에 대해서

Red Culture·2021년 7월 19일
1

MQ란

Producer, Consumer가 존재해서 Producer는 메시지를 Queue에 전송하고 Consumer가 Queue의 메시지를 처리하는 방식이다. 비동기로 요청을 처리하고 Queue에 저장하여 Consumer에게 병목을 줄여줄 수 있다.

RabbitMQ란

AMQP를 따르는 오픈소스 메세지 브로커
(AMQP는 클라이언트가 메시지 미들웨어 브로커와 통신할 수 있게 해주는 메세징 프로토콜)

  • 사용 이유
    -메세지를 많은 사용자에게 전달하고자 할 때
    -요청에 대한 처리시간이 길어 요청을 다른 api에게 위임하고 빠른 응답 처리가 필요할 때
    -애플리케이션 간 결합도를 낮추고자 할 때
  • 주요 구성 요소와 동작 원리

1) Producer

메시지를 생성하고 발송하는 주체, 메시지 전달 시 Queue에 전달하지 않고 Exchange를 통해 전달한다.

2) Consumer

메시지를 수신하는 주체, Queue에 직접 접근하여 메시지를 가져온다.

3) Queue

Producer들이 발송한 메시지들이 Consumer가 소비하기 전까지 보관되는 장소이다.
같은 이름, 같은 설정으로 Queue 생성 시 에러없이 기존 Queue에 연결된다. (같은 이름, 다른 설정은 Queue 생성 시 에러 발생)
반드시 미리 정의해야 한다.

4) Exchange

Producer들에게서 전달 받은 메시지들을 어떤 Queue들에게 발송할지 결정하는 주체이다.
일종의 라우터 개념으로 4가지 타입으로 바인딩 가능하며, 특징은 다음과 같다.

  1. Direct: 라우팅 키가 정확히 일치하는 Queue에 메시지 전송 (Unicast)
  2. Topic: 라우팅 패턴이 일치하는 Queue에 메시지 전송 (Multicast)
  3. Headers: [key, value]로 이루어진 header 값을 기준으로 일치하는 Queue에 메시지 전송 (Multicast)
    *Headers는 모든 header가 일치할 때, 하나라도 일치할 때 메시지 전송 등 옵션을 줄 수 있다.
  4. Fanout: 해당 Exchange에 등록된 모든 Queue에 메시지 전송 (Broadcast)

5) Binding

Exchange에게 메시지를 라우팅할 규칙을 지정하는 행위이다.
특정 조건에 맞는 메시지를 특정 Queue에 전송할 수 있는데 Exchange 타입에 맞게 설정해야 한다. (Exchange와 Queue는 m:n 바인딩 가능)

7) Message 및 Queue 보존

RabbitMQ 서버가 종료되면 Queue는 모두 제거된다. 메시지와 Queue를 보존하기 위해서 Queue를 생성할 때 Durable 옵션을 true로 주어야한다. 또한, Producer가 메시지 발송 시 PERSISTENT_TEXT_PLAIN 옵션을 주어야 한다.

8) Prefetch Count

하나의 Queue에 여러 Consumer가 존재할 경우, Queue는 Round-Robin 방식으로 메시지를 분배한다. RR 방식이기 때문에 Consumer가 2개인 환경에서 홀수 번째는 처리 시간이 짧고, 짝수 번째는 처리 시간이 길다면 짝수 번째를 처리하는 Consumer만 일하는 시간이 길어질 수 있다.
이를 방지하기 위해 Prefetch Count를 1로 설정하면 하나의 메시지가 처리되기 전에는 새로운 메시지를 받지 않으므로 작업을 분산시킬 수 있다.

9) Channels

Consumer 애플리케이션에서 Broker로 많은 연결을 맺는 것은 좋지 않다. Channel이라는 개념을 통해 하나의 TCP 연결을 공유해서 사용할 수 있는 기능을 제공한다. 하지만, 멀티 쓰레드/멀티 프로세스를 사용하는 작업에서는 각각 별도의 channel을 열고 사용하는 것이 좋다.

10) Virtual Hosts

하나의 Broker에서 운영환경에 따라 Exchange, Queue 등을 각각 사용할 수 있는 Vhosts(가상 호스트) 컨셉을 갖고 있다.

트랜잭션 관리

만약.. Producer가 메시지를 발송한 것을 다시 취소하거나 롤백할 수는 없을까..?
개인적인 생각으로는 상쇄하는 데이터를 발송하거나 취소 Queue를 발송하는 방법이 있을 것 같다.

브로드캐스팅 방법

모니터링 방법

1) 모니터링 플러그인 추가(rabbitmq cmd) - rabbitmq-plugins enable rabbitmq-management
2) rabbitmq 서비스 재시작 - http://localhost:15672으로 모니터링 가능

동시성 관리

클러스터링을 구현하는 방법

*참고 자료
https://sg-choi.tistory.com/406
https://blog.dudaji.com/general/2020/05/25/rabbitmq.html
https://velog.io/@cjy9306/Kafka%EC%9D%B4%EB%B2%A4%ED%8A%B8-%EB%B8%8C%EB%A1%9C%EC%BB%A4-vs-RabbitMQ%EB%A9%94%EC%8B%9C%EC%A7%80-%EB%B8%8C%EB%A1%9C%EC%BB%A4

profile
자기 개발, 학습 정리를 위한 블로그

1개의 댓글

comment-user-thumbnail
2024년 2월 23일

안녕하세요 좋은글 보고갑니다. 그래서 큐에 이미 담긴 메세지를 취소할수있는 방법 찾으셨나요??

답글 달기