MessageQueue ์˜ ์žฅ์ ๊ณผ RabbitMQ vs Kafka

2024. 4. 25. 13:18ยท๐Ÿ“‚ infra/message-queue

 ๊ณ ์ „์ ์ธ ๋ฉ”์‹œ์ง€ ํ๋Š” ๋‹จ์ˆœํžˆ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐœํ–‰ํ•˜๊ณ  ์†Œ๋น„ํ•˜๋Š” ํ˜•ํƒœ์˜€์ง€๋งŒ ํ˜„๋Œ€ ๋ฉ”์‹œ์ง€ ํ๋Š” EDA(Event Driven Architecture) ๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด ๋ฉ”์‹œ์ง€๋ฅผ ์˜๊ตฌ ์ €์žฅํ•˜์—ฌ ๋ฐ˜๋ณต ์†Œ๋น„ํ•˜๋Š” ํ˜•ํƒœ๋กœ ๋ณ€ํ™”ํ•˜๊ณ  ์žˆ๋‹ค. ์ด์™€ ๊ฐ™์ด ๋ฉ”์‹œ์ง€๋ฅผ ์˜๊ตฌ ์ €์žฅํ•˜๋Š” ๋ฉ”์‹œ์ง€ ์„œ๋ฒ„๋ฅผ event broker ๋ผ ๋ถ€๋ฅธ๋‹ค. ๊ฐ€์žฅ ๋Œ€์ค‘์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ํ”Œ๋žซํผ์œผ๋กœ๋Š” kafka ์ด๋ฉฐ ๊ณ ์ „์ ์ธ Message Queue ๋“ค๋„ ๋ฉ”์‹œ์ง€๋ฅผ ์ €์žฅ, ์žฌ์†Œ๋น„ํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ๊ฐœ๋ฐœ๋˜๊ณ  ์žˆ๋‹ค. (RabbitMQ ๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ์ €์žฅํ•ด ์žฌ์‹œ์ž‘ํ•  ๋•Œ ๋ฉ”์‹œ์ง€ ์œ ์‹ค์„ ๋ฐฉ์ง€ํ•˜์ง€๋งŒ ์•„์ง์€ ์˜๊ตฌ ์ €์žฅ์ด ๋˜์ง€๋Š” ์•Š๋Š” ๊ฒƒ์œผ๋กœ ์•Œ๊ณ  ์žˆ๋‹ค.)

 

Message Queue ์˜ ์žฅ์ 

 ๋ฉ”์‹œ์ง€ ํ์˜ ๊ณตํ†ต์ ์ธ ์žฅ์ ์€ fan-out(ํŒฌ-์•„์›ƒ), asynchronous processing(๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ), decoupling(๊ฒฐํ•ฉ๋„ ์™„ํ™”) ์ธ ๊ฒƒ ๊ฐ™๋‹ค.

 

 fan-out ๋Š” ๋…ผ๋ฆฌ ํšŒ๋กœ์—์„œ ํ•˜๋‚˜์˜ ๋…ผ๋ฆฌ ๊ฒŒ์ดํŠธ์˜ ์ถœ๋ ฅ์ด ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ๋…ผ๋ฆฌ ๊ฒŒ์ดํŠธ์˜ ์ž…๋ ฅ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š”์ง€ ์„œ์ˆ ํ•  ๋•Œ ์“ฐ์ธ๋‹ค๊ณ  ํ•œ๋‹ค. ์ฆ‰, ์ƒ์‚ฐ์ž๊ฐ€ ๋ฉ”์‹œ์ง€๋ฅผ ๋Œ€๊ธฐ์—ด์— ๋ฐœํ–‰ํ•˜๋ฉด ์—ฌ๋Ÿฌ ์†Œ๋น„์ž๋Š” ๊ฐ๊ฐ์˜ ๋‹ค๋ฅธ ๋ชฉ์ ์œผ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๊ฒฐ์ œ ์„œ๋น„์Šค๋Š” ๊ฒฐ์ œ, ์•Œ๋ฆผ, ๋ถ„์„์˜ ๋‹ค์šด์ŠคํŠธ๋ฆผ ์„œ๋น„์Šค๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. 

fan-out example(source : Why Do We Need a Message Queue?)

 

 

