////
Search
Duplicate
🐰

RabbitMQ (1)

In Memory Broker란?
Spring websocket에서 STOMP 프로토콜을 사용해서 웹소켓 기능을 구현할 때 STOMP는 Message Broker가 필요하다.
별다른 설정 없이 Spring 환경에서 STOMP 프로토콜을 사용한다면 메세지 브로커로 In Memory Broker를 사용하게 된다.
In Memory Broker 단점
세션을 수용할 수 있는 크기가 제한되어 있다.
장애 발생 시 메세지의 유실될 가능성이 높다.
따로 모니터링하는 것이 불편하다.
외부 메세지 브로커
Kafka, RabbitMQ, ActiveMQ 등에서는 STOMP 프로토콜의 Message Broker 기능을 제공해준다.
이들의 힘을 빌려 In Memory 브로커 대신 잘 만들어진 STOMP 전용 외부 브로커를 사용하는 것이 더 좋다.
STOMP 전용 외부 브로커 장점
세션을 수용할 수 있는 크기가 크다.
영구적이며 문제가 발생했을 시 재시도가 가능하여 복구가 가능하다.
간편하게 모니터링을 할 수 있다.
Kafka vs RabbitMQ vs ActiveMQ

Kafka

많은 데이터 전송과 최대 처리량을 유지하기에 대량 데이터 스트리밍에 적합
대용량 실시간 로그 처리에 특화, 단순한 메시지 헤더를 지닌 TCP 기반의 프로토콜 사용으로 오버헤드 감소
분산 시스템으로 인해 분산 및 복제 구성 장점

RabbitMQ

고성능을 목표로 AMQP 프로토콜을 사용하여 개발된 MQ 로 Erlang OTP 기반으로 개발
신뢰성, 유연한 라우팅, 관리 UI의 편리성
실시간 모니터링이 용이하고 다양한 언어 및 OS 지원, RabbitMQ 서버간 클러스터링이 가능
지연 시간을 위해 설계되어, 거의 실시간 처리 가능

ActiveMQ

효율적이고 사용하기 쉬운 오픈 소스
자바로 만든 오픈소스 메시지 브로커
메시지 우선 순위, 일정 관리, 재전송 정책 등을 통해 메시지 처리 및 전달을 세밀하게 제어가능
RabbitMQ 채택 이유

첫번째

한달이라는 짧은 프로젝트 기간내에 Polling 방식과 Websocket을 모두 접목 시켜야 하기 때문에 초기 진입 낮으며, 빠르게 구성할 수 있기 때문이다.

두번째

사용자에게 보다 편리한 서비스를 제공하고 싶기 때문에 지연 시간을 위해 설계되어서, 실시간에 가까운 서비스를 제공할 수 있기 때문이다.
RabbitMQ 3가지 개념

 Exchange

Client 에게 받은 message를 queue에게 전달해준다.

 Binding

exchange와 queue와의 관계를 의미한다.
binding이 되어있어야 exchange가 queue에게 메세지를 전달 할 수 있다.
Routing Key를 입력하여 구분할 수 있다.

 Queue

exchange는 Client 로부터 전달 받은 메세지를 binding되는 queue들에게 동일하게 전달한다.
이때, queue는 전달받은 메세지들을 consumer들에게 전달한다.
@Override public void configureMessageBroker(MessageBrokerRegistry registry) { registry.setPathMatcher(new AntPathMatcher(".")); registry.setApplicationDestinationPrefixes("/pub"); registry.enableStompBrokerRelay("/queue", "/topic", "/exchange", "/amq/queue"); }
Java
복사
기존 enableSimpleBroker 대신 enableStompBrokerRelay 로 입력한 후 메세지 수신 경로를 설정
setPathMatcher(new AntPathMatcher(".") URL을 / -> . 변경 HTTP 통신과 달리 RabbitMQ/ 로 구분자를 짓지 않는다.
@Configuration @EnableRabbit public class RabbitConfig { // Queue 등록 @Bean public Queue queue() { return new Queue(queueName, true); } // Exchange 등록 @Bean public TopicExchange exchange() { return new TopicExchange(exchangeName); } // Exchange와 Queue바인딩 @Bean public Binding binding(Queue queue, TopicExchange exchange) { return BindingBuilder.bind(queue).to(exchange).with(routingKey); } // RabbitMQ와의 메시지 통신을 담당하는 클래스 @Bean public RabbitTemplate rabbitTemplate() { RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory()); rabbitTemplate.setMessageConverter(jackson2JsonMessageConverter()); return rabbitTemplate; } // RabbitMQ와의 연결을 관리하는 클래스 @Bean public ConnectionFactory connectionFactory() { CachingConnectionFactory factory = new CachingConnectionFactory(); factory.setHost(rabbitmqHost); factory.setPort(rabbitmqPort); factory.setUsername(rabbitmqUsername); factory.setPassword(rabbitmqPassword); factory.setVirtualHost("/"); return factory; } }
Java
복사
RabbitMQ 모니터링
RabbitMQ를 설치 후 해당 경로를 yml파일에 입력 후 15672로 들어가면 관리자 페이지를 들어갈 수 있다.