RabbitMQ

AMQP๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์„œ๋กœ ๊ตํ™˜ํ•  ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

MQ๋ฅผ ์˜คํ”ˆ์†Œ์Šค์— ๊ธฐ๋ฐ˜ํ•œ ํ‘œ์ค€ ํ”„๋ฅดํ† ์ฝœ์ด AMQP(Advanced Messsage Queueing Protocol)์ด๋‹ค.

AMQP ์ž์ฒด๊ฐ€ ํ”„๋กœํ† ์ฝœ์„ ์˜๋ฏธํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด ํ”„๋กœํ† ์ฝœ์„ ๊ตฌํ˜„ํ•œ MQ ์ œํ’ˆ๋“ค ์ค‘ ํ•˜๋‚˜๊ฐ€ RabbitMQ์ด๋‹ค.

RabbitMQ ๋™์ž‘

                         Broker
Producers -> [Exchange -- Binding --> Queue] -> Consumers

๋ฉ”์„ธ์ง€๋ฅผ ๋ฐœํ–‰ํ•˜๋Š” Producer์—์„œ Broker์˜ Exchange๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ์ „๋‹ฌํ•˜๋ฉด, Binding ์ด๋ผ๋Š” ๊ทœ์น™์— ์˜ํ•ด ์—ฐ๊ฒฐ๋œ Queue๋กœ ๋ฉ”์‹œ์ง€๊ฐ€ ๋ณต์‚ฌ๋œ๋‹ค. Consumer๋Š” Broker์˜ Queue๋ฅผ ํ†ตํ•ด ๋ฉ”์‹œ์ง€๋ฅผ ์ˆ˜์‹ ํ•ด์„œ ์ฒ˜๋ฆฌํ•œ๋‹ค.

AMQP์—๋Š” ๋„คํŠธ์›Œํฌ์— ๋ฌธ์ œ๊ฐ€ ์žˆ๊ฑฐ๋‚˜, ๋ฉ”์‹œ์ง€๋ฅผ ์ฒ˜๋ฆฌํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์œ„ํ•ด 2๊ฐ€์ง€ ์ˆ˜์‹  ํ™•์ธ ๋ชจ๋ธ์„ ๊ฐ–์ถ”๊ณ  ์žˆ๋‹ค.

  1. Consumer๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›์œผ๋ฉด ๋ช…์‹œ์ ์œผ๋กœ broker์—๊ฒŒ ํ†ต์ง€ํ•˜๊ณ , ๋ธŒ๋กœ์ปค๋Š” ์ด ์•Œ๋ฆผ์„ ๋ฐ›์œผ๋ฉด Queue์—์„œ ๋ฉ”์‹œ์ง€๋ฅผ ์‚ญ์ œํ•œ๋‹ค.

  2. Broker๊ฐ€ ๋ฉ”์‹œ์ง€๋ฅผ ์ „๋‹ฌํ•˜๋ฉด ์ž๋™์œผ๋กœ ์‚ญ์ œํ•˜๋Š” ๋ฐฉ์‹

Exchange Type๊ณผ ๋ผ์šฐํŒ…

circle-info

์šฉ์–ด ์ •๋ฆฌ

Exchange: ์ƒ์‚ฐ์ž๋กœ๋ถ€ํ„ฐ ์ˆ˜์‹ ํ•œ ๋ฉ”์‹œ์ง€๋ฅผ ํ์— ๋ถ„๋ฐฐํ•˜๋Š” ๋ผ์šฐํ„ฐ์˜ ์—ญํ• 

Queue: ๋ฉ”์‹œ์ง€๋ฅผ ๋ฉ”๋ชจ๋ฆฌ๋‚˜ ๋””์Šคํฌ์— ์ €์žฅํ–ˆ๋‹ค๊ฐ€ ์†Œ๋น„์ž์—๊ฒŒ ๋ฉ”์‹œ์ง€๋ฅผ ์ „๋‹ฌํ•˜๋Š” ์—ญํ• 

Binding: Exchange์™€ Queue์˜ ๊ด€๊ณ„๋ฅผ ์ •์˜

