-
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
'CS' 카테고리의 다른 글
브라우저에 네이버 URL을 입력했을 때 벌어지는 일 (0) 2025.02.16 [CS] 디자인 패턴과 프로그래밍 패러다임 (2) 2024.10.22