반응형
RabbitMQ란?
- RabbitMQ는 AMQP를 따르는 오픈소스 메세지 브로커
- AMQP는 클라이언트가 메시지 미들웨어 브로커와 통신할 수 있게 해주는 메세징 프로토콜
- 주요 개념으로 Producer, Exchange, Binding, Queue, Consumer가 있음
- Exchange, Binding, Queue는 Broker 영역에 해당됨
왜 사용하는가?
- 메시지를 많은 사용자에게 전달해야할 때
- 요청에 대한 처리시간이 길어 해당 요청을 다른 API에 위임하고 빠른 응답처리가 필요할 때
- 애플리케이션 간 결합도를 낮춰야 할 때
Producer
- 메시지를 생성하고 발송하는 주체
- 메시지를 Queue에 직접 전달하지 않고 항상 Exchange를 통해 전달함
Consumer
- 메시지를 수신하는 주체
- Queue에 직접 접근하여 메시지를 가져옴
Queue
- Producer들이 발송한 메세지들이 Consumer가 소비하기 전까지 보관되는 장소
- 같은 이름, 같은 설정으로 Queue 생성시 에러 없이 기존 Queue에 연결됨
- 같은 이름, 다른 설정으로 Queue 생성시 에러 발생
- Queue는 반드시 미리 정의해야 사용할 수 있음
Exchange
- Producer들에게서 전달 받은 메시지들을 어떤 Queue들에 발송할지를 결정하는 주체
- 일종의 라우터 개념
- Exchange는 네 가지 타입으로 바인딩 가능함 (Direct, Topic, Headers, Fanout)
Binding
- Exchange에게 메시지를 라우팅할 규칙을 지정하는 행위
- 특정 조건에 맞는 메시지를 특정 큐에 전송하도록 설정함
Direct Exchange
- 라우팅 키를 활용해 라우팅하는 타입
- 디폴트로 사용되는 타입
- 하나의 큐에 여러 개의 라우팅 키를 지정 가능
- 여러 큐에 동일 라우팅 키를 지정 가능 (Fanout과 동일하게 작동)
Topic Exchange
- 라우팅 키 패턴을 활용해 라우팅하는 타입
- Q1
- .orange.
- Q2
- **..rabbit
- lazy.*
- 라우팅 키가 example.orange.rabbit일 경우 메시지가 Q1, Q2 모두 전달
- 라우팅 키가 example.orange.turtle 인 경우 메세지가 Q1에만 전달
- 라우팅 키가 lazy.grape.rabbit인 경우엔 메세지가 Q2에 한 번만 전달. (라우팅 패턴이 여러 개 일치하더라도 하나의 큐에는 메세지가 한 번만 전달됨)
Header Exchange
- Topic Exchange와 유사함
- 라우팅을 위해 key:value 형태의 헤더를 사용함
Fanout Exchange
- 등록된 모든 Queue에 메시지 전달
Message 및 Queue 보존
- RabbitMQ가 종료되면 기본적으로 Queue는 모두 제거됨
- Message와 Queue 데이터를 보존하기 위해서 Queue 생성시 Durable 옵션에 true 주고 생성해야함
- Producer가 메시지 발송시 PERSISTENT_TEXT_PLAIN 옵션을 주어야함
Prefetch Count
- 하나의 Queue에 여러 Consumer가 존재할 경우, Queue는 기본적으로 Round-Robin 방식으로 메세지를 분배함.
- Consumer가 2개인 상황에서 홀수번째 메세지는 처리 시간이 짧고, 짝수번째 메세지는 처리 시간이 매우 긴 경우, 계속해서 하나의 Consumer만 일을 하게 되는 상황이 발생할 수 있음
- 이를 예방하기 위해, prefetch count를 1로 설정해 두면, 하나의 메세지가 처리되기 전(Ack를 보내기 전)에는 새로운 메세지를 받지 않게 되므로, 작업을 분산시킬 수 있음
Channels
- Consumer 어플리케이션에서 Broker 로 많은 연결을 맺는 것은 바람직하지 않다.
- RabbitMQ는 Channel 이라는 개념을 통해 하나의 TCP 연결을 공유해서 사용할 수 있는 기능을 제공한다.
- 하지만 멀티 스레드, 멀티 프로세스를 사용하는 작업에서는 각각 별도의 Channel 을 열고 사용하는 것이 바람직하다.
Virtual Hosts
- 하나의 Broker 에서 운영 환경(ex. live, dev)에 따라 Users, Exchange, Queue 등을 각각 사용할 수 있는 Vhosts 컨셉을 갖고 있다.
참고
반응형
'Development > RabbitMQ' 카테고리의 다른 글
[RabbitMQ] Spring 연동 (0) | 2020.12.30 |
---|---|
[RabbitMQ] Web UI (0) | 2020.12.30 |
[RabbitMQ] 클러스터 구성하기 (0) | 2020.12.30 |
[RabbitMQ] 설치하기 (0) | 2020.12.30 |