๐ก ๋ค์ด๊ฐ๋ฉฐ
์ง๋ ํฌ์คํ
์์ Kafka์ ๊ดํด ์์๋ณด์๋ค. ์นดํ์นด๋ Pub-Sub ๊ตฌ์กฐ์ ๋ฉ์์ง ํ ์๋น์ค๋ฅผ ์ ๊ณตํ๋ค๊ณ ์๊ฐํ๋๋ฐ, ์ด ๋ฉ์์ง ํ๋ฅผ ๋ค๋ฃฐ ๋ ํจ๊ป, ์์ฃผ ์ธ๊ธ๋๋ ๊ฒ์ด Redis์ RabbitMQ์ด๋ค. Redis์ RabbitMQ๋ ์ ํํ ๋ฌด์์ด๊ณ ์ด๋ค ์ญํ ์ ํ๋์ง, ๋ MQ๋ก์จ ๊ฐ๊ฐ์ ์ด๋ค ๊ณตํต์ ๊ณผ ์ฐจ์ด์ ์ ๊ฐ์ง๋์ง ์์๋ณด์!
Redis, RabbitMQ, Kafka์ ๊ฐ์ด ๋ฉ์์ง ๊ธฐ๋ฐ ์ ๋ฌ ๊ธฐ์ ๋ค์ ๋ฉ์์ง ํ๋ซํผ์ด๋ผ๊ณ ๋ถ๋ฅด๋๋ฐ, ๋ฉ์์ง ํ๋ซํผ์ ๋ฉ์์ง ๋ธ๋ก์ปค / ์ด๋ฒคํธ ๋ธ๋ก์ปค 2๊ฐ์ง ์ข
๋ฅ๋ก ๋๋ ์ ์๋ค. ๋ฉ์์ง ๋ธ๋ก์ปค์ ๋ํ์ ์ธ ์๊ฐ Redis, RabbitMQ์ด๊ณ Kafka๊ฐ ๋ํ์ ์ธ ์ด๋ฒคํธ ๋ธ๋ก์ปค์ธ ๊ฒ์ด๋ค!
์ฌ๊ธฐ์ ๋์ ๋์ ๋ฐฉ์์์ ํ์ฐํ ์ฐจ์ด๊ฐ ์๋ค. ๋ฉ์์ง ๋ธ๋ก์ปค๋ ์ด๋ฒคํธ ๋ธ๋ก์ปค๋ก ์ฌ์ฉํ ์ ์์ง๋ง, ์ด๋ฒคํธ ๋ธ๋ก์ปค๋ ๋ฉ์์ง ๋ธ๋ก์ปค๋ก ์ฌ์ฉํ ์ ์๋ค :D
โ ๊ทธ๋์ Kafka๋ฅผ ์๊ธฐํ ๋์๋ ๋ฉ์์ง ๋ธ๋ก์ปค๋ก์ ๊ธฐ๋ฅํ๋ค๋ ์ค๋ช ์ด!๐
๐ง ๊ทธ๋์, ๋ฉ์์ง/์ด๋ฒคํธ ๋ธ๋ก์ปค๊ฐ ๋ญ๋ฐ?
Producer๊ฐ ์์ฐํ ๋ฉ์์ง๋ฅผ ํ์ ์ ์ฅํ๊ณ , ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ Consumer๊ฐ ๊ฐ์ ธ๊ฐ ์ ์๋๋ก ์ค๊ฐ ๋ค๋ฆฌ ์ญํ ์ ํด์ฃผ๋ ๋ธ๋ก์ปค์ด๋ค. ์ด๋ ๋๊ท๋ชจ ๋ฉ์์ง ๊ธฐ๋ฐ ๋ฏธ๋ค์จ์ด ์ํคํ ์ฒ์์ ํํ ์ฌ์ฉ๋์ด ์๋ค.
๐ ๋ฉ์์ง ๋ธ๋ก์ปค๋ ์ด๋ป๊ฒ ๋์ํ ๊น?
๋ฉ์์ง ๋ธ๋ก์ปค๋ฅผ ์ฌ์ฉํ๋ ํ๊ฒฝ์์๋ Producer๊ฐ ๋ฉ์์ง๋ฅผ ์์ฑํ๋ฉด, ๋ฉ์์ง ๋ธ๋ก์ปค ๋ด์์ ์ด ๋ฉ์์ง๋ฅผ ์ด๋ค ํ์ ๋ฐ์กํ ์ง ๊ฒฐ์ ํ๋ Exchange๋ฅผ ํ๊ฒ ๋๊ณ , ์ด๋ ๊ฒ ํ์ ๋ค์ด๊ฐ ๋ฉ์์ง๋ Consumer๊ฐ ๊ฐ์ ธ๊ฐ๊ฒ ๋๋ค.
โ Consumer๊ฐ ๋ฉ์์ง๋ฅผ ๊ฐ์ ธ๊ฐ๋ฉด ํ์๋ ๋์ด์ ๋ฉ์์ง๊ฐ ๋จ์ง ์๊ณ ์ฌ๋ผ์ง๋ ๊ฒ์ด ํน์ง์ด๋ค.
์ด๋ฒคํธ ๋ธ๋ก์ปค๋ Kafka์์ ๋ค๋ฃจ์๋ ๊ฒ์ฒ๋ผ, ๋ฉ์์ง ๋ธ๋ก์ปค์ ํ ๊ธฐ๋ฅ์ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ ์ถ๊ฐ์ ์ผ๋ก ์ด๋ฒคํธ ๋ณ ๊ด๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋ค. ๋ฉ์์ง ๋ธ๋ก์ปค์ ์ด๋ฒคํธ ๋ธ๋ก์ปค ๋ชจ๋ ์ด๋ฒคํธ๋ฅผ ์์ ํ๊ณ , ์ด๊ฒ์ ์๋น์์๊ฒ ์ ๋ฌํ๋ ๋ฐ์ ๋ชฉ์ ์ ๋๊ณ ์์ง๋ง ์๋ ๋ฐฉ์์ ํฐ ์ฐจ์ด๊ฐ ์๋ค!
Kafka์์ ์ด๋ฏธ ๋ค๋ฃจ์์ง๋ง, ๋ฉ์์ง ๋ธ๋ก์ปค์ ๋น๊ตํ ๊ฒธ ์ด๋ฒคํธ ๋ธ๋ก์ปค์ ๋์ ๋ฐฉ์์ ์ง๊ณ ๋์ด๊ฐ ๋ณด์!
๐ ์ด๋ฒคํธ ๋ธ๋ก์ปค๋ ์ด๋ป๊ฒ ๋์ํ ๊น?
์ด๋ฒคํธ ๋ธ๋ก์ปค๋ ๋ฉ์์ง ๋ธ๋ก์ปค์ ๋ค๋ฅด๊ฒ ์ด๋ฒคํธ๊ฐ Topic ๋จ์๋ก Event Streamer์ ์ ์ฅ๋๋ค. Producer๊ฐ ์ด๋ฒคํธ๋ฅผ ์์ฑํ๋ฉด, Topic์ ๋ฐ๋ผ ๋ถ๋ฅ๋์ด ์์๋๋ก ๊ธฐ๋ก๋๋ค. ๊ทธ ํ ํด๋น Topic์ ๊ตฌ๋ ํ Consumer๊ฐ ์ด๋ฒคํธ๋ฅผ ๊ฐ์ ธ๊ฐ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ด๋ค.
โ ์ด๋ฒคํธ ๋ธ๋ก์ปค๋ Producer๊ฐ ์์ฐํ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ ํ ๋ฐ๋ก ์ญ์ ํ์ง ์๋ ๊ฒ์ด ๊ฐ์ฅ ํฐ ์ฐจ์ด์ ์ด๋ค!
์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌ ํ ๋ฐ๋ก ์ญ์ ํ์ง ์์ผ๋ฏ๋ก, ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ ํ ์ฅ์ ๊ฐ ๋ฐ์ํ์ ๋ ํน์ ์์ ์ ์ด๋ฒคํธ๋ถํฐ ๋ค์ ์ ๊ทผํ ์ ์๋ค. ์ฅ์ ๊ฐ ์ด๋์์ ๋ฌ๋์ง ์ ์ ์์ผ๋ฉฐ, ์ฅ์ ํฌ์ธํธ์ ์ฐพ์๊ฐ์ ์ฅ์ ์ฌ์ฒ๋ฆฌ๋ ๊ฐ๋ฅํ๋ค.
์ด๋ ๋์ฉ๋ ๋ฐ์ดํฐ ์คํธ๋ฆฌ๋ฐ์ ์ฒ๋ฆฌ ๋ฅ๋ ฅ์ ๊ฐ์ง๊ณ ์๋ค.
๐ก
์ด๋ ๊ฒ ๋ฉ์์ง ํ๋ซํผ์ ํฌ๊ฒ ๋ฉ์์ง ๋ธ๋ก์ปค, ์ด๋ฒคํธ ๋ธ๋ก์ปค๋ก ๋๋ ์ ์๋ค๋ ์ฌ์ค๊ณผ ๊ฐ๊ฐ์ ๊ฐ๋ตํ ๊ฐ๋
, ๊ทธ๋ฆฌ๊ณ ์ด๋ฒ์ ์์๋ณผ Redis / RabbitMQ๋ ๋ฉ์์ง ๋ธ๋ก์ปค์ ํด๋นํ๋ค๋ ๊ฒ์ ์์๋ค. ์ด์ Redis์ RabbitMQ์ ๊ดํด ํ๋์ฉ ํํค์ณ๋ณด์!
์, ํ ๊ฐ์ง ์ง๊ณ ๋์ด๊ฐ ๊ฒ์, ์๋ก ์์๋ Redis๋ฅผ ๋ฉ์์ง ๋ธ๋ก์ปค๋ก์ ์๊ฐํ์ผ๋ Redis๋ ๋ฉ์์ง ๋ธ๋ก์ปค๊ฐ ์๋ ๋ค๋ฅธ ์ฉ๋๋ก๋ ๋ค์ํ๊ฒ ์ฌ์ฉ๋๋ ํ๋์ DBMS์ด๋ค! ํผ๋ํ์ง ๋ง๊ณ , ์ฐ์ Redis ๊ทธ ์์ฒด์ ๊ฐ๋ ์ ๊ดํด ๋ชจ๋ ์์๋ณธ ๋ค ๋ฉ์์ง ๋ธ๋ก์ปค๋ก์์ Redis๋ ๋ค๋ฃจ์ด ๋ณด์ :>

