๋ถ์ฐํ๊ฒฝ์ RabbitMQ ์ ์ฉํ๊ธฐ
RabbitMQ๋ AMQP(MQ ์คํ์์ค ํ์ค ํ๋กํ ์ฝ)์ ๊ตฌํ์ฒด ์ค ํ๋์ด์ ๋ฏธ๋ค์จ์ด ๋ธ๋ก์ปค๋ค.
MSA ๊ตฌ์กฐ์์ ์๋ฒ์ ์๋ฒ ๊ฐ ๋ฐ์ดํฐ ๊ตํ์ด ํ์ํ ๋ ์ฃผ๋ก ์ฌ์ฉํ๋ฉฐ ์ง์ ํต์ ์ด ์๋ MQ๋ฅผ ๊ฑฐ์ณ ํต์ ํจ์ผ๋ก์จ ์๋น์ค ๊ฐ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ๊ณ ์ ๋ขฐ์ฑ ์๋ ํต์ ์ ํ๊ณ ์ ํ ๋ ์ฃผ๋ก ์ฌ์ฉํ๋ค.
kafka์ ๋นํด ๋น๊ต์ ์ ์ฉ์ด ์ฌ์ด ํธ์ด๋ฉฐ ํ์ฌ์์๋ ๋๊ท๋ชจ์ ์ด๋ฒคํธ ์ฒ๋ฆฌ๋ฅผ ํด์ผํ๋ ๊ตฌ์กฐ๊ฐ ์๋์ด์ rabbitMQ๋ฅผ ์ฌ์ฉ์ค์ด๋ค.
AMQP์ ๊ตฌ์ฑ ์์
- Exchange : Publisher๋ก๋ถํฐ ์์ ํ ๋ฉ์์ง๋ฅผ ํ์ ๋ถ๋ฐฐํ๋ ๋ผ์ฐํฐ ์ญํ (์ฝ๊ฒ ๋งํ๋ฉด ๋ฐฐ๋ฌ์)
- Queue : ๋ฉ์์ง๋ฅผ ๋ฉ๋ชจ๋ฆฌ๋ ๋์คํฌ์ ์ ์ฅํ๋ค๊ฐ ์ปจ์๋จธ์๊ฒ ๋ฉ์์ง๋ฅผ ์ ๋ฌํ๋ ์ญํ
- Binding : Exchange์ Queue์ ๊ด๊ณ๋ฅผ ์ ์
๊ตฌํ์ฒด์ธ RabbitMQ๋ ๋น์ฐํ ์์ ๊ตฌ์ฑ์์๋ก ์ด๋ฃจ์ด์ ธ์๋ค. Exchange ์ข ๋ฅ์ ํ ๋ฐ์ธ๋ฉ ๋ฐฉ์์ ๋ํด ์์๋ณด์.
Exchange Type
1) Direct Exchange (1:1)
- Exchange ์ ๋ฐ์ธ๋ฉ๋ ํ ์ค์์ ๋ณด๋ด๋ ๋ฉ์์ง์ routing key ์ ๋งคํ๋์ด์๋ Queue๋ก ๋ฉ์์ง๋ฅผ ์ ๋ฌํ๋ค.
- ํน์ ๋ฉ์์ง๊ฐ ํน์ ํ์๋ง ๋ค์ด๊ฐ๊ธธ ์ํ ๋ ์ฌ์ฉํ๋ฉด ๋๋ค.
2) Fanout Exchange (1:N)
- ๋ผ์ฐํ ํค๋ฅผ ๋ฌด์ํ๊ณ Exchange์ ๋ฐ์ธ๋ฉ ๋ ๋ชจ๋ Queue ์ ๋ฉ์์ง๋ฅผ ์ ๋ฌํ๋ค.
- ํ์ฌ๋ ํด๋น ๋ฐฉ์์ ์ฌ์ฉํด ํน์ ์ด๋ฒคํธ๋ฅผ ๊ตฌ๋ ํ ์๋ฒ๋ผ๋ฉด ๋ฐ์ธ๋ฉ ํ๋ฅผ ์์ฑํ๊ณ ์๋ก ๋ค๋ฅธ ์๋ฒ๋ค์ด ๊ฐ์ ๋ฉ์์ง๋ฅผ ์๋นํ๊ณ ์๋ค.
3) Topic Exchange (1:N)
- Exchange์ ๋ฐ์ธ๋ฉ ๋ Queue ์ค์์ ๋ฉ์์ง์ routing key pattern์ ๋ง๋ Queue์๊ฒ ๋ชจ๋ ๋ฉ์์ง๋ฅผ ์ ๋ฌํ๋ค.
- Direct Exchange ์ ๋น์ทํด๋ณด์ด์ง๋ง ์ ํํ routing key๊ฐ ์๋์ด๋ ํจํด์ ๋ง๋ routing key๋ฅผ ๊ฐ์ง Queue๋ผ๋ฉด ๋ชจ๋ ์ ๋ฌํ๊ธฐ ๋๋ฌธ์ ์ข ๋ ์ ์ฐํ๋ค.
4) Headers Exchange
- key-value๋ก ์ ์๋ ํค๋๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ฉ์ธ์ง๋ฅผ ๋งค์นญ๋๋ queue์ ์ ๋ฌํ๋ ๋ฐฉ๋ฒ์ด๋ค.
Model
rabbitMQ์ ์ฌ์ฉ๊ฐ๋ฅํ ๋ชจ๋ธ ์ข ๋ฅ์ด๋ค.
1. work Queues
- ์ ์ผ ๊ฐ๋จํ ๋ฐฉ์.
- ํ๋์ ํ๋ฅผ ๋ง๋ค๊ณ ๋ฉ์์ง๋ฅผ ๋ณด๋ด๋ publisher์ ๊ทธ ๋ฉ์์ง๋ฅผ ์๋นํ๋ consumer๋ฅผ ์ ๋ถ ๊ฐ์ ธ๋ค ๋ถ์ธ๋ค.
- exchange์ ๋ผ์ฐํ ํค๋ ์ ๊ฒฝ ์ธ ํ์๊ฐ ์๋ค.
- round-robin ๋ฐฉ์์ผ๋ก ๋ฉ์ธ์ง๋ค์ ์์์ ๋ถ์ฐ ์ฒ๋ฆฌํ๋ค. (์ฆ ํ๋์ ๋ฉ์์ง๋ ํ๋์ ์๋น์๋ง ๋ฐ์ ์ ์๋ค.)
2. pub/sub
- ์ฃผ๋ก fanout ๋ฐฉ์์ ์ฌ์ฉํ๋ฉฐ, publisher๊ฐ ์ด๋ค ๋ฉ์์ง๋ฅผ exchange๋ก ๋ณด๋ด๋ฉด binding ๋ ๋ชจ๋ ํ๋ก ๋ฉ์์ง๋ฅผ ๋ณด๋ด์ฃผ๋ ๋ฐฉ์์ด๋ค.
- publisher๋ ๊ทธ์ ์ด๋ฒคํธ๋ฅผ ๋ฐํํ๋ฉฐ ๋ชฉ์ ์ง๋ฅผ ์ ํ์๊ฐ ์๋ค.
- ํ๋์ ์ด๋ฒคํธ๋ฅผ ์ฌ๋ฌ๊ฐ์ ์๋น์ค๊ฐ ํจ๊ป ๊ตฌ๋ ํ ๋ ์ฌ์ฉํ๋ฉด ์ ์ฉํ๋ค.
3. Routing
- direct exchange type์ ์ฌ์ฉํ๋ ๋ฐฉ์์ด๋ฉฐ ๋ฉ์์ง๋ฅผ ์ ํ์ ์ผ๋ก ๋ฐ๊ณ ์ ํ ๋ ์ฌ์ฉํ๋ค.
- routingKey์ ๋ฐ๋ผ ํน์ ๋ฉ์์ง๋ ํน์ ํ์๋ง ๋ค์ด๊ฐ์ผ๋ฉด ํ ๋ ์ฌ์ฉํ๋ค.
4. Topics
- topic exchange type์ ์ฌ์ฉํ๋ ๋ฐฉ์์ด๋ฉฐ routingKey ํจํด์ ๋ฐ๋ผ ํน์ ํ์ ๋ค์ด๊ฐ๋ค.
๊ทธ ์ธ์ ๋ค๋ฅธ ๋ชจ๋ธ๋ ์๋ ๊ณต์ ๋ฌธ์์์ ํ์ธ ๊ฐ๋ฅํ๋ค.
https://www.rabbitmq.com/getstarted.html
์ ๋ขฐ์ฑ(Reliability)๊ณผ ๋ด๊ตฌ์ฑ(Durability)
rabbitMQ์์ ๋ฉ์์ง๋ฅผ ์ ์ค์ ๋ง๊ธฐ ์ํ ๋ฐฉ๋ฒ์๋ ๋ญ๊ฐ ์์๊น?
1) Subscriber๊ฐ ๋ฉ์์ง๋ฅผ ์ ์์ ์ผ๋ก ๋ฐ์์ง๋ง ์ฒ๋ฆฌ ์ค ๋น์ ์์ ์ผ๋ก Subscriber ์๋ฒ๊ฐ ์ข ๋ฃ๋ ๊ฒฝ์ฐ
- rabbitMQ๋ ์์ฒด์ ์ผ๋ก ACK, NACK ์ฒ๋ฆฌ๋ฅผ ๋ฐ๊ธฐ ์ ๊น์ง๋ ํ์์ ๋ฉ์์ง๋ฅผ ์ง์ฐ์ง ์๋๋ค.
- ์ฆ, ์๋ฒ๊ฐ ์ฌ์์๋๋ฉด์ ๋ค์ ํ๋ก๋ถํฐ ๋ฉ์์ง๋ฅผ ์๋นํด ์ฌ์ฒ๋ฆฌํ๊ฒ ๋๋ค. (๋ฉฑ๋ฑ์ฑ์๋ ์๋น ๋ก์ง์ ์์ฑํ๋ ๊ฒ์ด ์ค์ํ ์ด์ ๋ค)
2) RabbitMQ ๋ธ๋ก์ปค ์๋ฒ ์์ฒด๊ฐ ์ปจ์๋จธ์ ๋ฉ์์ง ์ฒ๋ฆฌ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ์ค ๋น์ ์ ์ข ๋ฃ๋ ๊ฒฝ์ฐ
- Queue ์ ์งํ๊ธฐ : ๋ฐ์ธ๋ฉ ๋ ํ๋ฅผ ๊ณ์ํด์ ๊ธฐ์ตํ ์ ์๋๋ก ํ ์ ์ธ์ durable = true ์ค์ ์ ํตํด ์ ์งํ ์ ์๋ค. (๊ธฐ๋ณธ์ ์ผ๋ก ๋ธ๋ก์ปค๊ฐ ์ข ๋ฃ๋๋ฉด ์ฌ์์์ ํ๊ฐ ์ฌ๋ผ์ ธ์์ ๊ฒ์ด๋ค)
- Queue ์์ ๋ฉ์์ง ์ ์งํ๊ธฐ : ๋ฐํ๋ ๋ฉ์์ง๋ ์ง์์ฑ์ ์ ์งํ๊ณ ์ถ๋ค๋ฉด publisher๊ฐ publish ํ ๋์ persistent ์์ฑ์ ๋ถ์ฌํด์ผ ํ๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก ACK๋ฅผ ๋ฐ์ง ๋ชปํ ๊ฒฝ์ฐ์ด๊ธฐ ๋๋ฌธ์ ํ์์ ๋ฉ์์ง๋ฅผ ์ ์งํ ์ ์๋ค. persistent ์์ฑ์ deliveryMode๋ฅผ 2 (persist to disk)๋ก ์ค์ ํด์ฃผ๋ฉด ๋๋ค.
์์ธํ ์ค์ ์ ์๋ ๋งํฌ ์ฐธ๊ณ
https://teragoon.wordpress.com/2012/01/26/message-durability
์ค์ผ์ผ ์์
์ด๋ค ์ด๋ฒคํธ๋ฅผ ์๋นํ๋ ํ๋์ ๋ง์ดํฌ๋ก์๋น์ค์ ๋ํด ์ค์ผ์ผ์์์ ํ๊ฒ ๋์ด ์๋ฒ๊ฐ ์ฌ๋ฌ๋๊ฐ ๋๋ค๋ฉด ์ด๋ป๊ฒ ์ด๋ฒคํธ๋ฅผ ์ค๋ณต์์ด ์ฒ๋ฆฌํ ์ ์์๊น?
ํน์ ์ด๋ฒคํธ์ ๋ฐ์ธ๋ฉ๋ ํ๋ ์๋ฒ๋ณ๋ก ํ๋๋ง ์๊ฒจ์ผ ํ๋ฉฐ ๋ ํ๋ฆฌ์นด ์ค ํ๋์ ์๋ฒ๋ง ํด๋น ์ด๋ฒคํธ๋ฅผ ๊ฐ์ ธ๊ฐ ์ฒ๋ฆฌํด์ผ ํ๋ค.
์๋ฒ๊ฐ ๋์ด๋ ๋๋ง๋ค ํ๊ฐ ์ถ๊ฐ๋๋ฉด ๊ฐ์ ์ด๋ฒคํธ์ ๋ํด ๊ฐ ์๋น์ค๋ค์ด ์ค๋ณต์ผ๋ก ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ๊ฒ ๋ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
์ด๋ด ๊ฒฝ์ฐ๋ฅผ ๋๋นํด ๊ฐ ๋ง์ดํฌ๋ก์๋น์ค๋น ํ์ ์ด๋ฆ์ ๋๊ฐ์ด ๋ง๋ค์ด์ง๋๋ก ๊ตฌ์ฑํด์ผ ํ๋ค.
๋ง์ฝ ํ๋ฅผ ์์ฑํ์ ๋ ๋์ผํ ์ด๋ฆ์ ํ๊ฐ ์กด์ฌํ ๊ฒฝ์ฐ ํด๋น ํ๋ฅผ ๊ณต์ ํ๊ฒ ๋๋ค. ์ฆ ํ๋์ ์๋น์ค๋ ์ค์ผ์ผ ์์์ด ๋์๋๋ผ๋ ํ๋์ ํ๋ง ์ฌ์ฉํด ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ค. ์ด๋ ๊ฒ ๋์ด์ผ ๋ผ์ด๋ ๋ก๋น๋ฐฉ์์ผ๋ก ๋์๊ฐ๋ฉฐ ์๋น์ค๊ฐ ์ด๋ฒคํธ๋ฅผ ์ค๋ณต ์์ด ์ฒ๋ฆฌํ ์ ์๋ค.
์์ ๋ณด์ฅ๊ณผ ๋์ ์ฒ๋ฆฌ (prefetch)
๋ฉ์์ง ํ์ ํน์ฑ ์ ์ ์ ์ ์ถ ๋ฐฉ์์ด๋ค. ํ์ ๋ค์ด์จ ์์๋๋ก ์ปจ์๋จธ๊ฐ ์๋นํ๋ค.
์ฆ, ๋ฐ์ธ๋ฉ ํ์ ๋ํ ์ปจ์๋จธ๊ฐ ํ๋๋ผ๋ฉด, ๋ฉ์์ง ์์๋ฅผ ๋ณด์ฅํ๋ค.
์ปจ์๋จธ๊ฐ ์ฌ๋ฟ์ด๋ผ๋ฉด ๋ฉ์์ง ์์๊ฐ ๋ณด์ฅ๋์ง ์๋๋ค. ๋ผ์ด๋ ๋ก๋น ๋ฐฉ์์ผ๋ก ํ๋์ฉ ์ปจ์๋จธ์๊ฒ ๋ฒ๊ฐ์ ๊ฐ๋ฉฐ ๋ณด๋ธ๋ค.
rabbitMQ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ํ๋ก๋ถํฐ ๋ฉ์์ง๋ฅผ ๋์์ ์ ๋ถ ๊ฐ์ ธ์ ์ฒ๋ฆฌํ๋ค. ์ฆ, ํ์ ์ด๋ฒคํธ๊ฐ ๋ง์ด ์์ฌ์์ ์๋ก ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ์ฆ๊ฐํด ์๋น์ค ์ฑ๋ฅ์ด ์ ํ๋ ์ ์๋ค. ๋ฐ๋ผ์ ์ด๋ฒคํธ๋ฅผ ๋์ฉ๋์ผ๋ก ๋ฐ์์ผ ํ๋ ๊ฒฝ์ฐ prefetch count ์ค์ ์ ํตํด ๋์์ ์ฒ๋ฆฌํ ๋ฉ์์ง ๊ฐ์๋ฅผ ์ ํด์ค ์ ์๋ค. ๋จ, prefetch count๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ ๋ฐ๋์ ACK, NACK ์ฒ๋ฆฌ๋ฅผ ํ์คํ ํด์ฃผ์ด์ผ ํ๋ค.
ํน์๋ผ๋ prefetch ๋ฅผ 1๋ก ์ค์ ํ ํ ๊ฐ์ ธ์จ ์ด๋ฒคํธ์ ๋ํด ACK,NACK ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ์ง ์์ ๊ฒฝ์ฐ ํ์ ๋จ์์๋ ๋ฉ์์ง๋ค์ ๊ณ์ํด์ ready ์ํ๋ก ๋๊ธฐ์ ๋น ์ง๊ฒ ๋๋ฉฐ ์๋น์ค์ธ ์ด๋ฒคํธ๋ unacked ์ํ๋ก ํ์ ๊ณ์ ๋จ์์๊ฒ ๋๋ค. ์ฆ 1๊ฐ๋ unacked, ๋๋จธ์ง๋ ready ์ํ๋ก ๋ฉ์์งํ๋ ์ด๋ค ์์ ์งํ๋ ํ ์ ์๋ค.
+) prefetch ๊ฐ์ ์ด๋ป๊ฒ ์ค์ ํ๋๊ฒ ์ข์๊น?
- ์ฒ๋ฆฌ ์๊ฐ์ด ๋งค์ฐ ๋๋ฆด ๊ฒฝ์ฐ, prefetch ๊ฐ์ ์๊ฒ ๊ฐ์ ธ๊ฐ๋ ๊ฒ์ด ์ข๋ค. (ex: 1) ๋ฏธ๋ฆฌ ์ปจ์๋จธ๊ฐ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ์์ ์ด์ ๊ฐ ์๋ค.
- ํด๋น ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ๋ ์ปจ์๋จธ์ ๊ฐ์๋ฅผ ๊ณ ๋ คํ๋ค. ๋ณดํต ๋ณด๋ด๋ ๋ฉ์์ง ์/์ปจ์๋จธ ๊ฐ์ ๋งํผ ์ค์ ํ์ฌ ์ ํด ์ํ๋ฅผ ๊ฐ์ง๋ consumer๊ฐ ์๋๋ก ํ๋ค.
- ํด๋ผ์ด์ธํธ ์ฒ๋ฆฌ ์๊ฐ ๋๋น ๋๋ฌด ๊ฐ์ด ์ ์ ๊ฒฝ์ฐ์๋ conumer์ ์ ํด ์ํ๊ฐ ๊ธธ์ด์ง๊ณ ๋๋ฌด ๋์๋ ํ๋์ consumer๊ฐ ์ ๋ถ ๊ฐ์ ธ๊ฐ๊ณ ๋๋จธ์ง consumer๊ฐ ์ ํด ์ํ๋ก ์ ์ง๋ ์ ์์ด ์ ์ ๊ฐ ์ค์ ์ด ์ค์ํ๋ค.
ํธ๋ฌ๋ธ ์ํ
rabbitMQ ํ์์์ ๋ฐ์
- ๋ฐ์ดํฐ๋ฅผ ๋์คํฌ์ ์ ์ฅ ๋์ค ๊ฐ์ ์ข ๋ฃ๋์ด ๋ฐ์ดํฐ๊ฐ ๊ผฌ์ธ ๊ฒฝ์ฐ ์๋์ ๊ฐ์ ์๋ฌ ๋ฐ์
- ํด๋ผ์ฐ๋ ์์ง๋์ด ๋ถ์ด ๋์์ฃผ์ จ๋ค!
๋ก๊ทธ: command time out: '/usr/bin/df -kP ..'
ํด๊ฒฐ ๋ฐฉ๋ฒ :
1. rebuilding ํ๋ ๋์ค ํ์์์์ด ๋์ง ์๋๋ก rabbitMQ ์ต์ ๋ฒ์ ์ ๋ฐ์ดํธ (๊ณ ์ณ์ก๋ค๊ณ ํ๋ค.)
2. rebuilding ๋๋ ๋์ ํ๋๊ฐ ์ฃฝ์ง ์๋๋ก livenessprobe ๊บผ๋๊ธฐ
3. rebuilding ์๋ฃ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฐ๋ค. (๊ฐ์ ์ข ๋ฃํ์ง ์๊ณ !)
+) ๋ค๋ฅธ ๋์: ๋ฐ์ดํฐ๋ฅผ ์ด๊ธฐํํ๋ฉด ํด๊ฒฐ๋๊ธด ํ๋ค.