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๋กœ ๋“ค์–ด๊ฐ€๋ฉด ๊ด€๋ฆฌ์ž ํŽ˜์ด์ง€๋ฅผ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋‹ค.