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๊ฐ์ง ์์ ํ์ธ ๋ชจ๋ธ์ ๊ฐ์ถ๊ณ ์๋ค.
Consumer๋ ๋ฉ์์ง๋ฅผ ๋ฐ์ผ๋ฉด ๋ช ์์ ์ผ๋ก broker์๊ฒ ํต์งํ๊ณ , ๋ธ๋ก์ปค๋ ์ด ์๋ฆผ์ ๋ฐ์ผ๋ฉด Queue์์ ๋ฉ์์ง๋ฅผ ์ญ์ ํ๋ค.
Broker๊ฐ ๋ฉ์์ง๋ฅผ ์ ๋ฌํ๋ฉด ์๋์ผ๋ก ์ญ์ ํ๋ ๋ฐฉ์
Exchange Type๊ณผ ๋ผ์ฐํ
์ฉ์ด ์ ๋ฆฌ
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์ ์ ๊ณตํ๋ฉฐ, ๊ฐ ์ ํ์ ๋ฉ์์ง ๋ผ์ฐํ ์ ์ํด ์๋ก ๋ค๋ฅธ ๋ ผ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ค.
Direct Exchange
Binding Key๊ฐ ๋ฉ์์ง์ Routing Key์ ์ ํํ ์ผ์นํ๋ ํ๋ก ๋ฉ์์ง๋ฅผ ๋ผ์ฐํ ํ๋ค.
์ฌ์ฉ ์: ์ค๋ฅ ์ ํ์ ๋ฐ๋ผ์ ํน์ ํ๋ก์ธ์์ ์ค๋ฅ ๋ก๊ทธ๋ฅผ ์ ์กํ๋ค.
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.#
Fanout Exchange
Routing Key์ ๊ด๊ณ์์ด, ๋ฐ์ธ๋ฉ๋ ๋ชจ๋ ํ์ ๋ฉ์์ง๋ฅผ
broadcastํ๋ค.์ฌ์ฉ ์: ๋ชจ๋ ์๋น์ค์ ์์คํ ์ ์ฒด ๊ณต์ง ์ฌํญ์ ์ ์กํ๋ค.
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)
๊ธฐ๋ฅ ์ค๋ช
ํด๋น TTL์ ๋ฉ์์ง๊ฐ ํ์ ์ถ๊ฐ๋ ๋ ์ค์ ๋๋ฉฐ, ์ถ๊ฐ๋ ๋ฉ์์ง๊ฐ ํ์ ๋จธ๋ฌด๋ฅผ ์ ์๋ ์ต๋ ์๊ฐ์ ๋ฐ๋ฆฌ์ด ๋จ์๋ก ์ง์ ํ๋ค. ์ง์ ํ ์๊ฐ์ด ์ด๊ณผ๋๋ฉด, ๋ฉ์์ง๋ ๋ง๋ฃ๋์ด ํ์์ ์ญ์ ๋๋ค.
์ค์ ๋ฐฉ๋ฒ
๋ฉ์์ง ์์ฑ ์ค์์ โexpirationโ ํ๋ ์์ฑ์ ์ฌ์ฉํ์ฌ ์ค์ ํ ์ ์๋ค. ์ด ํ๋๋ ๋ฌธ์์ด ํํ๋ก TTL ๊ฐ์ ์ง์ ํ๋ค. (1000 ๋ฐ๋ฆฌ์ด = 1์ด)
์ฐ์ ์์
๋ง์ฝ ํ์ ๋ํ TTL๊ณผ ๋ฉ์์ง์ ๋ํ TTL์ด ๋ชจ๋ ์ค์ ๋์ด ์๋ค๋ฉด, ๊ฐ์ด ๋ ์งง์ TTL์ด ์ ์ฉ๋๋ค.
NACK (Negative Acknowledgement)
NACK ์ํ๋ ๋ฉ์์ง๋ฅผ ๋ฐ์์ง๋ง ์ฒ๋ฆฌํ์ง ๋ชปํ ์ํ๋ฅผ ์๋ฏธํ๋ฉฐ, ๋ฉ์์ง๋ฅผ ๋ฐ์ Consumer๊ฐ ๋ฉ์์ง๋ฅผ ์ฒ๋ฆฌํ์ง ๋ชปํ๊ฑฐ๋ ์๋ฌ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ๋ฅผ ์๋ฏธํ๋ค.
Acknowledge Mode
RabbitMQ์ Acknowledge Mode๋ ์๋น์(Consumer)๊ฐ ๋ฉ์์ง๋ฅผ ์ฑ๊ณต์ ์ผ๋ก ์ฒ๋ฆฌํ์์ RabbitMQ ์๋ฒ์ ์๋ฆฌ๋ ๋ฐฉ์์ ์๋ฏธํ๋๋ฐ, ์ฃผ๋ก ๋ ๊ฐ์ง ๋ชจ๋๊ฐ ์กด์ฌํ๋ค.
์ฆ, ๋ฉ์์ง ์๋น ํ ์น์ธ(acknowledge) ๋ฐฉ์์ ๊ฒฐ์ ํ๋ ์ค์ ์ด๋ค.
AUTO
๋ฉ์์ง๊ฐ ์๋น์์๊ฒ ์ ๋ฌ๋๋ ์ฆ์ ์๋์ผ๋ก ์ฒ๋ฆฌ๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผํ๋ค.
์ค์ ๋ฉ์์ง ์ฒ๋ฆฌ ์ฑ๊ณต ์ฌ๋ถ์ ๊ด๊ณ์์ด ํ์์ ๋ฉ์์ง๋ฅผ ์ ๊ฑฐ
์ฑ๋ฅ์ ๋์ง๋ง ๋ฉ์์ง ์์ค ์ํ
MANUAL
์๋น์๊ฐ ๋ช ์์ ์ผ๋ก ์ฒ๋ฆฌ ์ฑ๊ณต(ack) ๋๋ ์คํจ(nack/reject)๋ฅผ ์๋ฆผ
๋ฉ์์ง ์ฒ๋ฆฌ ์๋ฃ ํ ์๋์ผ๋ก ํ์ธ์ ๋ณด๋ด์ผ ํ์์ ๋ฉ์์ง ์ ๊ฑฐ
์์ค ๋ฐฉ์ง์๋ ํจ๊ณผ์ ์ด์ง๋ง ์ถ๊ฐ์ ์ธ ์ฒ๋ฆฌ ๊ณผ์ ํ์
spring์์๋
Channel.basicAck(),Channel.basicNack()์ง์ ํธ์ถ
Last updated