Redis / RabbitMQ

niireymikยท2024๋…„ 8์›” 19์ผ

๐Ÿ’ก ๋“ค์–ด๊ฐ€๋ฉฐ
์ง€๋‚œ ํฌ์ŠคํŒ…์—์„œ Kafka์— ๊ด€ํ•ด ์•Œ์•„๋ณด์•˜๋‹ค. ์นดํ”„์นด๋Š” Pub-Sub ๊ตฌ์กฐ์˜ ๋ฉ”์‹œ์ง€ ํ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•œ๋‹ค๊ณ  ์†Œ๊ฐœํ–ˆ๋Š”๋ฐ, ์ด ๋ฉ”์‹œ์ง€ ํ๋ฅผ ๋‹ค๋ฃฐ ๋•Œ ํ•จ๊ป˜, ์ž์ฃผ ์–ธ๊ธ‰๋˜๋Š” ๊ฒƒ์ด Redis์™€ RabbitMQ์ด๋‹ค. Redis์™€ RabbitMQ๋Š” ์ •ํ™•ํžˆ ๋ฌด์—‡์ด๊ณ  ์–ด๋–ค ์—ญํ• ์„ ํ•˜๋Š”์ง€, ๋˜ MQ๋กœ์จ ๊ฐ๊ฐ์€ ์–ด๋–ค ๊ณตํ†ต์ ๊ณผ ์ฐจ์ด์ ์„ ๊ฐ€์ง€๋Š”์ง€ ์•Œ์•„๋ณด์ž!




๐ŸŽฏ ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค vs ์ด๋ฒคํŠธ ๋ธŒ๋กœ์ปค

Redis, RabbitMQ, Kafka์™€ ๊ฐ™์ด ๋ฉ”์‹œ์ง€ ๊ธฐ๋ฐ˜ ์ „๋‹ฌ ๊ธฐ์ˆ ๋“ค์„ ๋ฉ”์‹œ์ง• ํ”Œ๋žซํผ์ด๋ผ๊ณ  ๋ถ€๋ฅด๋Š”๋ฐ, ๋ฉ”์‹œ์ง€ ํ”Œ๋žซํผ์€ ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค / ์ด๋ฒคํŠธ ๋ธŒ๋กœ์ปค 2๊ฐ€์ง€ ์ข…๋ฅ˜๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค. ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค์˜ ๋Œ€ํ‘œ์ ์ธ ์˜ˆ๊ฐ€ Redis, RabbitMQ์ด๊ณ  Kafka๊ฐ€ ๋Œ€ํ‘œ์ ์ธ ์ด๋ฒคํŠธ ๋ธŒ๋กœ์ปค์ธ ๊ฒƒ์ด๋‹ค!

์—ฌ๊ธฐ์„œ ๋‘˜์€ ๋™์ž‘ ๋ฐฉ์‹์—์„œ ํ™•์—ฐํžˆ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค. ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค๋Š” ์ด๋ฒคํŠธ ๋ธŒ๋กœ์ปค๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์ง€๋งŒ, ์ด๋ฒคํŠธ ๋ธŒ๋กœ์ปค๋Š” ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค :D

โ†’ ๊ทธ๋ž˜์„œ Kafka๋ฅผ ์–˜๊ธฐํ•  ๋•Œ์—๋„ ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค๋กœ์„œ ๊ธฐ๋Šฅํ•œ๋‹ค๋Š” ์„ค๋ช…์ด!๐Ÿ˜Š


๐Ÿง ๊ทธ๋ž˜์„œ, ๋ฉ”์‹œ์ง€/์ด๋ฒคํŠธ ๋ธŒ๋กœ์ปค๊ฐ€ ๋ญ”๋ฐ?

Message Broker ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค

Producer๊ฐ€ ์ƒ์‚ฐํ•œ ๋ฉ”์‹œ์ง€๋ฅผ ํ์— ์ €์žฅํ•˜๊ณ , ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ Consumer๊ฐ€ ๊ฐ€์ ธ๊ฐˆ ์ˆ˜ ์žˆ๋„๋ก ์ค‘๊ฐ„ ๋‹ค๋ฆฌ ์—ญํ• ์„ ํ•ด์ฃผ๋Š” ๋ธŒ๋กœ์ปค์ด๋‹ค. ์ด๋Š” ๋Œ€๊ทœ๋ชจ ๋ฉ”์‹œ์ง€ ๊ธฐ๋ฐ˜ ๋ฏธ๋“ค์›จ์–ด ์•„ํ‚คํ…์ฒ˜์—์„œ ํ”ํžˆ ์‚ฌ์šฉ๋˜์–ด ์™”๋‹ค.

๐Ÿ”Ž ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค๋Š” ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ• ๊นŒ?

๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ™˜๊ฒฝ์—์„œ๋Š” Producer๊ฐ€ ๋ฉ”์‹œ์ง€๋ฅผ ์ƒ์„ฑํ•˜๋ฉด, ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค ๋‚ด์—์„œ ์ด ๋ฉ”์‹œ์ง€๋ฅผ ์–ด๋–ค ํ์— ๋ฐœ์†กํ• ์ง€ ๊ฒฐ์ •ํ•˜๋Š” Exchange๋ฅผ ํ•˜๊ฒŒ ๋˜๊ณ , ์ด๋ ‡๊ฒŒ ํ์— ๋“ค์–ด๊ฐ„ ๋ฉ”์‹œ์ง€๋Š” Consumer๊ฐ€ ๊ฐ€์ ธ๊ฐ€๊ฒŒ ๋œ๋‹ค.

โ†’ Consumer๊ฐ€ ๋ฉ”์‹œ์ง€๋ฅผ ๊ฐ€์ ธ๊ฐ€๋ฉด ํ์—๋Š” ๋”์ด์ƒ ๋ฉ”์‹œ์ง€๊ฐ€ ๋‚จ์ง€ ์•Š๊ณ  ์‚ฌ๋ผ์ง€๋Š” ๊ฒƒ์ด ํŠน์ง•์ด๋‹ค.


Event Broker ์ด๋ฒคํŠธ ๋ธŒ๋กœ์ปค

์ด๋ฒคํŠธ ๋ธŒ๋กœ์ปค๋Š” Kafka์—์„œ ๋‹ค๋ฃจ์—ˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ, ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค์˜ ํ ๊ธฐ๋Šฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ ์ถ”๊ฐ€์ ์œผ๋กœ ์ด๋ฒคํŠธ ๋ณ„ ๊ด€๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค. ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค์™€ ์ด๋ฒคํŠธ ๋ธŒ๋กœ์ปค ๋ชจ๋‘ ์ด๋ฒคํŠธ๋ฅผ ์ˆ˜์‹ ํ•˜๊ณ , ์ด๊ฒƒ์„ ์†Œ๋น„์ž์—๊ฒŒ ์ „๋‹ฌํ•˜๋Š” ๋ฐ์— ๋ชฉ์ ์„ ๋‘๊ณ  ์žˆ์ง€๋งŒ ์ž‘๋™ ๋ฐฉ์‹์— ํฐ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค!

