์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- ์คํฐ๋
- select
- ์๋๋ก์ด๋
- Kotlin
- ํ๋ก๊ทธ๋๋จธ์ค
- join
- java
- Android
- SQL
- ์ ๋ณด์ฒ๋ฆฌ๊ธฐ์ฌ
- doitandroid
- ํฐ์คํ ๋ฆฌ์ฑ๋ฆฐ์ง
- ์๊ณ ๋ฆฌ์ฆ
- ํผ๊ณต์ฑ๋ฆฐ์ง
- ์ค๋ธ์
- ์๋ฐ
- ์นด์นด์ค์ฝํ
- groupby
- ํผ๊ณต๋จ
- ์ฝํ๋ฆฐ
- ์ ์ฒ๊ธฐ
- ์๋ฃ๊ตฌ์กฐ
- ์๋๋ก์ด๋์คํ๋์ค
- ์ธํ๋ฐ
- Til
- ๊ธฐ์ ๋ฉด์
- MySQL
- ์ฝํ
- ํผ๊ณตํ
- CS
- Today
- Total
Welcome! Everything is fine.
[STUDY] ๋๊ธฐ vs ๋น๋๊ธฐ - RabbitMQ๋ก ๋น๋๊ธฐ ์ด๋ฒคํธ ์ฒ๋ฆฌํ๊ธฐ ๋ณธ๋ฌธ
[STUDY] ๋๊ธฐ vs ๋น๋๊ธฐ - RabbitMQ๋ก ๋น๋๊ธฐ ์ด๋ฒคํธ ์ฒ๋ฆฌํ๊ธฐ
๊ฐ๋ฐ๊ณฐ๋ฐ 2025. 6. 5.๐ง ๋๊ธฐ · ๋น๋๊ธฐ์ ๋ธ๋กํน · ๋ ผ๋ธ๋กํน
๋๊ธฐ vs ๋น๋๊ธฐ
- ๋๊ธฐ(Synchronous) : ํธ์ถ์์ ์์ฒญ์์ ๊ฒฐ๊ณผ ํ์ธ์ด ๋์์ ์ผ์ด๋จ
- ๋น๋๊ธฐ(Asynchronous) : ํธ์ถ์์ ์์ฒญ์์ ๊ฒฐ๊ณผ ํ์ธ์ด ๋์์ ์ผ์ด๋์ง ์์๋ ๋จ
๋ธ๋กํน vs ๋ ผ๋ธ๋กํน
- ๋ธ๋กํน(Blocking) : ํธ์ถ์๊ฐ ์์ฒญ์ ๋ํ ๊ฒฐ๊ณผ๊ฐ ๋์ฌ ๋๊น์ง ์์ฒญ์์๊ฒ ์ ์ด๊ถ์ ๋๋ ค์ฃผ์ง ์๋ ๊ฒ
- ๋ ผ๋ธ๋กํน(Non-Blocking) : ํธ์ถ์๊ฐ ์์ฒญ์ ๋ํ ๊ฒฐ๊ณผ๊ฐ ๋์ค์ง ์๋๋ผ๋ ์์ฒญ์์๊ฒ ์ ์ด๊ถ์ ๋๋ ค์ค
๋์์ฑ vs ๋ณ๋ ฌ์ฑ
- ๋์์ฑ(Concurrency) : ์ฑ๊ธ ์ฝ์ด์์ ์ฌ๋ฌ ์์ ์ ๋ฒ๊ฐ์ ๊ฐ๋ฉฐ ์ฒ๋ฆฌํ๋ ๋ฐฉ์
- ๋ณ๋ ฌ์ฑ(Parallelism) : ๋ฉํฐ ์ฝ์ด๊ฐ ๊ฐ ์์ ์ ๋ฌผ๋ฆฌ์ ์ผ๋ก ๋์์ ์ฒ๋ฆฌํ๋ ๋ฐฉ์
์๋ฅผ ๋ค์ด, ์๋ ์ฝ๋๋ ๋ฉ์์ง๋ฅผ ์์ ํ ๋ ๋์์ ์ต๋ 3๊ฐ์ ๋ฉ์์ง๋ฅผ ์ฒ๋ฆฌํ ์ ์๋๋ก concurrency = "3" ์ค์ ์ ํด๋์๋ค.
์ด๋ Spring์ ๋ด๋ถ์ ์ผ๋ก ๋ฉํฐ์ค๋ ๋ ํ์ ํ์ฉํด ๋ฉ์์ง๋ฅผ ๋ณ๋ ฌ๋ก ์ฒ๋ฆฌํ๋ ค๊ณ ์๋ํ๋ค. ๋ง์ฝ ์ด ์ฝ๋๊ฐ ๋จ์ผ CPU ํ๊ฒฝ์์ ์คํ๋๋ค๋ฉด ์ค์ ๋ก๋ 3๊ฐ์ ์ค๋ ๋๊ฐ ๋ฐ๊ฐ์ ์คํ๋๋ฉฐ ๊ฐ๊ฐ์ ๋ฉ์์ง๋ฅผ ์ฒ๋ฆฌํ๊ฒ ๋๋๋ฐ, ์ด ๋ ๋ฐ์ํ๋ ๊ฒ์ด ๋์์ฑ ์ฒ๋ฆฌ๋ค.
๐จ ๋ฉ์์ง ์์คํ ์ด๋?
๋ฉ์์ง ํ์ ์ญํ ๊ณผ ๊ตฌ์กฐ
- ๋ฉ์์ง ํ(Message Queue, MQ) : ๋ฉ์์ง ์งํฅ ๋ฏธ๋ค์จ์ด(Message Oriented Middleware, MOM)์ ์ผ์ข ์ผ๋ก, ์๋ก ๋ ๋ฆฝ์ ์ธ ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ์ ๋ฉ์์ง๋ฅผ ์ฃผ๊ณ ๋ฐ์ผ๋ฉฐ ๋น๋๊ธฐ์ ์ผ๋ก ์์ ์ ์ฒ๋ฆฌํ ์ ์๋๋ก ํด์ฃผ๋ ์์คํ ์ด๋ค.
๋ฉ์์ง ์์คํ ์ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ๊ตฌ์กฐ๋ ์๋์ ๊ฐ์ด ์์ฐ์(Producer)๊ฐ ๋ฉ์์ง๋ฅผ Message Queue์ ๋ฃ๊ณ , ์๋น์(Consumer) ๊ฐ ์ด๋ฅผ ๊บผ๋ด ์ฒ๋ฆฌํ๋ ๊ตฌ์กฐ์ด๋ค. Producer์ Consumer๊ฐ ๋น๋๊ธฐ์ ์ผ๋ก ๋ถ๋ฆฌ๋์ด ์๋ค๋ ๊ฒ์ด ํต์ฌ์ด๋ค.
- ๋ฉ์์ง ํ์ ํน์ง
- ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ก ์๋ต ์ง์ฐ ํด์
- Producer์ Consumer๊ฐ ์๊ฐ์ ์ผ๋ก ๋ถ๋ฆฌ๋์ด ์์ฒญ-์๋ต ๋ณ๋ชฉ ์์ด ๋น ๋ฅธ ์ฌ์ฉ์ ์๋ต ๊ฐ๋ฅ
- ๋ฒํผ๋ง๊ณผ ๋ถํ ์์ถฉ
- ํ์ ๋ฉ์์ง๋ฅผ ์ผ์ ์ ์ฅํจ์ผ๋ก์จ, ํธ๋ํฝ ํญ์ฃผ๋ ์ฒ๋ฆฌ ์ง์ฐ ์ํฉ์์๋ ์์ ์ ์ธ ํ๋ฆ ์ ์ง ๊ฐ๋ฅ
- ์ฌ์ฒ๋ฆฌ ๋ฐ ์ ๋ขฐ์ฑ ๋ณด์ฅ
- ์ฒ๋ฆฌ ์คํจ ์ ๋ฉ์์ง๋ฅผ DLQ ๋ฑ์ผ๋ก ์ด๋ ํ ์ฌ์๋ ๊ฐ๋ฅ → ๋ฐ์ดํฐ ์ ์ค ์์ด ์์ ์ ์ธ ๋ฉ์์ง ์ฒ๋ฆฌ
- ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ก ์๋ต ์ง์ฐ ํด์
๐ฆ ์ ๋ฉ์์ง ๊ธฐ๋ฐ ๋น๋๊ธฐ ์ฒ๋ฆฌ๊ฐ ํ์ํ๊ฐ?
๋๊ธฐ ์ฒ๋ฆฌ์ ํ๊ณ
์๋ ์ฝ๋๋ ๋ฉ์์ง ํ๋ฅผ ๋์ ํ๊ธฐ ์ , ์ด๋ฒคํธ ์คํ ์ ์๋ฆผ์ ์ง์ ์ ์กํ๋ ๋ฐฉ์์ด๋ค. openEventsIfDueBefore() ๋ฉ์๋๋ DB์์ ์คํ ๋์ ์ด๋ฒคํธ๋ฅผ ์กฐํํ ๋ค, ํด๋น ์ด๋ฒคํธ์ ์ฐธ์ฌํ ์ฌ์ฉ์ ๋ชฉ๋ก์ ๊ฐ์ ธ์ notificationService.createNotification()์ ์ง์ ํธ์ถํด ์๋ฆผ์ ์ ์กํ๋ค. ์ด๋ ์๋ฆผ ์ ์ก์ ๋๊ธฐ์ ์ผ๋ก ์ฒ๋ฆฌ๋๋ฉฐ, ์ ์ ์๊ฐ ๋ง์์ง์๋ก for๋ฌธ ๋ด๋ถ ์ฒ๋ฆฌ ์๊ฐ์ด ๊ธธ์ด์ง๊ณ , ์ ์ฒด ํธ๋์ญ์ ์ด ์ง์ฐ๋ ๊ฐ๋ฅ์ฑ์ด ํฌ๋ค.
๋๊ธฐ ์ฒ๋ฆฌ์ ํ๊ณ๋ ๋ค์๊ณผ ๊ฐ์ด ์ ๋ฆฌํ ์ ์๋ค.
- ๋ชจ๋ ์ฒ๋ฆฌ๊ฐ ํ๋์ ํ๋ฆ์ ๋ฌถ์ฌ ์๋ค.
- ์ด๋ฒคํธ ์คํ๋ถํฐ ์ฌ์ฉ์ ์๋ฆผ ์ ์ก๊น์ง ํ๋์ ๋ฉ์๋/ํธ๋์ญ์ ์์์ ๋ชจ๋ ์ฒ๋ฆฌ
- ์ฌ์ฉ์ ์ ์ฆ๊ฐ ์ ์ ํ์ ์ผ๋ก ์ง์ฐ๋๋ค.
- for๋ฌธ์ผ๋ก ์ ์ ๋ฅผ ํ๋์ฉ ์ํํ๋ฉฐ ๋๊ธฐ์ ์ผ๋ก ์๋ฆผ ์ ์ก → ์ด ๋ชจ๋ ์์ ์ด ๋ฐํ๋ ๋๊น์ง ๋๊ธฐ
- ์๋ฆผ ์ ์ก ์ฒ๋ฆฌ๋์ด ๋์๋ก, ์ ์ฒด ์คํ ๋ก์ง ์ง์ฐ์ด ์ฌํด์ง
- ์ฅ์ ๋ณต์๋ ฅ์ด ์๋ค.
- ์คํจํ ๋ฉ์์ง๋ฅผ ๋ฐ๋ก ์ ์ฅํ๊ฑฐ๋, ์ฌ์ฒ๋ฆฌํ ์ ์๋ ๊ตฌ์กฐ๊ฐ ์์ → ์ ์ ๋ ์๋ฆผ์ ๋ฐ์ง ๋ชปํ๊ณ , ๊ฐ๋ฐ์๋ ์คํจํ ์๋ฆผ์ด ๋ญ์ง ์๊ธฐ ์ด๋ ค์
๋ฉ์์ง ํ ๋์ ์ ํ ๋น๊ต
MQ๋ฅผ ์ ์ฉํ์ง ์์ ๊ธฐ์กด ๊ตฌ์กฐ์ ํ๋ฆ์ ๋ค์๊ณผ ๊ฐ๋ค. ์๋ฆผ ์ ์ก๊น์ง ํ ํธ๋์ญ์ ์์ ์ฒ๋ฆฌ๋์ด ์๋ต ์ง์ฐ์ด ๋ฐ์ํ ํ๋ฅ ์ด ๋์๊ณ , ์คํจ ์ ์ ์ฒด ํ๋ฆ์ด ์ค๋จ๋ ์ ์์๋ค.
[Scheduler ์คํ (์ฃผ๊ธฐ์ )]
โ
โผ
[DB์์ READY ์ด๋ฒคํธ ์กฐํ]
โ
โผ
[์ด๋ฒคํธ ์ํ OPEN์ผ๋ก ๋ณ๊ฒฝ]
โ
โผ
[์ ์ ์กฐํ → ์๋ฆผ ์ง์ ์ ์ก (๋๊ธฐ)]
โ
โผ
[์๋ฃ]
MQ ๋์ ํ์ ์๋ฆผ ๋ก์ง์ด ๋ฉ์์ง ํ๋ฅผ ํตํด ๋น๋๊ธฐ๋ก ์ฒ๋ฆฌ๋๋ฉฐ, Scheduler๋ ๋ฉ์์ง๋ฅผ ๋ฐํ๋ง ํ๊ณ , ์๋ฆผ ์ ์ก์ Consumer๊ฐ ๋ณ๋ ฌ๋ก ์ฒ๋ฆฌํ๊ฒ ๋์๋ค. ๊ตฌ์กฐ๋ ๋ณต์กํด์ก์ง๋ง, ์์คํ ํ์ฅ์ฑ๊ณผ ์์ ์ฑ ์ธก๋ฉด์์ ๋ช ํํ ๊ฐ์ ์ด ์์๋ค.
[์ด๋ฒคํธ ๋ฑ๋ก ์]
โ
โผ
[Redis ZSET์ Event ๋ฉ์์ง ์ ์ฅ]
โ
โผ
[Scheduler ์คํ (์ฃผ๊ธฐ์ )]
โ
โผ
[Redis ZSET์์ ์คํ ๋์ ์กฐํ]
โ
โผ
[DB ์ํ OPEN์ผ๋ก ๋ณ๊ฒฝ]
โ
โผ
[RabbitMQ๋ก ์คํ ๋ฉ์์ง ๋ฐํ]
โ
โผ
[Consumer๊ฐ ์๋ฆผ ๋น๋๊ธฐ ์ ์ก]
โ
โผ
[์๋ฃ]
๐ RabbitMQ ๊ธฐ๋ฐ ์๋ฆผ ์ฒ๋ฆฌ ์ ๋ต
Exchange ํ์
๐ Exchange๋?
RabbitMQ์์ ๋ฉ์์ง๋ฅผ ์์ ํ๊ณ , ์ ์ ํ Queue๋ก ๋ผ์ฐํ ํ๋ ์ญํ ์ ํ๋ ๊ตฌ์ฑ ์์.
Producer๊ฐ ๋ณด๋ธ ๋ฉ์์ง๋ ๋จผ์ Exchange๋ก ๋์ฐฉํ๊ณ ,
Exchange๋ ๋ฉ์์ง์ RoutingKey๋ ์ค์ ๋ ๊ท์น์ ๊ธฐ๋ฐ์ผ๋ก ์ด๋ค Queue๋ก ๋ฉ์์ง๋ฅผ ๋ณด๋ผ์ง ๊ฒฐ์ ํ๋ค.
- Direct : ์ ํํ ์ผ์นํ๋ RoutingKey๋ก ๋ฉ์์ง๋ฅผ ์ ๋ฌ
- Fanout : RoutingKey ์์ด, ๋ฐ์ธ๋ฉ๋ ๋ชจ๋ Queue์ ๋ฉ์์ง๋ฅผ ์ ํ
- Topic : ํจํด ๊ธฐ๋ฐ RoutingKey ๋งค์นญ, ๋ผ์ฐํ ํจํด ๊ฐ์ ์์ผ๋์นด๋(*) ํน์ ํด์(#)๊ฐ ์ผ์นํด์ผ ๋งค์นญ
- Headers : ๋ฉ์์ง์ ํค๋ ๊ฐ์ ๊ธฐ๋ฐ์ผ๋ก ๋ผ์ฐํ
ํ๋ก์ ํธ์์๋ ์ด๋ฒคํธ ์คํ ์, ์๋ฆผ์ ์ค์ ํ ๋ชจ๋ ์ ์ ์๊ฒ ์๋ฆผ์ ๋ณด๋ด์ผ ํ๊ธฐ ๋๋ฌธ์ Fanout ์ผ๋ก ์ค์ ํ๋ค.
DLQ · DLX ๊ตฌ์กฐ
- DLQ(Dead Letter Queue) : ๋ฉ์์ง ์๋น์ ์คํจํ ๊ฒฝ์ฐ๋ฅผ ๋๋นํด ๋ฉ์์ง๋ฅผ ๋ณ๋๋ก ์ ์ฅํ๊ณ ์ถํ ์ฌ์ฒ๋ฆฌํ๊ฑฐ๋ ๋ก๊ทธ๋ก ํ์ธํ ์ ์๊ฒ ํด์ฃผ๋ ๊ตฌ์กฐ
- ์คํจํ ๋ฉ์์ง๋ DLX → DLQ๋ก ์ด๋, ์ดํ ์๋ ์ฌ์ฒ๋ฆฌ ๋๋ Retry Queue๋ก์ ์๋ ์ฌ์ฒ๋ฆฌ ๊ธฐ๋ฐ
TTL ๊ธฐ๋ฐ Retry ์ฒ๋ฆฌ
- DLQ์ ์์ธ ๋ฉ์์ง๋ฅผ ์๋์ผ๋ก ์ฌ์๋ํ๊ธฐ ์ํด TTL(Time To Live)๊ณผ Retry Queue๋ฅผ ํ์ฉ
- ์คํจํ ๋ฉ์์ง๋ DLQ์์ ๋ค์ Retry Queue๋ก ์ ์ก
- ํด๋น Queue์๋ TTL์ด ์ค์ ๋์ด ์์ด ์ผ์ ์๊ฐ ๋ค ์๋ Exchange๋ก ์ฌ์ ์ก