asynchronous processing ๋Š” ๋กœ์ง์„ ๋Œ€๊ธฐํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค. ๋งŒ์•ฝ, Tomcat ๊ธฐ๋ฐ˜์˜ WAS ์—์„œ ์™ธ๋ถ€ API call ์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์‘๋‹ต ์˜ฌ ๋•Œ๊นŒ์ง€ ํ•ด๋‹น ์Šค๋ ˆ๋“œ๊ฐ€ ๋ธ”๋กœํ‚น ๋˜์–ด์•ผ ํ•˜์ง€๋งŒ ๋ฉ”์‹œ์ง€ ํ๋ฅผ ํ™œ์šฉํ•œ๋‹ค๋ฉด ๋Œ€๊ธฐ์—ด์— ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐœํ–‰ํ•˜๊ณ  ๋Œ€๊ธฐ์—ด์„ ๊ตฌ๋…ํ•˜์—ฌ ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•œ๋‹ค๋ฉด ์Šค๋ ˆ๋“œ๋ฅผ ๋ธ”๋กœํ‚นํ•˜์ง€ ์•Š์•„ ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ๊ธฐ๋Œ€ํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋กœ ๊ฒฐ์ œ ์ง€์‹œ๊ฐ€ ๋Œ€๊ธฐ์—ด์— ๋ฐฐ์น˜๋˜๊ณ  ๊ฒฐ์ œ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ๊ณ ๊ฐ์—๊ฒŒ ์•Œ๋ฆผ์„ ์ „์†กํ•˜๋Š” ๋ฐฉ์‹์„ ๋“ค ์ˆ˜ ์žˆ๋‹ค.

 

decoupling ์˜ ์˜๋ฏธ๋Š” ๊ฐ ์„œ๋ฒ„๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ์ˆ˜์ •, ๋ฐฐํฌ ๊ฐ€๋Šฅํ•œ ๊ตฌ์กฐ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด๋‹ค. ์„œ๋น„์Šค๋Š” ์„œ๋กœ ๊ธด๋ฐ€ํ•˜๊ฒŒ ์˜์กดํ•˜์ง€ ์•Š๊ณ  ์ž˜ ์ •์˜๋œ ๋ฉ”์‹œ์ง€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•ด ์„œ๋กœ ์ƒํ˜ธ ์ž‘์šฉํ•˜๋ฉฐ ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„์— ์œ ์—ฐ์„ฑ์„ ์ œ๊ณตํ•œ๋‹ค. horizontal scalability, availability ์€ decoupling ์œผ๋กœ ์ธํ•œ ๋ถ€์ˆ˜ ํšจ๊ณผ์ด๋‹ค. ์ˆ˜์š”์— ๋”ฐ๋ผ ๋…๋ฆฝ์ ์œผ๋กœ ์„œ๋น„์Šค๋ฅผ ํ™•์žฅ ๊ฐ€๋Šฅํ•ด ๋‹ค์ˆ˜ ์š”์ฒญ์— ๋Œ€ํ•œ ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ๊ธฐ๋Œ€ํ•˜๊ณ  ์„œ๋ฒ„์˜ ์•ˆ์ •์„ฑ์— ๊ธฐ์—ฌํ•  ์ˆ˜ ์žˆ๋‹ค.

ํŠน์ • ์„œ๋น„์Šค๋ฅผ API server ๋กœ ๋ถ„๋ฆฌ๋˜๋Š” ๊ฒƒ ๋˜ํ•œ decoupling(๊ฒฐํ•ฉ๋„ ์™„ํ™”) ์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ธ๊ฐ€?? YES (๋‹น์—ฐํ•œ ์ด์•ผ๊ธฐ์ง€๋งŒ ๋‚ด๋ถ€ ์ฝ”๋“œ ๋˜ํ•œ ๋…๋ฆฝ์ ์œผ๋กœ ๋ฐฐํฌ ๊ฐ€๋Šฅํ•œ ๊ตฌ์กฐ์—ฌ์•ผ ํ•  ๊ฒƒ์ด๋‹ค.)

 

RabbitMQ vs Kafka

RabbitMQ vs Kafka (์ถœ์ฒ˜ : bytebytego)

 

 

 RabbiqMQ ์™€ Kafka ๋Š” ์„ฑ๋Šฅ(performance) ์™€ ํ™•์žฅ์„ฑ(scalability) ์—์„œ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค. RabbitMQ ๋Š” ์ดˆ๋‹น ์ˆ˜๋งŒ ๊ฐœ์˜ ๋ฉ”์‹œ์ง€(tens of thousands/sec)๋ฅผ ์ฒ˜๋ฆฌํ•˜์ง€๋งŒ scale-up ์„ ํ•˜๋”๋ผ๋„ ์ฒ˜๋ฆฌ๋Ÿ‰์— ๊ฐœ์„ ์— ํฌ๊ฒŒ ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ํ•œ๋‹ค. ๋ฐ˜๋ฉด kafka ๋Š” ๋†’์€ ํ™•์žฅ์„ฑ์œผ๋กœ ์ดˆ๋‹น ์ˆ˜๋ฐฑ๋งŒ ๊ฐœ์˜ ๋ฉ”์‹œ์ง€(million/sec)๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

 