๋ ๋์ค๋ 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 ํ๋ฉด ํญ์ ์บ์ฑ์ ๊ฐ๋ ์ด ๋ฐ๋ผ ๋ถ๋๋ค.
์บ์๋ ๊ฐ๋จํ ๋งํ์๋ฉด, ํน์ ๋ฐ์ดํฐ์ ๋ํ ์์ฒญ์ ๋น ๋ฅด๊ฒ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์์์ ์ ์ฅ๊ณต๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋๋ ๊ฒ์ผ๋ก, ์ ์ฅ์์ ์ ๊ทผํ ํ์ ์์ด ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ฌ ์ ์์ด ์ฒ๋ฆฌ ์๋๊ฐ ํฅ์๋๋ค.
๋ ๋์ค๋ "DB์ ์ ์ฅํ๋ ์ ๋ณด๋ฅผ ์บ์์ฒ๋ผ Main Memory์ ๋์ด ์ฝ๊ณ ๋น ๋ฅด๊ฒ ์ ๊ทผํ์!" ๋ผ๋ ์๊ฐ์์ ๋ฑ์ฅํ๋ค. ๋ ์์ฃผ ์ ๊ทผํ๊ณ ๋ ์์ฃผ ๋ฐ๋๋ ๋ฐ์ดํฐ๋ฅผ DB ๋์ ๋ฉ์ธ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ๋ ํํ๋ฅผ In-memory DB๋ผ ๋ถ๋ฅด๊ณ , ๊ทธ ๋ํ์ ์ธ ์๊ฐ Redis์ธ ๊ฒ์ด๋ค! :>
Redis๋ ๋ฐ์ดํฐ๋ฅผ ์ธ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ๋ฏ๋ก, ๋น์ฐํ ๋์คํฌ์ ๋นํด ํจ์ฌ ๋น ๋ฅด๊ฒ ์์ ์ ์ํํ ์ ์๋ค! ๋ํ key-value ํ์์ผ๋ก ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋๊ธฐ ๋๋ฌธ์ (์ฐ์์ ์ธ ๋ฐ์ดํฐ ๊ฒ์์ด ๋ถํ์ํ๋ฏ๋ก) ๋ณด๋ค ๋น ๋ฅด๊ฒ ๋ฐ์ดํฐ์ ์ ๊ทผํ ์ ์๋ค.
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๋ง ์ฌ์ฉ : ์ฅ์ ๋ฐ์ ์ง์ ๊น์ง ๋ชจ๋ ๋ฐ์ดํฐ๊ฐ ๋ณด์ฅ๋์ด์ผ ํ ๊ฒฝ์ฐ
Redis๋ ๋จ์ผ ์ค๋ ๋์ด๊ธฐ ๋๋ฌธ์, 1๋ฒ์ 1๊ฐ์ ๋ช
๋ น์ด๋ง ์คํํ ์ ์๋ค.
๋ฐ๋ผ์ Atomic(์์์ฑ)์ ๋ณด์ฅํ ์ ์์ผ๋ฉฐ, ๋ฉํฐ ์ค๋ ๋๋ฅผ ์ฌ์ฉํ๋ฉด์ ๋ฐ์ํ๋ ์ปจํ
์คํธ ์ค์์นญ๊ณผ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ ์ค์ผ ์ ์์ด ๋น ๋ฅด๊ฒ ์๋ตํ ์ ์๋ค.
๊ทธ๋ฌ๋ ๋น์ฐํ ๋ค์ค ์ฒ๋ฆฌ๋ ๋์์ฑ์ด ์๊ตฌ๋๋ ์์ ์๋ ์ ํฉํ์ง ์๋ค. ์ฌ๋ฌ ๊ฐ์ CPU ์ฝ์ด๋ฅผ ํ์ฉํ์ฌ ๋ณ๋ ฌ ์ฒ๋ฆฌ๋ฅผ ํ ์ ์๋ ํ๊ณ๊ฐ ์๋ค. ๋ฐ๋ผ์, ํ๋์ ์์ฒญ์ด ๋ณ๋ชฉ๋๋ฉด ๊ทธ ๋ค์ ์์ฒญ๋ค์ด ๊ณ์ ๋ฐ๋ฆฌ๊ฒ ๋๋ฏ๋ก ๋ณต์ก๋๊ฐ O(n)์ธ ๋ช ๋ น์ด์ ์ฌ์ฉ์ ์ฃผ์ํด์ผ ํ๋ค.
*์์์ฑ : ํ๋์ ์์ (์์ ๋จ์)์ด ์ค๊ฐ์ ๋๊ธฐ์ง ์๊ณ ์์ ํ ์ํ๋๊ฑฐ๋ ์ ํ ์ํ๋์ง ์์์ ๋ณด์ฅํ๋ ์ฑ์ง
Redis๋ Pub - Channel - Sub ๊ตฌ์กฐ๋ฅผ ๊ฐ๊ณ ์๋ค.
publisher๊ฐ Channel์ ๋ฉ์์ง๋ฅผ ๋ฐํํ๋ฉด ํด๋น Channel์ ๊ตฌ๋
ํ๋ Subscriber๋ค์ ๋ฉ์ธ์ง๋ฅผ ์ ์กํ๋ค.
์ด ๊ธฐ๋ฅ์ ์ค์๊ฐ ์ฑํ
, ์ค์๊ฐ ์คํธ๋ฆฌ๋ฐ, ์ค์๊ฐ ์๋ฆผ, SNS ํผ๋ ๋ฑ์ ์ฌ์ฉํ ์ ์๋ค.
Redis๋ ๋จ์ผ ์ค๋ ๋๋ก ๋์ํ๊ธฐ ๋๋ฌธ์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ณ ๋ คํด์ผ ํ๋ค.
๋จ์ผ ์ค๋ ๋๋ก์ ๋์์ ๋จ 1๊ฐ์ ๋ช
๋ น์ด๋ง ์ฒ๋ฆฌํ ์ ์๋ค ํ๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์, ํ๋์ ๋ช
๋ น์ด๋ฅผ ์ฒ๋ฆฌํ๋ ์๋๊ฐ ์ค๋ ๊ฑธ๋ฆด ๊ฒฝ์ฐ ๋๋จธ์ง ๋ช
๋ น์ด๋ค์ ๋ชจ๋ ๋๊ธฐ ์ํ๋ก ์ ํ๋๋๋ฐ, ๋ฐ์ดํฐ์ ์๊ฐ ๋ง์ ๊ฒฝ์ฐ ํฐ ์๋ ์ ํ๋ฅผ ์ผ๊ธฐํ ์ ์๋ค.
๋ฐ๋ผ์, ํนํ O(n)์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ๋ ๋ํ์ ์ธ ๋ช
๋ น์ด๋ค(key, flushAll, flushDB, delete collections, get all collections)๋ ์ด์ํ๊ฒฝ์์ ์ฌ์ฉ์ ๊ธ์งํ๋ค!
๋น๊ต์ ์์ ๊ณต๊ฐ์ ๋น ๋ฅด๊ฒ ์ ๊ทผํ๋ In-memory ํน์ฑ ์ ๋ฉ๋ชจ๋ฆฌ ๋จํธํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค. ์ด๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋น๋ฐ๊ณ ๋ฐํํ๋ ๊ณผ์ ์์ ํ์์ ์ผ๋ก ๋ฐ์ํ๋ฉฐ, ๊ทธ ์ ๋๊ฐ ์ฌํ ๊ฒฝ์ฐ Process๊ฐ Memory์ ์ฌ๋ผ๊ฐ์ง ๋ชปํ๊ณ ์ฃฝ์ด๋ฒ๋ฆฌ๋ ๊ฒฝ์ฐ๊ฐ ๋ฐ์ํ ์ ์๋ค.
๋ฐ๋ผ์ 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

