ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Rabbit MQ에 대해
    Message Queue 2021. 8. 14. 00:13

    Rabbit MQ를 공부하고, 정리하기 위한 포스팅으로 

    설치 과정은 담지 않았습니다.

     

     

    RabbitMQ

    RabbitMQ는 Advanced Message Queueing Protocol ( AMQP )을 따르는 메시지 브로커입니다.

     

    장점

    1. 메시지 ( 데이터 )를 여러 사용자에게 전달해야 할 때 용이함

    2. 빠른 응답 처리로 성능이 뛰어남

    3. 어플리케이션 간 결합도를 낮출 수 있음 

    4. Queue이기에 메시지 누락이 적고 순서를 보장함 

    5. 외부 의존성이 없음

    6. 동시성이 뛰어남 

    7. Scale out Clerstering이 쉬움

    8. STOMP 등 웹 소켓 프로토콜을 지원함

    9. 비동기적으로 동작

    10. 멀티 스레드로 동작


    Rabbit MQ의 키워드

    1. Producer

    메시지를 생성하고 발송하는 주체

    생성한 메시지를 Exchange를 통해 발송

     

    2. Exchange

    메시지를 어떤 큐로 전달할지 결정하는 주체

    총 4가지의 타입 ( Direct, Topic, Header, Fanout )이 존재하는 라우터

     

    3. Binding

    Exchange가 어떤 Queue로 메시지를 전달할 때 규칙을 정하는 것

    특정 조건에 맞는 메시지를 특정 큐에 전달할 수 있도록 한다 

     

    4. Queue

    Producer가 발송한 메시지를 저장하는 주체로 Queue 형식으로 저장된다

    Consumer가 소비하기 전까지 저장되어 있음

     

    5. Consumer

    메시지를 소비하는 주체

    Queue에 접근해 메시지를 소비한다 


    Exchange

    1. Direct Exchange

    - Default Exchange

    - 라우팅 키를 통해 라우팅 키와 같은 Queue에 메시지를 전달

    - 여러 큐에 동일한 라우팅 키를 지정할 수 있음 ( 이 경우 Fanout Exchange와 같이 동작 )

    - Direct Exchange는 Rabbit MQ의 Default Exchange

    다음 그림은 일반적인 Direct Exchange의 사용입니다

    Direct Exchange Example

    1. Producer -> Producer의 메시지 발행 후 Direct Exchange에 전달

    2. Binding -> Direct Exchange가 메시지를 받고 라우팅 키를 통해 각 바인딩 규칙에 맞는 Queue에 메시지를 전달 

    3. Consume -> 각 Queue에 저장된 메시지를 Consumer가 소비

     

     

     

    2. Topic Exchange

    - 라우팅 키 패턴을 통해 Queue에 메시지를 전달

    EX) A, B, C와의 채팅방이 각각 존재할 때 각 사용자들과 대화한다면 

    chat.A -> A와의 채팅을 위한 라우팅 키 패턴

    chat.B -> B와의 채팅을 위한 라우팅 키 패턴

    chat.C -> C와의 채팅을 위한 라우팅 키 패턴 

    와 같은 키 패턴으로 사용자를 구분해 올바른 채팅방을 이용할 수 있음 

    Topic Exchange Example

    1. Producer -> Producer의 메시지 발행 후 Topic Exchange에 전달

    2. Binding -> Topic Exchange가 메시지를 받고 라우팅 키를 통해 각 바인딩 규칙에 맞는 Queue에 메시지를 전달 

    3. Consume -> 각 Queue에 저장된 메시지를 Consumer가 소비

     

    각 Queue의 라우팅 키 규칙은 

    먼저 * , # 을 통해 와일드카드를 표현할 수 있습니다. 

    *는 단어 하나 일치, #은 복수의 단어가 일치해도 된다는 뜻으로 

    *가 들어간 자리에 아무 값이나 넣어도 된다는 의미로 사용해 왔습니다. 

     

    Queue 1의 경우 A.* 인데 이는 A.B , A.ABC, A.ABCDEDFG가 와도 Queue 1에 메시지를 전달하게 됩니다 

    Queue 2의 경우 *.B.*로 이는 A.B.C, B.B.B, A.B.B, ABC.B.CDE가 와도 Queue 2에 메시지를 전달하게 됩니다

    Queue 3의 경우 *.*.C도 마찬가지로 동작하게 됩니다. 

     

    만약 메시지의 라우팅 키가 A.B.C 라면 Queue 2와 Queue 3 두 개의 큐에 모두 메시지가 전달됩니다. 

    Queue 1의 경우 A.* 이기에 단어 하나만 허용되고 만약 Queue 1의 바인딩 규칙이 A.#이었다면 큐 세 개 모두에게 전달될 것입니다. 

     

    3. Fanout Exchange

    - 라우팅 키를 사용하지 않고 모든 Queue에 메시지를 전달

     

    Fanout Exchange Example

    Fanout 방식은 모든 Queue에 메시지를 전달합니다. 

     

    Fanout Exchage로 전달한 메시지들이 중복되는지 확인해보기 위해 

    Spring Boot 환경에서 

    Fanout Exchange와 각 Queue를 바인딩해줍니다. 

        @Bean
        Queue fanoutTest(){return new Queue("fanout-test",false);}
    
        @Bean
        Queue fanoutTest2(){return new Queue("fanout-test2",false);}
    
        @Bean
        Queue fanoutTest3(){return new Queue("fanout-test3",false);}
    
        @Bean
        FanoutExchange fanoutExchange(){return new FanoutExchange("fanout-exchange");}
        
        @Bean
        Binding fanoutBinding(Queue fanoutTest, FanoutExchange fanoutExchange){
            return BindingBuilder.bind(fanoutTest).to(fanoutExchange);
        }
        @Bean
        Binding fanoutBinding2(Queue fanoutTest2, FanoutExchange fanoutExchange){
            return BindingBuilder.bind(fanoutTest2).to(fanoutExchange);
        }
        @Bean
        Binding fanoutBinding3(Queue fanoutTest3, FanoutExchange fanoutExchange){
            return BindingBuilder.bind(fanoutTest3).to(fanoutExchange);
        }

    생성한 fanout-exchange에 테스트용 Queue 3개가 바인딩 된 모습

     

    큐 3개를 연결했을 때 모든 큐에게 동일한 메시지를 발행하는지 확인한 결과 

    2021-08-13 23:28:33.722  INFO 17512 --- [ntContainer#1-1] k.s.daangn.service.push.RabbitConsumer   : First : Fanout 중복 테스트4c8dee05-1843-43a7-a0e6-44a4a9d62726
    2021-08-13 23:28:33.723  INFO 17512 --- [ntContainer#2-1] k.s.daangn.service.push.RabbitConsumer   : Third : Fanout 중복 테스트4c8dee05-1843-43a7-a0e6-44a4a9d62726
    2021-08-13 23:28:33.722  INFO 17512 --- [ntContainer#0-1] k.s.daangn.service.push.RabbitConsumer   : Second :Fanout 중복 테스트4c8dee05-1843-43a7-a0e6-44a4a9d62726

    같은 메시지를 모든 큐에게 전달함을 확인할 수 있었습니다.

     

    4. Header Exchange

    - Topic Exchange와 유사한 동작

    - key : value 형태의 헤더를 사용해 라우팅해 메시지를 전달합니다.

     

    'Message Queue' 카테고리의 다른 글

    Rabbit MQ 분배 패턴과 멀티 컨슈머  (0) 2021.08.14

    댓글

Designed by Tistory.