Kafka ๋Š” ecosystem ์ง€์›์ด ์ž˜ ๋˜์–ด ์žˆ๋‹ค. Kafka ๋Š” ๋Œ€์šฉ๋Ÿ‰ ๋กœ๊ทธ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด ๊ตฌ์ถ•๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ตœ์‹  ๋น…๋ฐ์ดํ„ฐ์™€ ์ŠคํŠธ๋ฆฌ๋ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ํ†ตํ•ฉํ•  ์ˆ˜ ์žˆ๋‹ค. RabbitMQ ๋Š” Kafka ๋งŒํผ์˜ ecosystem ์ง€์›์„ ์ž˜ํ•˜์ง€ ์•Š๋Š”๋‹ค.

 

RabbitMQ ์™€ Kafka ์˜ ๊ฐ€์žฅ ํฐ ์ฐจ์ด์  ์ค‘ ํ•˜๋‚˜๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ์†Œ๋น„ํ•˜๋Š” ํ˜•ํƒœ์ด๋‹ค. RabbitMQ ๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐœํ–‰์ž๊ฐ€ ๋ณด๋‚ด๋Š” ์ฆ‰์‹œ ์†Œ๋น„์ž์—๊ฒŒ ์ „๋‹ฌํ•˜๋Š” ํ‘ธ์‹œ ๋ชจ๋ธ(push model) ์ด๋‹ค. ์†Œ๋น„์ž์—๊ฒŒ ๋ฉ”์‹œ์ง€๋ฅผ ์ „๋‹ฌํ•˜๋ฉด ๋ฉ”์‹œ์ง€๋ฅผ ์‚ญ์ œํ•œ๋‹ค. ํ‘ธ์‹œ ๋ชจ๋ธ์€ ์ฆ‰์‹œ ์†Œ๋น„์ž์—๊ฒŒ ๋ฐ”๋กœ ๋ณด๋‚ด๊ธฐ ๋•Œ๋ฌธ์— ์ง€์—ฐ์ด ๋‚ฎ์€ ์žฅ์ ์ด ์žˆ์ง€๋งŒ, ๋ฐœํ–‰์ž์˜ ๋ฉ”์‹œ์ง€ ์ „์†ก๋Ÿ‰์ด ์ขŒ์šฐ๋˜๋ฏ€๋กœ ์†Œ๋น„์ž๊ฐ€ ๊ทธ์— ๋งž๋Š” ์ฒ˜๋ฆฌ๋Ÿ‰์— ๋Œ€ํ•œ ์ž์› ์ŠคํŽ™์„ ๋งž์ถฐ์•ผ ํ•œ๋‹ค.

Kafka ๋Š” ํ’€ ๋ชจ๋ธ(pull model) ์ด๋‹ค. RabbitMQ ์™€ ๋ฐ˜๋Œ€๋กœ ๋ฉ”์‹œ์ง€ ์†Œ๋น„ ์†๋„๋ฅผ ์†Œ๋น„์ž๊ฐ€ ๊ฒฐ์ •ํ•œ๋‹ค. ํ’€ ๋ชจ๋ธ์€ ์†Œ๋น„์ž๊ฐ€ ๋ฉ”์‹œ์ง€๊ฐ€ ๋งŒ๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๊ด€ํ•˜๊ณ  ์†Œ๋น„์ž๊ฐ€ ์ž์‹ ์˜ ์†๋„์— ๋งž์ถฐ ๋ฉ”์‹œ์ง€๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์–ด ์ผ๊ด„ ์ฒ˜๋ฆฌ์— ์ ํ•ฉํ•˜๋‹ค. ๋ฐ˜๋ฉด, broker ์— ๋ฉ”์‹œ์ง€๊ฐ€ ์—†์–ด๋„ ์†Œ๋น„์ž์—๊ฒŒ ๊ณ„์† ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ๊ฐ€๋ ค๊ณ  ์‹œ๋„ํ•ด ์†Œ๋น„์ž์˜ ์ž์›์„ ๋‚ญ๋น„ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

push model (์ถœ์ฒ˜ : Hookdeck)

 

pull model (์ถœ์ฒ˜ : Hookdeck)

 

 