Exchange Type: ๋ฉ”์‹œ์ง€๋ฅผ์–ด๋– ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ๋ผ์šฐํŒ…ํ• ์ง€ ๊ฒฐ์ •ํ•˜๋Š” ์ผ์ข…์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜

๋ชจ๋“  ๋ฉ”์‹œ์ง€๋Š” Queue๋กœ ์ง์ ‘์ ์œผ๋กœ ์ „๋‹ฌ๋˜์ง€ ์•Š๊ณ , ๋ฐ˜๋“œ์‹œ Exchange์—์„œ ๋จผ์ € ๋ฐ›๋Š”๋‹ค. ๊ทธ๋ฆฌ๊ณ  Exchange Type๊ณผ Binding ๊ทœ์น™์— ๋”ฐ๋ผ์„œ ์ ์ ˆํ•œ Queue๋กœ ๋ผ์šฐํŒ…๋œ๋‹ค.

[RabbitMQ ์†์„ฑ]

  • Name: Exchange ์ด๋ฆ„

  • Type: ๋ฉ”์‹œ์ง€ ์ „๋‹ฌ ๋ฐฉ์‹ (Exchange Type)

  • Durability: Broker๊ฐ€ ์žฌ์‹œ์ž‘ ๋  ๋•Œ ๋‚จ์•„์žˆ๋Š”์ง€ ์—ฌ๋ถ€ (durable, transient)

  • Auto-delete: ๋งˆ์ง€๋ง‰ Queue ์—ฐ๊ฒฐ์ด ํ•ด์ œ๋˜๋ฉด ์‚ญ์ œ

Bindings

์ƒ์„ฑ๋œ Exchange์—์„œ๋Š” ์ „๋‹ฌ ๋ฐ›์€ ๋ฉ”์‹œ์ง€๋ฅผ ์›ํ•˜๋Š” Queue๋กœ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด Bindings๋ผ๋Š” ๊ทœ์น™์„ ์ •์˜ํ•œ๋‹ค.

๊ฐ„๋‹จํ•˜๊ฒŒ ๋ชฉ์ ์ง€ Queue ์ด๋ฆ„๋งŒ์œผ๋กœ๋„ Binding์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๊ณ , Exchange Type์— ๋”ฐ๋ผ์„œ Routing Key๋ฅผ ์ง€์ •ํ•ด์„œ ๋ฉ”์‹œ์ง€๋ฅผ ํ•„ํ„ฐ๋ง ํ•œ ํ›„ Queue๋กœ ๋ณด๋‚ด๋„๋ก ์ •์˜ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

Exchange Type

