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๋ก ๋ค์ด๊ฐ๋ฉด ๊ด๋ฆฌ์ ํ์ด์ง๋ฅผ ๋ค์ด๊ฐ ์ ์๋ค.