: AMQP๋ฅผ ๋ฐ๋ฅด๋ ์คํ์์ค ๋ฉ์์ง ๋ธ๋ก์ปค!
RabbitMQ๋ ์ฃผ๋ก ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ์ ์ฌ์ฉํ๋ค.
AMQP?
AMQP ์์ ํ์ธ ๋ชจ๋ธ
: AMQP๋ ๋คํธ์ํฌ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ฑฐ๋ ์์ฒญ์ ์ฒ๋ฆฌํ์ง ๋ชปํ์ ๊ฒฝ์ฐ๋ฅผ ๋๋นํด 2๊ฐ์ง ์์ ํ์ธ ๋ชจ๋ธ์ ๊ฐ์ง๋ค.
- Consumer๊ฐ ๋ฉ์ธ์ง๋ฅผ ๋ฐ์ผ๋ฉด ๋ธ๋ก์ปค์๊ฒ ํต์งํ๊ณ , ๋ธ๋ก์ปค๋ ํต์ง๋ฅผ ๋ฐ์์ ๋๋ง queue์์ ํด๋น ๋ฉ์ธ์ง ์ญ์
- ๋ธ๋ก์ปค๊ฐ ๋ฉ์ธ์ง๋ฅผ ์ ๋ฌํ๋ฉด ์๋์ผ๋ก ์ญ์

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์์ ๋ฉ์์ง๋ฅผ ๊ฐ์ ธ๊ฐ์ ์ฒ๋ฆฌ
Excgabge์ Queue๋ ์์ฑ ์ ์์ฑ์ ์ง์ ํ ์ ์๋ค. ์ด๋ค ์์ฑ์ด ์๋์ง ์ง์ด๋ณด์!
Exchange
Name : Exchange ์ด๋ฆType : ๋ฉ์์ง ์ ๋ฌ ๋ฐฉ์Durability : ๋ธ๋ก์ปค๊ฐ ์ฌ์์๋ ๋ ๋จ์์๋์ง ์ฌ๋ถAuto-delete : ๋ง์ง๋ง Queue ์ฐ๊ฒฐ์ด ํด์ ๋๋ฉด ์ญ์ Queue
Name : Queue ์ด๋ฆDurability : ๋ธ๋ก์ปค๊ฐ ์ฌ์์๋ ๋ ๋จ์์๋์ง ์ฌ๋ถAuto delete : ๋ง์ง๋ง Consumer๊ฐ consume์ ๋๋ผ ๊ฒฝ์ฐ ์๋ ์ญ์ Argument : ๋ฉ์์ง TTL, Max Length ๊ฐ์ ์ถ๊ฐ ๊ธฐ๋ฅ ๋ช
์
Fanout์ Exchange์ ๋ฑ๋ก๋ ๋ชจ๋ queue์๊ฒ ๋์ผํ ๋ฉ์ธ์ง๋ฅผ ๋ณด๋ด๋ ๋ฐฉ์์ด๋ค.
โ ์ ์ฒด๋ฉ์ธ์ง ๊ฐ์ ๊ฒ์ด๋ค!

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๋ ๊ฐ ํ์ ์ด๋ฆ์ผ๋ก ์ง์ ๋๋ค.

Topic์ Routin Key ํจํด์ด ์ผ์นํ๋ ํ์ ๋ฉ์์ง๋ฅผ ์ ๋ฌํ๋ ๋ฐฉ์์ด๋ค.
โ Direct๋ ๋ผ์ฐํ
ํค๊ฐ ์์ ํ ๊ฐ์ ํ๋ค์๊ฒ ๋ฉ์์ง๋ฅผ ์ ๋ฌํ๋ ๋ฐฉ์์ด๋ผ๋ฉด, Topic์ ํน์ ํจํด๋ง ์ผ์นํ๋ฉด ํด๋น ํ๋ค์๊ฒ ๋ฉ์์ง๋ฅผ ์ ๋ฌํ๋ ๋ฐฉ์!๐
๋ผ์ฐํ ํค ํจํด์ ๊ท์น
* : ๋จ์ด 1๊ฐ๋ฅผ ๋์ฒด# : 0๊ฐ ์ด์์ ๋จ์ด๋ฅผ ๋์ฒด
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 ์ฌ์ด์ ํ๋๋ผ๋ ์ผ์นํ๋ ๊ฒ์ด ์์ผ๋ฉด ๋ฐ์ธ๋ฉ๋๋ค.