Kafka์—์„œ ์ด๋ฏธ ๋‹ค๋ฃจ์—ˆ์ง€๋งŒ, ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค์™€ ๋น„๊ตํ•  ๊ฒธ ์ด๋ฒคํŠธ ๋ธŒ๋กœ์ปค์˜ ๋™์ž‘ ๋ฐฉ์‹์„ ์งš๊ณ  ๋„˜์–ด๊ฐ€ ๋ณด์ž!


๐Ÿ”Ž ์ด๋ฒคํŠธ ๋ธŒ๋กœ์ปค๋Š” ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ• ๊นŒ?

์ด๋ฒคํŠธ ๋ธŒ๋กœ์ปค๋Š” ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค์™€ ๋‹ค๋ฅด๊ฒŒ ์ด๋ฒคํŠธ๊ฐ€ Topic ๋‹จ์œ„๋กœ Event Streamer์— ์ €์žฅ๋œ๋‹ค. Producer๊ฐ€ ์ด๋ฒคํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋ฉด, Topic์— ๋”ฐ๋ผ ๋ถ„๋ฅ˜๋˜์–ด ์ˆœ์„œ๋Œ€๋กœ ๊ธฐ๋ก๋œ๋‹ค. ๊ทธ ํ›„ ํ•ด๋‹น Topic์„ ๊ตฌ๋…ํ•œ Consumer๊ฐ€ ์ด๋ฒคํŠธ๋ฅผ ๊ฐ€์ ธ๊ฐ€์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

โ†’ ์ด๋ฒคํŠธ ๋ธŒ๋กœ์ปค๋Š” Producer๊ฐ€ ์ƒ์‚ฐํ•œ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•œ ํ›„ ๋ฐ”๋กœ ์‚ญ์ œํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ํฐ ์ฐจ์ด์ ์ด๋‹ค!
์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌ ํ›„ ๋ฐ”๋กœ ์‚ญ์ œํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ, ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•œ ํ›„ ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ํŠน์ • ์‹œ์ ์˜ ์ด๋ฒคํŠธ๋ถ€ํ„ฐ ๋‹ค์‹œ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. ์žฅ์• ๊ฐ€ ์–ด๋””์—์„œ ๋‚ฌ๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์žฅ์•  ํฌ์ธํŠธ์— ์ฐพ์•„๊ฐ€์„œ ์žฅ์•  ์žฌ์ฒ˜๋ฆฌ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.

์ด๋Š” ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆฌ๋ฐ์˜ ์ฒ˜๋ฆฌ ๋Šฅ๋ ฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.




๐Ÿ’ก
์ด๋ ‡๊ฒŒ ๋ฉ”์‹œ์ง• ํ”Œ๋žซํผ์€ ํฌ๊ฒŒ ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค, ์ด๋ฒคํŠธ ๋ธŒ๋กœ์ปค๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค๊ณผ ๊ฐ๊ฐ์˜ ๊ฐ„๋žตํ•œ ๊ฐœ๋…, ๊ทธ๋ฆฌ๊ณ  ์ด๋ฒˆ์— ์•Œ์•„๋ณผ Redis / RabbitMQ๋Š” ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค์— ํ•ด๋‹นํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜๋‹ค. ์ด์ œ Redis์™€ RabbitMQ์— ๊ด€ํ•ด ํ•˜๋‚˜์”ฉ ํŒŒํ—ค์ณ๋ณด์ž!

์•„, ํ•œ ๊ฐ€์ง€ ์งš๊ณ  ๋„˜์–ด๊ฐˆ ๊ฒƒ์€, ์„œ๋ก ์—์„œ๋Š” Redis๋ฅผ ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค๋กœ์„œ ์†Œ๊ฐœํ–ˆ์œผ๋‚˜ Redis๋Š” ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ์šฉ๋„๋กœ๋„ ๋‹ค์–‘ํ•˜๊ฒŒ ์‚ฌ์šฉ๋˜๋Š” ํ•˜๋‚˜์˜ DBMS์ด๋‹ค! ํ˜ผ๋™ํ•˜์ง€ ๋ง๊ณ , ์šฐ์„  Redis ๊ทธ ์ž์ฒด์˜ ๊ฐœ๋…์— ๊ด€ํ•ด ๋ชจ๋‘ ์•Œ์•„๋ณธ ๋’ค ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค๋กœ์„œ์˜ Redis๋„ ๋‹ค๋ฃจ์–ด ๋ณด์ž :>




๐Ÿ“ฎ Redis : Remote Dictionary Server

๋ ˆ๋””์Šค๋Š” Remote Dictionary Server์˜ ์•ฝ์ž์ด๋‹ค. ์ง์—ญํ•˜๋ฉด Remote ์›๊ฒฉ์˜, Dictionary ์‚ฌ์ „ (key-value) ๊ตฌ์กฐ Server ์„œ๋ฒ„, ์ฆ‰ key-value ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๋Š” ์™ธ๋ถ€์˜ ์„œ๋ฒ„์ด๋‹ค. ์ด๋Š” ํ•œ ๋งˆ๋””๋กœ ์ •์˜ํ•˜๋ฉด key-value ํ˜•ํƒœ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๋น„๊ด€๊ณ„ํ˜• DB์ด๋‹ค!

๋ ˆ๋””์Šค๋Š” ์•ž์„œ ์–ธ๊ธ‰ํ–ˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ DB, ์บ์‹œ์˜ ์—ญํ• ๋„ ํ•œ๋‹ค. ์ด๋Š” ์ธ๋ฉ”๋ชจ๋ฆฌ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ํฐ ํŠน์ง•์ด๋‹ค!

๐Ÿš€์‚ฌ์‹ค Redis๋Š” ๊ฐœ๋…์€ ๋ชฐ๋ผ๋„ ๋“ค์–ด๋ดค์–ด! : ์ฟ ํŒก
2019๋…„ 7์›”, ์ฟ ํŒก์—์„œ ๋ชจ๋“  ๋ฌผํ’ˆ์ด ํ’ˆ์ ˆ๋กœ ํ‘œ์‹œ๋˜๋Š” ํฐ ์ด์Šˆ๊ฐ€ ์žˆ์—ˆ๋Š”๋ฐ, ์ด ๋ฌธ์ œ๋Š” RedisDB ๋•Œ๋ฌธ์ด๋ผ๊ณ  ๋ฐํ˜€์กŒ๋‹ค.