์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๋น„๊ตํ•ด๋ณด์ž. Kafka ๋Š” ๋กœ๊ทธ ์ฒ˜๋ฆฌ ๋ฐ ๋ถ„์„, ์ถ”์ฒœ์„ ์œ„ํ•œ ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆฌ๋ฐ, ์‹œ์Šคํ…œ ๋ชจ๋‹ˆํ„ฐ๋ง + ์•Œ๋žŒ, ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ ์บก์ฒ˜(CDC), ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๊ณผ ๊ฐ™์€ ๋Œ€์šฉ๋Ÿ‰ ๋ฉ”์‹œ์ง€ ์ฒ˜๋ฆฌํ•˜๋Š”๋ฐ ํ™œ์šฉ๋˜๊ณ  ์žˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ํ•ด๋‹น ๋งํฌ์—์„œ ํ™•์ธํ•ด๋ณผ ์ˆ˜ ์žˆ๋‹ค. RabbiMQ ๋Š” ๋ฉ”์‹œ์ง€ ์ง€์—ฐ๊ณผ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ด ๋ฐœํ–‰์ž๊ฐ€ ๋ฉ”์‹œ์ง€ ์ฒ˜๋ฆฌ ์ง€์—ฐ ์‹œ๊ฐ„์„ ํ—ค๋”(x-delay) ๋ฅผ ํ†ตํ•ด ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์ถœ์ฒ˜ : [bytebytego] How to Choose a Message Queue? Kafka vs. RabbitMQ - Log Processing and Analysis
์ถœ์ฒ˜ : [bytebytego] How to Choose a Message Queue? Kafka vs. RabbitMQ - Delayed Messages

 

 

Reference

  • [๊ฐ€์ƒ ๋ฉด์ ‘ ์‚ฌ๋ก€๋กœ ๋ฐฐ์šฐ๋Š” ๋Œ€๊ทœ๋ชจ ์‹œ์Šคํ…œ ์„ค๊ณ„ ๊ธฐ์ดˆ2] 4์žฅ. ๋ถ„์‚ฐ ๋ฉ”์‹œ์ง€ ํ
  • [bytebytego] Why Do We Need a Message Queue?
  • [wikipedia] fan-out
  • [bytebytego] How to Choose a Message Queue? Kafka vs. RabbitMQ
  • [Hookdeck] Message Queues : Deep Dive

'๐Ÿ“‚ infra > message-queue' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Kafka CLI ๋ช…๋ น์–ด ์‚ดํŽด๋ณด๊ธฐ  (0) 2024.12.04
Kafka ๊ตฌ์กฐ ์‚ดํŽด๋ณด๊ธฐ  (0) 2024.12.03
'๐Ÿ“‚ infra/message-queue' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • Kafka CLI ๋ช…๋ น์–ด ์‚ดํŽด๋ณด๊ธฐ
  • Kafka ๊ตฌ์กฐ ์‚ดํŽด๋ณด๊ธฐ
cooper25
cooper25
  • cooper25
    dev cooper
    cooper25
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (84)
      • ๐Ÿ“‚ backend (34)
        • spring (19)
        • architecture (10)
        • test (5)
      • ๐Ÿ“‚ computer-science (5)
      • ๐Ÿ“‚ programming-language (12)
        • java (12)
      • ๐Ÿ“‚ infra (9)
        • mysql (4)
        • redis (2)
        • message-queue (3)
      • ๐Ÿ“‚ cloud (2)
        • aws (2)
      • ๐Ÿ“‚ frontend (1)
        • react (0)
      • ๐Ÿ“‚ education & lecture (16)
        • ์ธํ”„๋ผ ๊ณต๋ฐฉ (11)
        • ํ•ญํ”Œ ๋ฐฑ์—”๋“œ 7๊ธฐ (5)
      • ๐Ÿ“‚ ai (1)
        • claude (1)
      • ๐Ÿ“‚ etc (2)
        • ํšŒ๊ณ  (1)
        • ์ปจํผ๋Ÿฐ์Šค (1)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ํƒœ๊ทธ
    • ๋ฐฉ๋ช…๋ก
  • ๋งํฌ

  • ๊ณต์ง€์‚ฌํ•ญ

  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    ์ธํ”„๋ผ๊ณต๋ฐฉ
    gof
    kafka
    ํšŒ๊ณ 
    AWS
    Redisson
    UUID
    nGrinder
    ๋ฐ์ดํ„ฐ ์ค‘์‹ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ค๊ณ„
    mysql
    ๋™์‹œ์„ฑ
    spring AOP
    ์Šคํ”„๋ง์บ ํ”„ ํ›„๊ธฐ
    react
    spring-batch
    JPA
    spring
    ํ•ญํ•ดํ”Œ๋Ÿฌ์Šค
    ๊ฐ€์ƒ ๋ฉด์ ‘ ์‚ฌ๋ก€๋กœ ๋ฐฐ์šฐ๋Š” ๋Œ€๊ทœ๋ชจ ์„ค๊ณ„
    spring camp 2025
  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.6
cooper25
MessageQueue ์˜ ์žฅ์ ๊ณผ RabbitMQ vs Kafka
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”