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로 들어가면 관리자 페이지를 들어갈 수 있다.