๋ ˆ๋””์Šค๋Š” ๋‹น์‹œ Key๊ฐ’์„ Int๋กœ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ, ์ฟ ํŒก์—์„œ ์‚ฌ์šฉํ•˜๋˜ RedisDB์˜ key ๊ฐœ์ˆ˜๊ฐ€ 32bit ์ตœ๋Œ€ ์ •์ˆ˜ ๊ฐ’์ธ 2147483647์„ ๋„˜์–ด์„œ ๋ฐœ์ƒํ•œ ๋ฌธ์ œ์˜€๋‹ค! (์ดํ›„ Int -> Long์œผ๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ๋‹ค.)

Redis์˜ ๋“ฑ์žฅ

Redis ํ•˜๋ฉด ํ•ญ์ƒ ์บ์‹ฑ์˜ ๊ฐœ๋…์ด ๋”ฐ๋ผ ๋ถ™๋Š”๋‹ค.

์บ์‹œ๋Š” ๊ฐ„๋‹จํžˆ ๋งํ•˜์ž๋ฉด, ํŠน์ • ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์š”์ฒญ์„ ๋น ๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์ž„์˜์˜ ์ €์žฅ๊ณต๊ฐ„์— ๋ฐ์ดํ„ฐ๋ฅผ ๋‘๋Š” ๊ฒƒ์œผ๋กœ, ์ €์žฅ์†Œ์— ์ ‘๊ทผํ•  ํ•„์š” ์—†์ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ฌ ์ˆ˜ ์žˆ์–ด ์ฒ˜๋ฆฌ ์†๋„๊ฐ€ ํ–ฅ์ƒ๋œ๋‹ค.

๋ ˆ๋””์Šค๋Š” "DB์— ์ €์žฅํ•˜๋˜ ์ •๋ณด๋ฅผ ์บ์‹œ์ฒ˜๋Ÿผ Main Memory์— ๋‘์–ด ์‰ฝ๊ณ  ๋น ๋ฅด๊ฒŒ ์ ‘๊ทผํ•˜์ž!" ๋ผ๋Š” ์ƒ๊ฐ์—์„œ ๋“ฑ์žฅํ–ˆ๋‹ค. ๋” ์ž์ฃผ ์ ‘๊ทผํ•˜๊ณ  ๋œ ์ž์ฃผ ๋ฐ”๋€Œ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ DB ๋Œ€์‹  ๋ฉ”์ธ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•˜๋Š” ํ˜•ํƒœ๋ฅผ In-memory DB๋ผ ๋ถ€๋ฅด๊ณ , ๊ทธ ๋Œ€ํ‘œ์ ์ธ ์˜ˆ๊ฐ€ Redis์ธ ๊ฒƒ์ด๋‹ค! :>




Redis ํŠน์ง• ๋ฐ ์žฅ๋‹จ์ 

์„ฑ๋Šฅ

Redis๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ธ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•˜๋ฏ€๋กœ, ๋‹น์—ฐํžˆ ๋””์Šคํฌ์— ๋น„ํ•ด ํ›จ์”ฌ ๋น ๋ฅด๊ฒŒ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค! ๋˜ํ•œ key-value ํ˜•์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜๊ธฐ ๋•Œ๋ฌธ์— (์—ฐ์†์ ์ธ ๋ฐ์ดํ„ฐ ๊ฒ€์ƒ‰์ด ๋ถˆํ•„์š”ํ•˜๋ฏ€๋กœ) ๋ณด๋‹ค ๋น ๋ฅด๊ฒŒ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ ํƒ€์ž… ์ง€์› (Redis ์ปฌ๋ ‰์…˜)

Redis๋Š” Key์— ๋‹ค์–‘ํ•œ Collection์„ ์ง€์›ํ•œ๋‹ค! ์œ„ ์‚ฌ์ง„ ์ž๋ฃŒ์ฒ˜๋Ÿผ, Key์— String, Hash, List, Set, Sorted Set๊ณผ ๊ฐ™์€ ์ž๋ฃŒ๋ฅผ ๋‹ค์–‘ํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋กœ์จ ๊ฐœ๋ฐœ ํŽธ์˜์„ฑ์„ ๊ทน๋Œ€ํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค!โœจ

ํœ˜๋ฐœ์„ฑ / ์˜์†์„ฑ ๋ณด์žฅ

์•ž์„œ Redis๋Š” Main Memory์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•œ๋‹ค๊ณ  ํ–ˆ์œผ๋ฉฐ, ์ด๋Š” ํœ˜๋ฐœ์„ฑ์„ ๊ฐ€์ง€๋Š” ๊ฒƒ์ด ํŠน์ง•์ด๋‹ค. ๋”ฐ๋ผ์„œ ์„œ๋ฒ„๊ฐ€ ์ข…๋ฃŒ๋˜๊ฑฐ๋‚˜ ์žฌ์‹œ์ž‘๋˜๋ฉด ๋ฐ์ดํ„ฐ๊ฐ€ ๋ชจ๋‘ ์†์‹ค๋œ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ Redis๋ฅผ ์‚ฌ์šฉํ•˜๋”๋ผ๋„ ์˜์†์„ฑ์„ ๋ณด์žฅํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ํ•„์š”ํ•œ๋ฐ, ์ด๋ฅผ ์œ„ํ•ด Redis๋Š” RDB์™€ AOF๋ฅผ ์ง€์›ํ•˜์—ฌ ์˜์†์„ฑ์„ ๋ณด์žฅํ•œ๋‹ค!๐Ÿ‘

โœ… RDB? AOF?
RDB ๋ฐฉ์‹์€ Snapshotting ๋ฐฉ์‹์ด๋ผ๊ณ ๋„ ๋ถ€๋ฅด๋ฉฐ, ์ˆœ๊ฐ„์ ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ์— ์žˆ๋Š” ๋‚ด์šฉ ์ „์ฒด๋ฅผ ๋””์Šคํฌ์— ๋‹ด์•„ ์˜๊ตฌ ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

๋ฐ˜๋ฉด AOF ๋ฐฉ์‹์€ Append On File์˜ ์•ฝ์ž๋กœ, ๋ง ๊ทธ๋Œ€๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋Š” ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์ด๋ฅผ ๋ชจ๋‘ ๋กœ๊ทธ์— ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. ์ด๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ์˜ ๋ณ€๊ฒฝ ๊ธฐ๋ก์„ ๋ณด๊ด€ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ๋ฅผ ์œ ์‹คํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์ ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์œผ๋‚˜, ๊ฐ™์€ ์ด์œ ๋กœ ์ธํ•ด RDB์— ๋น„ํ•ด ํŒŒ์ผ ํฌ๊ธฐ๊ฐ€ ํฌ๊ณ  ์†๋„๊ฐ€ ๋А๋ฆฌ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.