RabbitMQ๋Š” 4๊ฐ€์ง€ ์ฃผ์š” Exchage Type์„ ์ œ๊ณตํ•˜๋ฉฐ, ๊ฐ ์œ ํ˜•์€ ๋ฉ”์‹œ์ง€ ๋ผ์šฐํŒ…์„ ์œ„ํ•ด ์„œ๋กœ ๋‹ค๋ฅธ ๋…ผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

  1. Direct Exchange

    Binding Key๊ฐ€ ๋ฉ”์‹œ์ง€์˜ Routing Key์™€ ์ •ํ™•ํžˆ ์ผ์น˜ํ•˜๋Š” ํ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ๋ผ์šฐํŒ…ํ•œ๋‹ค.

    • ์‚ฌ์šฉ ์˜ˆ: ์˜ค๋ฅ˜ ์œ ํ˜•์— ๋”ฐ๋ผ์„œ ํŠน์ • ํ”„๋กœ์„ธ์„œ์— ์˜ค๋ฅ˜ ๋กœ๊ทธ๋ฅผ ์ „์†กํ•œ๋‹ค.

  2. Topic Exchange

    Routing Key์™€ Binding Key๊ฐ€ ์ผ์น˜ํ•˜๊ฑฐ๋‚˜ ์ผ๋ถ€ ํŒจํ„ด๊ณผ ์ผ์น˜ํ•˜๋Š” ๋ชจ๋“  Queue๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.

    ์ปจ์Šˆ๋จธ์—์„œ ๋ฉ”์‹œ์ง€ ํ˜•ํƒœ์— ๋”ฐ๋ผ ์„ ํƒ์ ์œผ๋กœ ์ˆ˜์‹ ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ pub/sub ํŒจํ„ด ๊ตฌํ˜„์— ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

    Binding Key๋Š” ์ (.)์œผ๋กœ ๊ตฌ๋ถ„์ง€์–ด ์ •์˜ํ•œ๋‹ค. *, #๋ฅผ ์ด์šฉํ•ด ์™€์ผ๋“œ ์นด๋“œ๋ฅผ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

    • *๋Š” ๋‹จ์–ด ํ•˜๋‚˜ ์ผ์น˜, #๋Š” 0๋˜๋Š” 1๊ฐœ ์ด์ƒ์˜ ๋‹จ์–ด ์ผ์น˜๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

    • (๋ผ์šฐํŒ… ํ‚ค) quick.orange.rabbit, lazy.orinage.elephant โ†’ (๋ฐ”์ธ๋”ฉ ํ‚ค) *.orange.*

    • (๋ผ์šฐํŒ… ํ‚ค)lazy.orange.elephant, lazy.pink.rabbit โ†’ (๋ฐ”์ธ๋”ฉ ํ‚ค) lazy.#

  3. Fanout Exchange

    Routing Key์— ๊ด€๊ณ„์—†์ด, ๋ฐ”์ธ๋”ฉ๋œ ๋ชจ๋“  ํ์— ๋ฉ”์‹œ์ง€๋ฅผ broadcast ํ•œ๋‹ค.

    • ์‚ฌ์šฉ ์˜ˆ: ๋ชจ๋“  ์„œ๋น„์Šค์— ์‹œ์Šคํ…œ ์ „์ฒด ๊ณต์ง€ ์‚ฌํ•ญ์„ ์ „์†กํ•œ๋‹ค.

  4. Headers Exchange

    Routing Key๊ฐ€ ์•„๋‹Œ ๋ฉ”์‹œ์ง€ ํ—ค๋”์˜ ์†์„ฑ์„ ๊ธฐ์ค€์œผ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ๋ผ์šฐํŒ… ํ•œ๋‹ค.

    Binding Key๋งŒ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ๋‹ค์–‘ํ•œ ์†์„ฑ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐ”์ธ๋”ฉ ํ‚ค๋Š” ๋ฌด์‹œ๋˜๊ณ , ํ—ค๋” ๊ฐ’์ด ๋ฐ”์ธ๋”ฉ ์‹œ ์ง€์ •๋œ ๊ฐ’๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ์—๋งŒ ์ผ์น˜ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ํŒ๋‹จํ•œ๋‹ค.

    • ์‚ฌ์šฉ ์˜ˆ: ์‚ฌ์šฉ์ž ์ •์˜ ํ—ค๋” ์ •๋ณด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ํ๋กœ ์ „์†ก

๋ฉ”์‹œ์ง€๋ฅผ ์ €์žฅํ•˜๋Š” Queue

Consumer ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ Queue๋ฅผ ํ†ตํ•ด ๋ฉ”์‹œ์ง€๋ฅผ ์†Œ๋น„ํ•˜๋Š”๋ฐ, Queue๋Š” ๋ฐ˜๋“œ์‹œ ๋ฏธ๋ฆฌ ์ •์˜ํ•ด์•ผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์—ฐ๊ฒฐ์„ ๊ณต์œ ํ•˜๋Š” Channels

Consumer ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ Broker๋กœ ๋งŽ์€ ์—ฐ๊ฒฐ์„ ๋งบ๋Š” ๊ฒƒ์€ ๋ฐ”๋žŒ์งํ•˜์ง€ ์•Š๋‹ค.

RabbitMQ๋Š” Channel ์ด๋ผ๋Š” ๊ฐœ๋…์„ ํ†ตํ•ด ํ•˜๋‚˜์˜ TCP ์—ฐ๊ฒฐ์„ ๊ณต์œ ํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.

๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ/ํ”„๋กœ์„ธ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ž‘์—…์—์„œ๋Š” ๊ฐ๊ฐ ๋ณ„๋„์˜ Channel์„ ์—ด๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋žŒ์งํ•˜๋‹ค.

  • RabbitMQ์—์„œ ์ง€์›ํ•˜๋Š” ๋ชจ๋“  ํ”„๋กœํ† ์ฝœ์€ TCP ๊ธฐ๋ฐ˜์ด๋‹ค.

rabbitmq์—๋Š” connection๊ณผ channel์˜ ๊ฐœ๋…์ด ์กด์žฌํ•œ๋‹ค.

connection์€ ๋ฌผ๋ฆฌ์ ์€ ์—ฐ๊ฒฐ์„ ์˜๋ฏธํ•˜๋ฉฐ, channel์€ publisher์™€ exchange ๋˜๋Š” consumer์™€ exchange ํ†ต์‹  ๊ฒฝ๋กœ๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ํ•˜๋‚˜์˜ channel์€ ํ•˜๋‚˜์˜ exchange ๋˜๋Š” queue๋งŒ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฆ‰, ์ƒ์‚ฐ์ž์™€ ์†Œ๋น„์ž๋Š” ์ตœ์†Œ ํ•˜๋‚˜์˜ channel์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐœํ–‰ํ•˜๊ฑฐ๋‚˜ ๊ตฌ๋…ํ•  ์ˆ˜ ์žˆ๋Š”๊ฒƒ์ด๋‹ค.

  • ํ”„๋กœ๋“€์„œ์™€ ์ปจ์Šˆ๋จธ๊ฐ€ ์‹คํ–‰์ค‘์ด๋ผ๋ฉด ๋ฌผ๋ฆฌ์ ์œผ๋กœ 2๊ฐœ์˜ ์ปค๋„ฅ์…˜์ด ์กด์žฌํ•˜๊ฒŒ ๋œ๋‹ค.

TTL ์„ค์ •

RabbitMQ์—์„œ Per-Message TTL์€ ๊ฐœ๋ณ„ ๋ฉ”์‹œ์ง€์— ๋Œ€ํ•œ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š” TTL ์†์„ฑ์„ ์˜๋ฏธํ•œ๋‹ค.

์ด ์„ค์ •์€ ๊ฐ ๋ฉ”์‹œ์ง€๊ฐ€ ํ์— ์–ผ๋งˆ๋‚˜ ์˜ค๋žซ๋™์•ˆ ๋ณด๊ด€๋  ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ์ •์˜ํ•œ๋‹ค.

๋ฉ”์„ธ์ง€ TTL (Per-Message TTL)

  1. ๊ธฐ๋Šฅ ์„ค๋ช…

    ํ•ด๋‹น TTL์€ ๋ฉ”์‹œ์ง€๊ฐ€ ํ์— ์ถ”๊ฐ€๋  ๋•Œ ์„ค์ •๋˜๋ฉฐ, ์ถ”๊ฐ€๋œ ๋ฉ”์‹œ์ง€๊ฐ€ ํ์— ๋จธ๋ฌด๋ฅผ ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ์‹œ๊ฐ„์„ ๋ฐ€๋ฆฌ์ดˆ ๋‹จ์œ„๋กœ ์ง€์ •ํ•œ๋‹ค. ์ง€์ •ํ•œ ์‹œ๊ฐ„์ด ์ดˆ๊ณผ๋˜๋ฉด, ๋ฉ”์‹œ์ง€๋Š” ๋งŒ๋ฃŒ๋˜์–ด ํ์—์„œ ์‚ญ์ œ๋œ๋‹ค.

  2. ์„ค์ • ๋ฐฉ๋ฒ•

    ๋ฉ”์‹œ์ง€ ์†์„ฑ ์ค‘์—์„œ โ€˜expirationโ€™ ํ•„๋“œ ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ํ•„๋“œ๋Š” ๋ฌธ์ž์—ด ํ˜•ํƒœ๋กœ TTL ๊ฐ’์„ ์ง€์ •ํ•œ๋‹ค. (1000 ๋ฐ€๋ฆฌ์ดˆ = 1์ดˆ)

  3. ์šฐ์„ ์ˆœ์œ„

    ๋งŒ์•ฝ ํ์— ๋Œ€ํ•œ TTL๊ณผ ๋ฉ”์‹œ์ง€์— ๋Œ€ํ•œ TTL์ด ๋ชจ๋‘ ์„ค์ •๋˜์–ด ์žˆ๋‹ค๋ฉด, ๊ฐ’์ด ๋” ์งง์€ TTL์ด ์ ์šฉ๋œ๋‹ค.

