728x90
๋ฐ์ํ
21์ฅ ๋ฉ์์ง ํ๋ฅผ ์ด์ฉํ ๋น๋๊ธฐ ํต์
21.1 ๋น๋๊ธฐ ๋ฉ์์ง์ด๋?
๋๊ธฐ ํต์
- ์ํํธ์จ์ด์ ์ปดํฌ๋ํธ๋ ๋๊ฐ ๋๊ธฐ์ ์ผ๋ก ํต์ ํ๋ค.
- ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ์ ์ ์ ์์ฒญ์ ๋ณด๋ด๊ณ , ์๋ฒ์ ์๋ต์ ๊ธฐ๋ค๋ฆฐ ๋ค์ ์ ์์ ์ข ๋ฃํ๋ ์ ์ฒด ๊ณผ์ ์ด ๋๊ธฐ์ ์ผ๋ก ์ด๋ค์ง๋ค.
- ๋๊ธฐ์ ํต์ ์ ํ ๋ ์๋ฒ๊ฐ ๋ค์ด๋๊ฑฐ๋, ์๋ต ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฌ๋ ๊ฒฝ์ฐ, ๋คํธ์ํฌ ์์ค์์ ์คํจํ ๊ฒฝ์ฐ ๋ฑ์ด ๋ฌธ์ ๊ฐ ๋๋ค.
๋น๋๊ธฐ ํต์
- ๋น๋๊ธฐ ํต์ ์ ์ ์ฉํ๋ ค๋ฉด ํด๋ผ์ด์ธํธ์ ์๋ฒ ์ฌ์ด์ ๊ณ์ธต์ด ํ๋ ์ถ๊ฐ๋๋ค.
- ํด๋ผ์ด์ธํธ๊ฐ ํ์ ์์ฒญ์ ๋ณด๋ด๊ณ , ์๋ฒ๋ ํ๋ฅผ ์ฃผ์ํ๋ค๊ฐ ๋ฉ์์ง๋ฅผ ์์ ํ๊ณ ์ฒ๋ฆฌํ๋ค.
- ๊ทธ๋ ๋ค๋ฉด ๋น๋๊ธฐ ํต์ ์ด ๋ฌด์กฐ๊ฑด ์ข์๊ฐ? ์ ๋ํ ๋ต์ ์๋๋ค.
- ํ๋ฅผ ์ ๊ณตํ๋ ๊ธฐ์ ์ ์ ๋ขฐ์ฑ์ด ๋ฐ์ด๋์ผ ํ๋ฉฐ, ํ ๊ธฐ์ ์ ์ฌ์ฉ๋์ด ๋น์ธ๋ค๋ ํฐ ๋จ์ ์ด ์๋ค.
- ๋์ปค๋ฅผ ์ฌ์ฉํ๋ฉด ์ํฐํ๋ผ์ด์ฆ๊ธ ์์ ์ฑ์ ๊ฐ์ถ ์คํ ์์ค ํ ์์คํ ์ ๋์ ํด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค.
- ๋ํ, ๊ฒฝ๋ ์ปจํ ์ด๋์์ ๋ฉ์์ง ํ๋ฅผ ์คํํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ๋ง๋ค ๋ณ๋์ ์ ์ฉ ํ๋ฅผ ์ฌ์ฉํ ์ ์๊ณ , ๋ชจ๋ ํ๊ฒฝ์์ ๋์ผํ๊ฒ ๋์ ํ ์ ์๋ค.
- ๋ฉ์์ง ํ๋ฅผ ์ด์ฉํ ๋น๋๊ธฐ ํต์ ์ ๊ฒฝ์ฐ ์ ๋ฌ์์ ์์ ์์ ๊ฒฐํฉ์ ๋์จํ๊ฒ ํ๋ ๋ฐฉ๋ฒ์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ๊ณผ ํ์ฅ์ฑ์ ๊ฐ์ ํ ์ ์๋ค.
Redis Message Queue
- Redis ๋ฅผ ํ์ฉํ์ฌ ๋น๋๊ธฐ ๋ฉ์์ง ํ๋ฅผ ๊ตฌํํ ์ ์๋ค.
- ๋ฉ์์ง ํ์๋ ํฌ๊ฒ Publisher ์ Subscriber ๊ฐ ์กด์ฌํ๋ค.
- ๋ฐํ์(Publisher) ๋ ๋ฉ์์ง๋ฅผ ๋ณด๋ด๋ ์ฃผ์ฒด์ด๋ฉฐ, ๊ตฌ๋ ์(Subscriber) ๋ ๋ฉ์์ง๋ฅด ๋ฐ๋ ์ฃผ์ฒด์ด๋ค.
$ docker network create ch21
$ docker container run -d --name redis --network ch21 diamol/redis
$ docker logs redis --tail 1
# Publisher ์ปจํ
์ด๋
$ docker run -d --name publisher --network ch21 diamol/redis-cli -r 50 -i 5 PUBLISH channel21 ping
$ docker logs publisher
# Subscriber ์ปจํ
์ด๋
$ docker run -it --name subscriber --network ch21 diamol/redis-cli SUBSCRIBE channel21
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "channel21"
3) (integer) 1
1) "message"
2) "channel21"
3) "ping"
1) "message"
2) "channel21"
3) "ping"
21.2 ํด๋ผ์ฐ๋ ๋ค์ดํฐ๋ธ ๋ฉ์์ง ํ ์ฌ์ฉํ๊ธฐ
NATS
- NATS ๋ CNCF ์ฌ๋จ์์ ๊ด๋ฆฌํ๋ ํ๋ก์ ํธ๋ก, ๋์ ์์ฑ๋์ ์ ๋ขฐ๋๋ฅผ ๋ฐํ์ผ๋ก ๋ง์ด ์ฌ์ฉ๋๊ณ ์๋ค.
- NATS ๋ ๋ฉ์์ง๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ๋ฉฐ, ์๋๊ฐ ๋งค์ฐ ๋น ๋ฅด๊ณ ์ปจํ ์ด๋ ๊ฐ์ ํต์ ์ ์ ํฉํ๋ค.
- NATS ์๋ ์ฑ๋ ๊ฐ๋ ์ด ์กด์ฌํ์ง ์๊ณ , ๋ชจ๋ ๋ฉ์์ง์ Subject ๋ฅผ ๋ถ์ฌํ๋ค.
- subject ๋ฅผ ํตํด์ ๋ฉ์์ง ์ ํ์ ๊ตฌ๋ถํ๋ฉฐ, ์ํ๋ ๋ช ๋ช ๊ท์น์ ์ ์ฉํ ์ ์๋ค.
- ์ด๋ฅผ ํตํด Subscriber ๋ ํด๋น Subject ๋ฅผ ๊ตฌ๋ ํ๋ฉด ๋๋ค.
$ vi message-queue
version: "3.7"
services:
todo-web:
image: diamol/ch21-todo-list
ports:
- 8080:80
networks:
- app-net
todo-db:
image: diamol/postgres:11.5
networks:
- app-net
message-queue:
image: diamol/nats
ports:
- "8222:8222"
networks:
- app-net
save-handler:
image: diamol/ch21-save-handler
networks:
- app-net
networks:
app-net:
$ docker compose up -d message-queue
$ docker logs todo-list-message-queue_1
[1] 2025/01/16 04:46:10.381523 [INF] Starting nats-server version 2.1.9
[1] 2025/01/16 04:46:10.381536 [INF] Git commit [7c76626]
[1] 2025/01/16 04:46:10.381640 [INF] Starting http monitor on 0.0.0.0:8222
[1] 2025/01/16 04:46:10.381661 [INF] Listening for client connections on 0.0.0.0:4222
[1] 2025/01/16 04:46:10.381666 [INF] Server id is NBPKEDLHJMXTO3NDKAXR6OERYRJXK2N5XIS5Z7YFBQ3G3JOH544I5SKG
[1] 2025/01/16 04:46:10.381667 [INF] Server is ready
[1] 2025/01/16 04:46:10.381753 [INF] Listening for route connections on 0.0.0.0:6222
$ curl <http://localhost:8222/connz>
๋ง์ฝ, ๋ฉ์์ง ํ์ ์ ๋ฌํ์ง๋ง ํ๋ฅผ ๊ตฌ๋ ํ๋ ๊ตฌ๋ ์๊ฐ ์์ ๊ฒฝ์ฐ
- ๋ณดํต์ ๋ฉ์์ง ํ๋ ๊ตฌ๋ ์๊ฐ ์์ ๊ฒฝ์ฐ DLQ(Dead Letter Queue) ์ ๋ฉ์์ง๋ฅผ ์ ์ฅํ๋ค.
- ๊ทธ๋ฌ๋, Redis ์ NATS ์ ๊ฒฝ์ฐ ๊ตฌ๋์๊ฐ ์์ผ๋ฉด ํด๋น ๋ฉ์์ง๋ฅผ ๊ทธ๋๋ก ๋ฒ๋ฆฐ๋ค.
- ์ฆ, Redis ์ NATS ๋ ๊ตฌ๋ ํ ์์ ์ดํ๋ถํฐ ๋ฐํ๋ ๋ฉ์์ง๋ง ์์ ํ ์ ์๋ค.
21.3 ๋ฉ์์ง ์์ ๋ฐ ์ฒ๋ฆฌ
- Message Queue ๋ฅผ ๊ตฌ๋ ํ๋ ์ปดํฌ๋ํธ๋ฅผ ๋ฉ์์ง ํธ๋ค๋ฌ๋ผ๊ณ ํ๋ค.
- ๋๊ฒ ๋ฉ์์ง์ ์ข ๋ฅ๋ง๋ค ์ด๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฉ์์ง ํธ๋ค๋ฌ๊ฐ ํ๋์ฉ ํ์ํ๋ค.
- ์์์์ ์ฌ์ฉ๋๋ to-do ์ ํ๋ฆฌ์ผ์ด์ ์๋ ํ ์ผ ์ด๋ฒคํธ ๋ฉ์์ง๋ฅผ ๋ฐ์, DB ์ ์ถ๊ฐํ๋ ์ญํ ์ ํ๋ ๋ฉ์์ง ํธ๋ค๋ฌ๊ฐ ํ์ํ๋ค.
- ์ด๋ ๋ฏ ๋ฉ์์ง ํธ๋ค๋ฌ(Worker) ๋ฅผ ๋ฐ๋ก ๋๊ฒ ๋๋ฉด ์ค์ผ์ผ ์์์ ์ฉ์ดํ๋ค.
- ๋ฉ์์ง ํ๊ฐ ๊ธ์ฆํ๋ ๋ถํ์ ๋ฒํผ์ ๊ฐ์ ์ญํ ์ ํ๋ค.
- ์ฌ์ฉ์๊ฐ ์๋ฌด๋ฆฌ ๋ง์๋ ๋์์ ๋ฉ์์ง ํธ๋ค๋ฌ๋ฅผ ํตํด ๋ฉ์์ง๊ฐ ํ๋์ฉ ์๋น๋๋ฏ๋ก ๋ค์ด์ค๋ SQL ์ปค๋ฅ์ ์ ๋ฉ์์ง ํธ๋ค๋ฌ ๊ฐ์๋ก ์ ํ๋๋ค.
๊ฒฐ๊ณผ์ ์ผ๊ด์ฑ
- ๋น๋๊ธฐ ๋ฉ์์ง์ ๊ฒฝ์ฐ ์์ ์ด ์๋ฃ๋๋๋ฐ ์ฝ๊ฐ์ ์๊ฐ์ด ๋ฐ์ํ๋ค.
- ์ด๋ฌํ ๋ถ์ ํจ๊ณผ๋ฅผ ๊ฒฐ๊ณผ์ ์ผ๊ด์ฑ์ด๋ผ๊ณ ํ๋ค.
- ๋ชจ๋ ๋ฉ์์ง์ ์ฒ๋ฆฌ๊ฐ ๋๋๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ๋ฐ์ดํฐ์ ์ํ๊ฐ ์ ํํด์ง๋๋ฐ, ๊ทธ ์ด์ ์์ ์๋ ์ผ๊ด์ฑ์ด ๊นจ์ง ์ ์๋ค.
- ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ฉ์์ง๊ฐ ๋ชจ๋ ์ฒ๋ฆฌ๊ฐ ์๋ฃ๋์๋ค๋ ์ด๋ฒคํธ๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ๊ฐฑ์ ํจ์ผ๋ก์จ ํด๊ฒฐํ ์ ์๋ค.
21.4 ๋ฉ์์ง ํธ๋ค๋ฌ๋ก ๊ธฐ๋ฅ ์ถ๊ฐํ๊ธฐ
์ด๋ฒคํธ ์งํฅ ์ํคํ์ฒ
- ์ด๋ฒคํธ ์งํฅ ์ํคํ ์ฒ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ชจ๋ ์ผ์ ์ฆ๊ฐ ๋๊ธฐ์ ์ผ๋ก ์ฒ๋ฆฌํ๋ ๋์ ์ด๋ฒคํธ๋ฅผ ํตํด ๋ค๋ฅธ ๊ตฌ์ฑ ์์์ ์์ ์ ํ์ฌ ์ํ๋ฅผ ์๋ฆฌ๋ ๋ฐฉ์์ด๋ค.
- ์ด๋ฒคํธ๋ฅผ ๋ฐํํ๋ ๋ก์ง์ ๋ณ๊ฒฝํ์ง ์๊ณ ๋ ์ด๋ฒคํธ ์ฒ๋ฆฌ ๋ก์ง์ ๋ฐ๊ฟ ์ ์์ผ๋ฏ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ฑ ์์ ๊ฐ ๊ฒฐํฉ๋๋ฅผ ๋์จํ๊ฒ ํ๋ ํจ๊ณผ๊ฐ ์๋ค.
๋ฉ์์ง ํธ๋ค๋ฌ๋ฅผ ์ด์ฉํ์ฌ ์ ๊ธฐ๋ฅ ์ถ๊ฐํ๊ธฐ
- ๋ฉ์์ง ํธ๋ค๋ฌ๋ฅผ ์ด์ฉํ์ฌ ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ ๊ฐ์ฅ ์ฌ์ด ๋ฐฉ๋ฒ์ ์๋ก์ด ๋ฉ์์ง ํธ๋ค๋ฌ์ ๊ทธ๋ฃน์ ๋ง๋ค๊ณ , ๋ชจ๋ ๋ฉ์์ง๋ฅผ ์์ ํ๋๋ก ํ๋ ์ด๋ฒคํธ ์ฒ๋ฆฌ๋ฅผ ๋ค๋ฅด๊ฒ ํ๋ ๊ฒ์ด๋ค.
- ์ด๋ ๊ฒํ๋ฉด ๊ธฐ์กด ์ปจํ ์ด๋์๋ ์์ ์ด ์ผ์ด๋์ง ์๊ณ , ์ ๊ท ๊ธฐ๋ฅ์ ๋ํ ์ปจํ ์ด๋๋ง ์คํ์ํค๋ฉด ๋๊ธฐ ๋๋ฌธ์ ๋ฐฐํฌ์ ๋ถ๋ด์ด ํฌ๊ฒ ๋ฎ์์ง๋ค.
21.5 ๋น๋๊ธฐ ๋ฉ์์ง ํจํด ์ดํดํ๊ธฐ
Pub-Sub (Publish-Subscribe) ํจํด
- ๋ฐํ์(Publisher) ๊ฐ ๋ฉ์์ง๋ฅผ ํน์ ์ฃผ์ (Topic) ์ด๋ ์ฑ๋ (Channel) ์ ๊ฒ์ํ๋ฉด, ํด๋น ์ฃผ์ ๋ฅผ ๊ตฌ๋ (Subscribe) ํ ๋ชจ๋ ๊ตฌ๋ ์(Subscriber) ๊ฐ ๋ฉ์์ง๋ฅผ ๋ฐ๋ ๋ฐฉ์์ด๋ค.
- ์ด ํจํด์์๋ ํผ๋ธ๋ฆฌ์ ๊ฐ ๋ฉ์์ง๋ฅผ ์ฌ์ฉํ ๊ฒ์ด ๋๊ตฌ๊ณ , ์ด๋ป๊ฒ ์ฒ๋ฆฌํ๋ฉฐ, ์ธ์ ์ฒ๋ฆฌ๊ฐ ๋๋๋์ง ์ ์ ์๋ค.
- ํ ๋ช ์ ๋ฐํ์๊ฐ ์ฌ๋ฌ ๊ตฌ๋ ์์๊ฒ ๋ฉ์์ง๋ฅผ ์ ๋ฌํด์ผ ํ๋ ๋ค๋๋ค ํต์ ์ ์ฌ์ฉํ๋ค.
- ์ํฉ์ ๋ฐ๋ผ Pub/Sub ํจํด์ด ์ ํฉํ์ง ์์ ์ ์๋ค.
Rquest-Response ํจํด
- ํด๋ผ์ด์ธํธ๊ฐ ๋ฉ์์ง ํ์ ๋ฉ์์ง๋ฅผ ์ ๋ฌํ๊ณ ์๋ต์ ๊ธฐ๋ค๋ฆฐ๋ค.
- ๋ฉ์์ง ํธ๋ค๋ฌ๋ ์์ฒญ ๋ฉ์์ง๋ฅผ ์ฒ๋ฆฌํ ๋ค์ ๋ฉ์์ง ํ์ ์๋ตํ๋ค.
- ๋ฉ์์ง ํ๋ ๋ค์ ์๋ต์ ํด๋ผ์ด์ธํธ์๊ฒ ์ ๋ฌํ๋ค.
- ํ๋์ ์์ฒญ์ ๋ํด ํ๋์ ์๋ต์ด ๋งคํ๋๋ ์ผ๋์ผ ํต์ ์ด๋ค.
- ํธ๋ค๋ฌ์ ํด๋ผ์ด์ธํธ๊ฐ ๊ธฐ๋ค๋ฆฌ๋ ๋์ ๋ค๋ฅธ ์์ ์ ํ ์ ์๋ค๋ ๋น๋๊ธฐ ๋ฉ์์ง์ ์ฅ์ ์ ๊ทธ๋๋ก ์ ์งํ๋ฉด์๋ ์ผ๋ฐ์ ์ธ ๋๊ธฐ ์๋น์ค ํธ์ถ์ ๋์ฒดํ ์ ์๋ค.
728x90
๋ฐ์ํ