ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • RabbitMQ에 대하여
    CS 2024. 3. 3. 17:17

    RabbitMQ

    서버간(Producers → Consumers) 메세지를 전달해주는 오픈소스 메세지 브로커

    AMQP를 구현한 메세지 브로커

    • AMQP(Advanced Message Queuing Protocol)
    • 인스턴스가 데이터를 서로 교환할 때 사용하는 방법
    • 해당 프로토콜을 구현한 MQ제품들이 여러가지가 있으며, 그 중 하나가 RabbitMQ인 것
    • 구성요소
      • Exchange
      • Queue
      • Binding

    애플리케이션간 결합도를 낮출 수 있음

    이럴 때 사용하면 좋다!

    • 요청을 많은 사용자에게 전달할 때
    • 요청에 대한 처리 시간이 길 때
    • 많은 작업이 요청되어 처리를 해야할 때

    → 나 같은 경우는 이번 프로젝트에서 크롤링과 gpt api를 사용해야 하는데, 요청 처리 시간이 길어 RabbitMQ 사용을 고려 중이다.

     

    [그림 설명]

    • Producer
      • 요청을 보내는 주체, 보내고자 하는 메세지를 exchange에 publish함
      • 메세지를 생성하고 발송하는 주체
      • Exchange를 통해서 Queue에 접근함
    • Consumer: Producer로 부터 메세지를 받아 처리하는 주체
    • Exchange: Producer로 부터 전달 받은 메세지를 어떤 Queue로 보낼지 결정하는 장소. 4가지 타입이 있음. 메세지를 어떤 방법으로 라우팅할지 결정하는 일종의 알고리즘.
    • Queue: Consumer가 메세지를 consume하기 전까지 보관하는 장소
    • Binding: Exchange와 Queue의 관계를 정의. 보통 사용자가 특정 exchange가 특정 Queue를 Binding하도록 정의함 (fanout 타입은 예외)

     

    Exchange 속성

    • Name: Exchange 이름
    • Type: 메시지 전달 방식
      • Direct Exchange: 바인딩 된 Queue 중에서 메시지의 라우팅 키와 매핑되어 있는 Queue로 메시지를 전달(1 : 1)

    • Fanout Exchange: 메시지의 라우팅 키를 무시하고 Exchange에 바인딩 된 모든 Queue에 메시지를 전달 (1 : N)
    • Topic Exchange: Exchange에 바인딩된 Queue 중에서 메시지의 라우팅 키 패턴이 일치하는 Queue에게 모두 메시지를 전달. 여러 Consumer에서 메시지 형태에 따라 선택적으로 수신해야하는 경우 등등 다양한 패턴 구현에 활용될 수 있음.

    • Headers Exchange: 라우팅 키 대신 메시지 헤더에 [key:value]로 이루어진 header값을 기준으로 일치하는 큐에 메시지를 전달
    • Durability: 브로커가 재시작될 때 남아있는지 여부
      • Durable: 브로커가 재시작되어도 디스크에 저장되어 남아있음
      • Transient: 브로커가 재시작되면 사라짐
    • Auto-delete: 마지막 Queue 연결이 해제되면 삭제

     

     

     

    Message Queue 및 Message 보존

    RabbitMQ 서버가 종료 후 재기동하면, 기본적으로 Queue는 모두 제거됨

    [대안]

    • Queue를 생성할 때, Durable 옵션을 true하고 생성해야 함
    rabbitmqChannel.queueDeclare(rabbitmqQueueName, true, false, false, null)
    • Producer가 메시지를 발송할 때, PERSISTENT_TEXT_PLAIN 옵션을 주어야 메시지가 보존됨
    rabbitmqChannel.basicPublish(exchangeName, routingKey
        , MessageProperties.PERSISTENT_TEXT_PLAIN, message.getBytes());

     

     

     

     

     

    [참고]

    https://velog.io/@sdb016/RabbitMQ-기초-개념

    https://ram2ram2.tistory.com/3

    https://somaz.tistory.com/119

     

Designed by Tistory.