NACK (Negative Acknowledgement)

NACK ์ƒํƒœ๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›์•˜์ง€๋งŒ ์ฒ˜๋ฆฌํ•˜์ง€ ๋ชปํ•œ ์ƒํƒœ๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ, ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›์€ Consumer๊ฐ€ ๋ฉ”์‹œ์ง€๋ฅผ ์ฒ˜๋ฆฌํ•˜์ง€ ๋ชปํ•˜๊ฑฐ๋‚˜ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

Acknowledge Mode

RabbitMQ์˜ Acknowledge Mode๋Š” ์†Œ๋น„์ž(Consumer)๊ฐ€ ๋ฉ”์‹œ์ง€๋ฅผ ์„ฑ๊ณต์ ์œผ๋กœ ์ฒ˜๋ฆฌํ–ˆ์Œ์„ RabbitMQ ์„œ๋ฒ„์— ์•Œ๋ฆฌ๋Š” ๋ฐฉ์‹์„ ์˜๋ฏธํ•˜๋Š”๋ฐ, ์ฃผ๋กœ ๋‘ ๊ฐ€์ง€ ๋ชจ๋“œ๊ฐ€ ์กด์žฌํ•œ๋‹ค.

  • ์ฆ‰, ๋ฉ”์‹œ์ง€ ์†Œ๋น„ ํ›„ ์Šน์ธ(acknowledge) ๋ฐฉ์‹์„ ๊ฒฐ์ •ํ•˜๋Š” ์„ค์ •์ด๋‹ค.

  1. AUTO

    • ๋ฉ”์‹œ์ง€๊ฐ€ ์†Œ๋น„์ž์—๊ฒŒ ์ „๋‹ฌ๋˜๋Š” ์ฆ‰์‹œ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌ๋œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•œ๋‹ค.

    • ์‹ค์ œ ๋ฉ”์‹œ์ง€ ์ฒ˜๋ฆฌ ์„ฑ๊ณต ์—ฌ๋ถ€์™€ ๊ด€๊ณ„์—†์ด ํ์—์„œ ๋ฉ”์‹œ์ง€๋ฅผ ์ œ๊ฑฐ

    • ์„ฑ๋Šฅ์€ ๋†’์ง€๋งŒ ๋ฉ”์‹œ์ง€ ์†์‹ค ์œ„ํ—˜

  2. MANUAL

    • ์†Œ๋น„์ž๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ ์ฒ˜๋ฆฌ ์„ฑ๊ณต(ack) ๋˜๋Š” ์‹คํŒจ(nack/reject)๋ฅผ ์•Œ๋ฆผ

    • ๋ฉ”์‹œ์ง€ ์ฒ˜๋ฆฌ ์™„๋ฃŒ ํ›„ ์ˆ˜๋™์œผ๋กœ ํ™•์ธ์„ ๋ณด๋‚ด์•ผ ํ์—์„œ ๋ฉ”์‹œ์ง€ ์ œ๊ฑฐ

    • ์†์‹ค ๋ฐฉ์ง€์—๋Š” ํšจ๊ณผ์ ์ด์ง€๋งŒ ์ถ”๊ฐ€์ ์ธ ์ฒ˜๋ฆฌ ๊ณผ์ • ํ•„์š”

    • spring์—์„œ๋Š” Channel.basicAck(), Channel.basicNack() ์ง์ ‘ ํ˜ธ์ถœ

Last updated