RDB, AOF ๋‘ ๋ฐฉ์‹ ๊ฐ๊ฐ์˜ ์žฅ๋‹จ์ ์ด ์žˆ์ง€๋งŒ, ๊ฐ„๋‹จํ•˜๊ฒŒ ์–ด๋–ค ๋ฐฉ์‹์„ ์‚ฌ์šฉํ• ์ง€์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • RDB + AOF : ํ•˜๋“œ ๋””์ŠคํŠธ DB์™€ ๊ฐ™์€ ์ œ์ผ ๊ฐ•๋ ฅํ•œ ๋‚ด๊ตฌ์„ฑ์ด ํ•„์š”ํ•  ๊ฒฝ์šฐ
  • RDB๋งŒ ์‚ฌ์šฉ : ์žฅ์•  ๋ฐœ์ƒ ์‹œ, ๋ฐฑ์—…์€ ํ•„์š”ํ•˜์ง€๋งŒ ์–ด๋А ์ •๋„์˜ ๋ฐ์ดํ„ฐ ์†์‹ค์ด ๋ฐœ์ƒํ•ด๋„ ๊ดœ์ฐฎ์€ ๊ฒฝ์šฐ
  • AOF๋งŒ ์‚ฌ์šฉ : ์žฅ์•  ๋ฐœ์ƒ ์ง์ „๊นŒ์ง€ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณด์žฅ๋˜์–ด์•ผ ํ•  ๊ฒฝ์šฐ

Single Thread ๋ฐฉ์‹

Redis๋Š” ๋‹จ์ผ ์Šค๋ ˆ๋“œ์ด๊ธฐ ๋•Œ๋ฌธ์—, 1๋ฒˆ์— 1๊ฐœ์˜ ๋ช…๋ น์–ด๋งŒ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.
๋”ฐ๋ผ์„œ Atomic(์›์ž์„ฑ)์„ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ ๋ฐœ์ƒํ•˜๋Š” ์ปจํ…์ŠคํŠธ ์Šค์œ„์นญ๊ณผ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ์„ ์ค„์ผ ์ˆ˜ ์žˆ์–ด ๋น ๋ฅด๊ฒŒ ์‘๋‹ตํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋‹น์—ฐํžˆ ๋‹ค์ค‘ ์ฒ˜๋ฆฌ๋‚˜ ๋™์‹œ์„ฑ์ด ์š”๊ตฌ๋˜๋Š” ์ž‘์—…์—๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š๋‹ค. ์—ฌ๋Ÿฌ ๊ฐœ์˜ CPU ์ฝ”์–ด๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์—†๋Š” ํ•œ๊ณ„๊ฐ€ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ, ํ•˜๋‚˜์˜ ์š”์ฒญ์ด ๋ณ‘๋ชฉ๋˜๋ฉด ๊ทธ ๋‹ค์Œ ์š”์ฒญ๋“ค์ด ๊ณ„์† ๋ฐ€๋ฆฌ๊ฒŒ ๋˜๋ฏ€๋กœ ๋ณต์žก๋„๊ฐ€ O(n)์ธ ๋ช…๋ น์–ด์˜ ์‚ฌ์šฉ์€ ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค.

*์›์ž์„ฑ : ํ•˜๋‚˜์˜ ์ž‘์—…(์ž‘์—… ๋‹จ์œ„)์ด ์ค‘๊ฐ„์— ๋Š๊ธฐ์ง€ ์•Š๊ณ  ์™„์ „ํžˆ ์ˆ˜ํ–‰๋˜๊ฑฐ๋‚˜ ์ „ํ˜€ ์ˆ˜ํ–‰๋˜์ง€ ์•Š์Œ์„ ๋ณด์žฅํ•˜๋Š” ์„ฑ์งˆ

Pub/Sub

Redis๋Š” Pub - Channel - Sub ๊ตฌ์กฐ๋ฅผ ๊ฐ–๊ณ  ์žˆ๋‹ค.
publisher๊ฐ€ Channel์— ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐœํ–‰ํ•˜๋ฉด ํ•ด๋‹น Channel์„ ๊ตฌ๋…ํ•˜๋Š” Subscriber๋“ค์— ๋ฉ”์„ธ์ง€๋ฅผ ์ „์†กํ•œ๋‹ค.
์ด ๊ธฐ๋Šฅ์€ ์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ…, ์‹ค์‹œ๊ฐ„ ์ŠคํŠธ๋ฆฌ๋ฐ, ์‹ค์‹œ๊ฐ„ ์•Œ๋ฆผ, SNS ํ”ผ๋“œ ๋“ฑ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.




Redis ์‚ฌ์šฉ ์‹œ ์ฃผ์˜ํ•  ์ 

O(n) ์‹œ๊ฐ„๋ณต์žก๋„ ๋ช…๋ น์–ด ์‚ฌ์šฉ ๊ธˆ์ง€

Redis๋Š” ๋‹จ์ผ ์Šค๋ ˆ๋“œ๋กœ ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค.
๋‹จ์ผ ์Šค๋ ˆ๋“œ๋กœ์„œ ๋™์‹œ์— ๋‹จ 1๊ฐœ์˜ ๋ช…๋ น์–ด๋งŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค ํ–ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์—, ํ•˜๋‚˜์˜ ๋ช…๋ น์–ด๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์†๋„๊ฐ€ ์˜ค๋ž˜ ๊ฑธ๋ฆด ๊ฒฝ์šฐ ๋‚˜๋จธ์ง€ ๋ช…๋ น์–ด๋“ค์€ ๋ชจ๋‘ ๋Œ€๊ธฐ ์ƒํƒœ๋กœ ์ „ํ™˜๋˜๋Š”๋ฐ, ๋ฐ์ดํ„ฐ์˜ ์ˆ˜๊ฐ€ ๋งŽ์€ ๊ฒฝ์šฐ ํฐ ์†๋„ ์ €ํ•˜๋ฅผ ์•ผ๊ธฐํ•  ์ˆ˜ ์žˆ๋‹ค.
๋”ฐ๋ผ์„œ, ํŠนํžˆ O(n)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ–๋Š” ๋Œ€ํ‘œ์ ์ธ ๋ช…๋ น์–ด๋“ค(key, flushAll, flushDB, delete collections, get all collections)๋Š” ์šด์˜ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉ์„ ๊ธˆ์ง€ํ•œ๋‹ค!

๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ

๋น„๊ต์  ์ž‘์€ ๊ณต๊ฐ„์— ๋น ๋ฅด๊ฒŒ ์ ‘๊ทผํ•˜๋Š” In-memory ํŠน์„ฑ ์ƒ ๋ฉ”๋ชจ๋ฆฌ ๋‹จํŽธํ™” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹น๋ฐ›๊ณ  ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ณผ์ •์—์„œ ํ•„์ˆ˜์ ์œผ๋กœ ๋ฐœ์ƒํ•˜๋ฉฐ, ๊ทธ ์ •๋„๊ฐ€ ์‹ฌํ•  ๊ฒฝ์šฐ Process๊ฐ€ Memory์— ์˜ฌ๋ผ๊ฐ€์ง€ ๋ชปํ•˜๊ณ  ์ฃฝ์–ด๋ฒ„๋ฆฌ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.
๋”ฐ๋ผ์„œ Redis๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ์—๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ์ ๋‹นํžˆ, ์—ฌ์œ  ์žˆ๊ฒŒ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค!๐Ÿ˜Ž

๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค๋กœ์„œ์˜ Redis

์ด๋ฒˆ ๊ธ€์—์„œ๋Š” Redis์™€ RabbitMQ๋ฅผ ํ•จ๊ป˜ ์•Œ์•„๋ณด๋Š” ๊ฒƒ์ด ๋ชฉํ‘œ์ด๋ฏ€๋กœ, Redis์—์„œ๋Š” ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค์˜ ์–˜๊ธฐ๊ฐ€ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์ด ๋˜๊ฒ ๋‹ค!

์ด์ „์— ๋‹ค๋ฃจ์—ˆ๋˜ Kafka์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ Redis๋„ ๋ฉ”์‹œ์ง€๋ฅผ ๋‹ค๋ฃฐ ๋•Œ Pub-Sub ๊ตฌ์กฐ๋ฅผ ๊ฐ–์ถ˜๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ํ•˜๋‚˜ ์œ ์˜ํ•  ์ ์€, Redis์˜ Pub-Sub ์‹œ์Šคํ…œ์€ ๋งค์šฐ ๋‹จ์ˆœํ•œ ๊ตฌ์กฐ๋กœ ๋˜์–ด ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค๋กœ์„œ์˜ Redis๋Š” ํ•˜๋‚˜์˜ TV ์ฑ„๋„๊ณผ ๊ฐ™๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ Pub-Sub ๊ตฌ์กฐ์—์„œ Publisher๋Š” ์ฑ„๋„์— ๊ตฌ๋… ์‹ ์ฒญ์„ ํ•œ ๋ชจ๋“  Subscriber์—๊ฒŒ ๋ฉ”์‹œ์ง€๋ฅผ ์ „๋‹ฌํ•œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ Redis์˜ ์ฑ„๋„์€ ๋ฉ”์‹œ์ง€๋ฅผ ๋”ฐ๋กœ ๋ณด๊ด€ํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ฆ‰, ์ˆ˜์‹ ์ž(ํด๋ผ์ด์–ธํŠธ : Subscriber)๊ฐ€ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›๋Š” ๊ฒƒ์„ ๋ณด์žฅํ•˜์ง€ ์•Š์•„์„œ subscribe ๋Œ€์ƒ์ด ํ•˜๋‚˜๋„ ์—†๋Š” ์ƒํ™ฉ์—์„œ ๋ฉ”์‹œ์ง€๋ฅผ publishํ•ด๋„ ์—ญ์‹œ ์‚ฌ๋ผ์ง„๋‹ค. ์ฆ‰, ์ผ๋ฐ˜ ๋ฉ”์‹œ์ง€ ํ์™€ ๋‹ฌ๋ฆฌ ์ˆ˜์‹  ํ™•์ธ์„ ํ•˜์ง€ ์•Š์•„ ์ „์†ก์ด ๋ณด์žฅ๋˜์ง€ ์•Š๋Š”๋‹ค!โšก

๊ฐ„๋‹จํžˆ ์ •๋ฆฌํ•˜์ž๋ฉด, ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๋Š” ์ชฝ๋„ ๋ณด๋‚ด๊ณ  ๋, ๋ฐ›๋Š” ์ชฝ๋„ ๋ฐ›๊ณ  ๋์œผ๋กœ ์•„์ฃผ ์‹ฌํ”Œํ•œ ๊ตฌ์กฐ์ด๋‹ค!โœจ


๐Ÿ’ก
์ด๋ ‡๊ฒŒ ๋‹จ์ˆœํ•œ ๊ธฐ๋Šฅ๋งŒ ์ œ๊ณตํ•˜๋Š”๋ฐ ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค๋กœ์„œ ์žฅ์ ์ด ์žˆ์„๊นŒ?

๐Ÿฅ•!! Redis๊ฐ€ ๋†’์€ ์ž…์ง€๋ฅผ ๋‹ค์ง„ ๋ฐ์—๋Š” ๋‹ค ์ด์œ ๊ฐ€ ์žˆ๋‹ค.
์›น์†Œ์ผ“์„ ์ด์šฉํ•  ๊ฒฝ์šฐ ์ถ”๊ฐ€์ ์ธ ๋„คํŠธ์›Œํฌ ํ†ต์‹ ์ด ํ•„์š”ํ•˜๊ธฐ์— ๋ ˆ์ดํ„ด์‹œ๊ฐ€ ์•ฝ๊ฐ„ ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค. ๋ฐ˜๋ฉด Redis๋Š” In-Memory ๊ธฐ๋ฐ˜์ด๊ธฐ์— ๋งค์šฐ ๋น ๋ฅด๊ฒŒ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ, ๋‹ค์Œ์˜ ๊ฒฝ์šฐ์— Redis๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ด๋ผ๋ฉด ๊ดœ์ฐฎ๋‹ค!

  • ํ˜„์žฌ ์ ‘์† ์ค‘์ธ ํด๋ผ์ด์–ธํŠธ๋“ค์—๊ฒŒ ์งง๊ณ  ๊ฐ„๋‹จํ•œ ๋ฉ”์‹œ์ง€๋ฅผ ๋น ๋ฅด๊ฒŒ ๋ณด๋‚ด๊ณ  ์‹ถ์„ ๋•Œ
  • ์ „์†ก๋œ ๋ฉ”์‹œ์ง€๋ฅผ ๋”ฐ๋กœ ์ €์žฅํ•˜๊ฑฐ๋‚˜ ์ˆ˜์‹  ํ™•์ธ์ด ํ•„์š” ์—†์„ ๋•Œ
  • ์ „์†ก ๋ณด์žฅ์€ ํ•˜์ง€ ์•Š์•„๋„ ๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ผ ๋•Œ



โœ๏ธ
Redis์— ๊ด€ํ•œ ๋‚ด์šฉ์ด ์ƒ๋‹นํžˆ ๊ธธ๊ณ  ๋ฐฉ๋Œ€ํ–ˆ๋‹ค...! ์ž ๊น ๋จธ๋ฆฟ์†์„ ์ •๋ฆฌํ•ด ๋ณด์ž:)

๋ฉ”์‹œ์ง• ํ”Œ๋žซํผ์€ ํฌ๊ฒŒ ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค / ์ด๋ฒคํŠธ ๋ธŒ๋กœ์ปค๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์—ˆ๊ณ , ์ „์— ์•Œ์•„๋ณธ Kafka๊ฐ€ ์ด๋ฒคํŠธ ๋ธŒ๋กœ์ปค, ์˜ค๋Š˜ ์•Œ์•„๋ณผ Redis/RabbitMQ๊ฐ€ ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค์— ํ•ด๋‹นํ–ˆ๋‹ค.

Redis๋Š” key-value๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๋น„๊ด€๊ณ„ํ˜•(NoSQL) DBMS๋กœ์„œ, ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ DB, ์บ์‹œ ๋“ฑ์˜ ์—ญํ• ๋„ ํ•˜๋ฉฐ, ์ธ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง„๋‹ค. ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค๋กœ์„œ์˜ Redis๋Š” ์ผ๋ฐ˜์ ์ธ ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค์™€ ๋‹ฌ๋ฆฌ ๋ฉ”์‹œ์ง€ ์ „์†ก์„ ๋ณด์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ํŠน์ง•๋„ ์•Œ ์ˆ˜ ์žˆ์—ˆ๋‹ค!โœจ

Redis์— ๊ด€ํ•œ ๊ฐœ๋…์„ ์žก์•˜์œผ๋‹ˆ, ์ด์ œ ๋˜ ๋‹ค๋ฅธ ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค์ธ RabbitMQ์— ๊ด€ํ•ด์„œ๋„ ํŒŒํ—ค์ณ๋ณด์ž :D




๐Ÿฐ RabbitMQ

RabbitMQ๋ž€?

: AMQP๋ฅผ ๋”ฐ๋ฅด๋Š” ์˜คํ”ˆ์†Œ์Šค ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค!

RabbitMQ๋Š” ์ฃผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•œ๋‹ค.

  • ๋ฉ”์‹œ์ง€๋ฅผ ๋งŽ์€ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ „๋‹ฌํ•  ๋•Œ
  • ์š”์ฒญ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ ์‹œ๊ฐ„์ด ๊ธธ์–ด์„œ ํ•ด๋‹น ์š”์ฒญ์„ ๋‹ค๋ฅธ API์—๊ฒŒ ์œ„์ž„ํ•˜๊ณ  ๋น ๋ฅธ ์‘๋‹ต์„ ํ•  ๋•Œ

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

  • Consumer๊ฐ€ ๋ฉ”์„ธ์ง€๋ฅผ ๋ฐ›์œผ๋ฉด ๋ธŒ๋กœ์ปค์—๊ฒŒ ํ†ต์ง€ํ•˜๊ณ , ๋ธŒ๋กœ์ปค๋Š” ํ†ต์ง€๋ฅผ ๋ฐ›์•˜์„ ๋•Œ๋งŒ queue์—์„œ ํ•ด๋‹น ๋ฉ”์„ธ์ง€ ์‚ญ์ œ
  • ๋ธŒ๋กœ์ปค๊ฐ€ ๋ฉ”์„ธ์ง€๋ฅผ ์ „๋‹ฌํ•˜๋ฉด ์ž๋™์œผ๋กœ ์‚ญ์ œ

RabbitMQ ์ฃผ์š” ๊ฐœ๋…

RabbitMQ์˜ ๊ตฌ์กฐ๋‚˜ ๋™์ž‘๋ฐฉ์‹์„ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š”, ๋ช‡๊ฐ€์ง€ ๊ฐœ๋…์— ๋Œ€ํ•œ ์ดํ•ด๊ฐ€ ํ•„์š”ํ•˜๋‹ค! ํ•˜๋‚˜์”ฉ ์ฐจ๊ทผ์ฐจ๊ทผ ์งš์–ด๋ณด์ž :>
(Kafka์—์„œ ๋‹ค๋ฃจ์—ˆ๋˜ ๋‚ด์šฉ์ด๋ผ๋„ ํ•จ๊ป˜ ์ •๋ฆฌํ•จ!)

์•„๋ž˜์˜ ๊ทธ๋ฆผ์„ ๊ธฐ์ค€์œผ๋กœ ์‚ดํŽด๋ณด์ž!
๊ธฐ๋ณธ์ ์œผ๋กœ ์ง€๊ธˆ๊นŒ์ง€ ๋ด์˜จ Kafka, Redis์™€ ๋™์ผํ•˜๊ฒŒ Pub-Sub ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

  • Producer : ๋ฉ”์‹œ์ง€๋ฅผ ์ƒ์„ฑํ•ด์„œ ๋ณด๋‚ด๋Š” ์ฃผ์ฒด์ด๋‹ค. Pub-Sub ๊ตฌ์กฐ์—์„œ Publisher์— ํ•ด๋‹นํ•œ๋‹ค. ์ด ๋ฉ”์‹œ์ง€๋Š” Queue์— ์ €์žฅ์ด ๋˜๋Š”๋ฐ, ์ฃผ์˜ํ•  ์ ์€ RabbitMQ์—์„œ Producer๋Š” Queue์— ์ง์ ‘ ์ ‘๊ทผํ•˜์ง€ ์•Š๊ณ , ํ•ญ์ƒ Exchange๋ฅผ ํ†ตํ•ด ์ ‘๊ทผํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค!๐Ÿ˜Ž

  • Consumer : ์ตœ์ข…์ ์œผ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›๋Š” ์ฃผ์ฒด์ด๋‹ค. Consumer๋Š” Queue์— ์ง์ ‘ ์ ‘๊ทผํ•ด์„œ ๋ฉ”์‹œ์ง€๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.

  • Queue : Producer๋“ค์ด ๋ณด๋‚ธ ๋ฉ”์‹œ์ง€๋“ค์ด ๋ณด๊ด€๋˜๋Š” ์žฅ์†Œ์ด๋ฉฐ, Consumer๊ฐ€ ์†Œ๋น„ํ•˜๋ฉด ๋ฉ”์‹œ์ง€๊ฐ€ ์‚ฌ๋ผ์ง„๋‹ค. Queue๋Š” ์ด๋ฆ„์œผ๋กœ ๊ตฌ๋ถ„๋œ๋‹ค.

  • Exchange : Producer๋“ค์—๊ฒŒ์„œ ์ „๋‹ฌ๋ฐ›์€ ๋ฉ”์‹œ์ง€๋“ค์„ ์–ด๋–ค Queue์—๊ฒŒ ๋ณด๋‚ผ์ง€ ๊ฒฐ์ •ํ•˜๋Š” ๊ฐ์ฒด์ด๋‹ค. ์ผ์ข…์˜ ๋ผ์šฐํ„ฐ๋ผ๊ณ  ์ดํ•ดํ•˜๋ฉด ํŽธํ•˜๊ฒ ๋‹ค. Exchange๋Š” ๋„ค ๊ฐ€์ง€์˜ ํƒ€์ž…์ด ์žˆ๋Š”๋ฐ, ์ด๋Š” ์•„๋ž˜์—์„œ ์ž์„ธํžˆ ๋‹ค๋ค„๋ณด์ž!

  • Binding : Exchange์™€ Queue๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๊ด€๊ณ„์ด๋‹ค. ๋ชจ๋“  ๋ฉ”์‹œ์ง€๋Š” Exchange๊ฐ€ ๊ฐ€์žฅ ๋จผ์ € ์ˆ˜์‹ ํ•˜๋Š”๋ฐ, Exchange ํƒ€์ž…๊ณผ binding ๊ทœ์น™์— ๋”ฐ๋ผ ์ ์ ˆํ•œ Queue์— ์ „๋‹ฌ๋œ๋‹ค. binding์ด ๋˜์–ด ์žˆ์–ด์•ผ Exchange๊ฐ€ Queue์—๊ฒŒ ๋ฉ”์‹œ์ง€๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค.

โ†’ Exchange๋Š” ๊ทœ์น™์œผ๋กœ ์–ด๋–ป๊ฒŒ ๋ผ์šฐํŒ…์ด ๋ ์ง€ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ์ด๋ผ๋ฉด, Binding์€ ๊ฒฐ์ •๋œ ๋ฉ”์‹œ์ง€๋ฅผ ์–ด๋–ค Queue์—๊ฒŒ ์ „๋‹ฌํ• ์ง€ ๋ผ์šฐํŒ…ํ•  ๊ทœ์น™์„ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

โœ‰๏ธ ๋ฉ”์‹œ์ง€ ์ „๋‹ฌ์˜ ํ๋ฆ„์„ ์ •๋ฆฌํ•ด๋ณด์ž๋ฉด!
Produce๊ฐ€ ๋ฉ”์‹œ์ง€๋ฅผ Exchange์—๊ฒŒ ์ „๋‹ฌ โ†’ Exchange๊ฐ€ Binding์— ๋”ฐ๋ผ ๋ฉ”์‹œ์ง€๋ฅผ Queue๋กœ ๋ผ์šฐํŒ… โ†’ Queue์— ๋ฉ”์‹œ์ง€๊ฐ€ ์ €์žฅ โ†’ Consumer๊ฐ€ Queue์—์„œ ๋ฉ”์‹œ์ง€๋ฅผ ๊ฐ€์ ธ๊ฐ€์„œ ์ฒ˜๋ฆฌ


Exchange์™€ Queue์˜ ์†์„ฑ

Excgabge์™€ Queue๋Š” ์ƒ์„ฑ ์‹œ ์†์„ฑ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ์–ด๋–ค ์†์„ฑ์ด ์žˆ๋Š”์ง€ ์งš์–ด๋ณด์ž!

Exchange

  • Name : Exchange ์ด๋ฆ„
  • Type : ๋ฉ”์‹œ์ง€ ์ „๋‹ฌ ๋ฐฉ์‹
    - Direct
    - Fanout
    - Topic
    - Headers
  • Durability : ๋ธŒ๋กœ์ปค๊ฐ€ ์žฌ์‹œ์ž‘๋  ๋•Œ ๋‚จ์•„์žˆ๋Š”์ง€ ์—ฌ๋ถ€
    - Durable : ๋ธŒ๋กœ์ปค๊ฐ€ ์žฌ์‹œ์ž‘๋˜์–ด๋„ ๋””์Šคํฌ์— ์ €์žฅ๋˜์–ด ๋‚จ์•„์žˆ์Œ
    - Transient : ๋ธŒ๋กœ์ปค๊ฐ€ ์žฌ์‹œ์ž‘๋˜๋ฉด ์‚ฌ๋ผ์ง
  • Auto-delete : ๋งˆ์ง€๋ง‰ Queue ์—ฐ๊ฒฐ์ด ํ•ด์ œ๋˜๋ฉด ์‚ญ์ œ

Queue

  • Name : Queue ์ด๋ฆ„
  • Durability : ๋ธŒ๋กœ์ปค๊ฐ€ ์žฌ์‹œ์ž‘๋  ๋•Œ ๋‚จ์•„์žˆ๋Š”์ง€ ์—ฌ๋ถ€
    - Durable : ๋ธŒ๋กœ์ปค๊ฐ€ ์žฌ์‹œ์ž‘๋˜์–ด๋„ ๋””์Šคํฌ์— ์ €์žฅ๋˜์–ด ๋‚จ์•„์žˆ์Œ
    - Transient : ๋ธŒ๋กœ์ปค๊ฐ€ ์žฌ์‹œ์ž‘๋˜๋ฉด ์‚ฌ๋ผ์ง
  • Auto delete : ๋งˆ์ง€๋ง‰ Consumer๊ฐ€ consume์„ ๋๋‚ผ ๊ฒฝ์šฐ ์ž๋™ ์‚ญ์ œ
  • Argument : ๋ฉ”์‹œ์ง€ TTL, Max Length ๊ฐ™์€ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ ๋ช…์‹œ

RabbitMQ์˜ 4๊ฐ€์ง€ Exchange ํƒ€์ž…

1.Fanout Exchange

Fanout์€ Exchange์— ๋“ฑ๋ก๋œ ๋ชจ๋“  queue์—๊ฒŒ ๋™์ผํ•œ ๋ฉ”์„ธ์ง€๋ฅผ ๋ณด๋‚ด๋Š” ๋ฐฉ์‹์ด๋‹ค.
โ†’ ์ „์ฒด๋ฉ”์„ธ์ง€ ๊ฐ™์€ ๊ฒƒ์ด๋‹ค!


2.Direct Exchange

Direct๋Š” Routing key๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ผ์šฐํŒ… ํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

๐Ÿ”‘ Routing Key ๐Ÿ”‘
: ๋ฉ”์‹œ์ง€๋ฅผ ํŠน์ • ํ๋กœ ๋ผ์šฐํŒ…(์ „๋‹ฌ)ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์‹๋ณ„์ž์ด๋‹ค. ๋ผ์šฐํŒ… ํ‚ค๋Š” Direct์™€ Topic ๋ฐฉ์‹์—์„œ ์ฃผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค. ํ•˜๋‚˜์˜ ํ์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ผ์šฐํŒ… ํ‚ค๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์—ฌ๋Ÿฌ ํ์— ๋™์ผํ•œ ๋ผ์šฐํŒ… ํ‚ค๋ฅผ ์ง€์ •ํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.
์ฆ‰, ๋ผ์šฐํŒ… ํ‚ค๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ Exchange์™€ Queue๋ฅผ 1:N์œผ๋กœ ๋ฐ”์ธ๋”ฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๋‹ค์‹œ ๋งํ•ด, Direct Exchange ๋ฐฉ์‹์€ Exchange์—์„œ ๋ณด๋‚ธ ๋ฉ”์‹œ์ง€๋ฅผ ์‹๋ณ„์ž์ธ routing key๋ฅผ ํ†ตํ•ด queue์™€ ์ง์ ‘ ์ž‡๋Š”(๋ฐ”์ธ๋”ฉํ•˜๋Š”) ๊ฒƒ์ด๋‹ค.

RabbitMQ์—์„œ Default Exchange๋Š” ์ด๋ฆ„์ด ์—†๋Š” Direct Exchange์ด๋‹ค. ์ƒ์„ฑ๋˜๋Š” queue๊ฐ€ ์ž๋™์œผ๋กœ ๋ฐ”์ธ๋”ฉ๋˜๋ฉฐ, ์ด๋•Œ rounting key๋Š” ๊ฐ ํ์˜ ์ด๋ฆ„์œผ๋กœ ์ง€์ •๋œ๋‹ค.


3.Topic Exchange

Topic์€ Routin Key ํŒจํ„ด์ด ์ผ์น˜ํ•˜๋Š” ํ์— ๋ฉ”์‹œ์ง€๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.
โ†’ Direct๋Š” ๋ผ์šฐํŒ… ํ‚ค๊ฐ€ ์™„์ „ํžˆ ๊ฐ™์€ ํ๋“ค์—๊ฒŒ ๋ฉ”์‹œ์ง€๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹์ด๋ผ๋ฉด, Topic์€ ํŠน์ • ํŒจํ„ด๋งŒ ์ผ์น˜ํ•˜๋ฉด ํ•ด๋‹น ํ๋“ค์—๊ฒŒ ๋ฉ”์‹œ์ง€๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹!๐Ÿ‘

๋ผ์šฐํŒ… ํ‚ค ํŒจํ„ด์˜ ๊ทœ์น™

  • * : ๋‹จ์–ด 1๊ฐœ๋ฅผ ๋Œ€์ฒด
  • # : 0๊ฐœ ์ด์ƒ์˜ ๋‹จ์–ด๋ฅผ ๋Œ€์ฒด

4.Headers Exchange

Header๋Š” key-value๋กœ ์ •์˜๋œ ํ—ค๋”์— ์˜ํ•ด ๋ฉ”์‹œ์ง€๋ฅผ queue์— ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.
producer์ชฝ์—์„œ ์ •์˜ํ•˜๋Š” header์˜ key-value์™€ consumer์ชฝ์—์„œ ์ •์˜๋œ argument์˜ key-value๊ฐ€ ์ผ์น˜ํ•˜๋ฉด ๋ฐ”์ธ๋”ฉ์ด ๋œ๋‹ค.

Producer์—์„œ ์ •์˜ํ•˜๋Š” ํ—ค๋”๋Š” ๋ฉ”์‹œ์ง€์™€ ํ•จ๊ป˜ ์ „์†ก๋˜๊ณ , Consumer์ชฝ์—์„œ๋Š” exchange์™€ queue๊ฐ€ ๋ฐ”์ธ๋”ฉ๋˜๋Š” ์‹œ์ ์— argument๋ฅผ ์ •์˜ํ•œ๋‹ค.

์ด๋•Œ header์—๋Š” x-match๋ผ๋Š” key๊ฐ€ ์žˆ์œผ๋ฉฐ ๊ฐ’์œผ๋กœ๋Š” any ๋˜๋Š” all์ด ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋‹ค. all์˜ ๊ฒฝ์šฐ header์˜ key-value์™€ argument์˜ key-value๊ฐ€ ์ •ํ™•ํžˆ ์ผ์น˜ํ•ด์•ผ ๋ฐ”์ธ๋”ฉ๋˜๋ฉฐ, any์˜ ๊ฒฝ์šฐ header์˜ key-value์™€ argument์˜ key-value ์‚ฌ์ด์— ํ•˜๋‚˜๋ผ๋„ ์ผ์น˜ํ•˜๋Š” ๊ฒƒ์ด ์žˆ์œผ๋ฉด ๋ฐ”์ธ๋”ฉ๋œ๋‹ค.




๐ŸŒŸ Redis์™€ RabbitMQ ๋น„๊ต&์ •๋ฆฌ!

๊ธฐ๋ณธ ๊ฐœ๋…

  • Redis : key-value ํ˜•ํƒœ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๋น„๊ด€๊ณ„ํ˜• DB, ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ DB, ์บ์‹œ์˜ ์—ญํ• ๋„ ํ•œ๋‹ค.
  • RabbitMQ : ์˜คํ”ˆ์†Œ์Šค ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค

์ด๋ฒคํŠธ ์ €์žฅ

  • Redis : ์ €์žฅํ•˜์ง€X. ์‹ฌ์ง€์–ด channel์— ์ด๋ฒคํŠธ๊ฐ€ ๋„์ฐฉํ–ˆ์„ ๋•Œ ํ•ด๋‹น ์ฑ„๋„์˜ subscriber๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด ์ด๋ฒคํŠธ ์‚ฌ๋ผ์ง„๋‹ค.
  • RabbitMQ : ๋ฉ”์„ธ์ง€๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์ „๋‹ฌ๋˜์—ˆ๋‹ค๊ณ  ํŒ๋‹จ๋  ๊ฒฝ์šฐ ๋ฉ”์„ธ์ง€๊ฐ€ ํ์—์„œ ์‚ญ์ œ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์žฌ์ฒ˜๋ฆฌ๊ฐ€ ์–ด๋ ต๋‹ค.



0๊ฐœ์˜ ๋Œ“๊ธ€