MSA - KimGyuBek/Threadly GitHub Wiki
MSA ๊ตฌ์ฑ
๋ชฉ์ฐจ
- ์ ์ฒด ์์คํ ๊ตฌ์ฑ๋
- ์๋น์ค ๊ตฌ์ฑ
- ์๋น์ค๊ฐ ํต์
- ๋ฐฐํฌ ์ ๋ต
- ๋ฐ์ดํฐ ์ ์ฅ์ ๋ถ๋ฆฌ
- ์๋น์ค ๋ผ์ฐํ
- ๋์ ํจ๊ณผ
์ ์ฒด ์์คํ ๊ตฌ์ฑ๋

์๋น์ค ๊ตฌ์ฑ
1. threadly-service(๋ฉ์ธ ์๋น์ค)
์ฃผ์ ์ญํ
- Threadly ์ ์ฒด์ ํต์ฌ ๋น์ฆ๋์ค ๋ก์ง์ ๋ด๋นํ๋ ๋ฉ์ธ ์๋น์ค
- SNS์ ์ฃผ์ ๊ธฐ๋ฅ ์ ๊ณต
๊ธฐ๋ฅ
- ์ฌ์ฉ์ ๊ด๋ จ: ํ์๊ฐ์ , ๋ก๊ทธ์ธ, ํ๋กํ ๋ฑ ๊ด๋ฆฌ
- ๊ฒ์๋ฌผ ๊ด๋ จ: ๊ฒ์๊ธ, ๊ฒ์๊ธ ํ๋(์ข์์, ๋๊ธ, ๋๊ธ ์ข์์), ์กฐํ์ ๋ฑ ๊ด๋ฆฌ
- ํ๋ก์ฐ ๊ด๋ จ: ํ๋ก์ฐ/์ธํ๋ก์ฐ ๊ด๋ฆฌ
- ๋ณด์ ๊ด๋ จ: JWT ์ธ์ฆ, ์ธ๊ฐ, ๋ธ๋๋ฆฌ์คํธ, 2FA ์ธ์ฆ ๋ฑ ๊ด๋ฆฌ
2. notification-service(์๋ฆผ ์๋น์ค)
์ฃผ์ ์ญํ
- ์๋ฆผ ๋ฐ ๋ฉ์ผ ๋ฐ์ก ๊ธฐ๋ฅ ์ ๋ด
- ์ด๋ฒคํธ ๊ธฐ๋ฐ ์๋ฆผ ์ฒ๋ฆฌ
๊ธฐ๋ฅ
- ์๋ฆผ ์์ ํ ์๋ฆผ ๋ฐ์ดํฐ ์ ์ฅ
WebSocket์ ์ด์ฉํ ์ค์๊ฐ ์๋ฆผSMTP๋ฅผ ์ด์ฉํ ๋ฉ์ผ ๋ฐ์- ์๋ฆผ ์กฐํ, ์์ , ์ฝ์ ์ฒ๋ฆฌ ๋ฑ ์ํ ๊ด๋ฆฌ ๋ฐ API ์ ๊ณต
์๋น์ค ๊ฐ ํต์
Kafka ๊ธฐ๋ฐ ํต์
threadly-service ์ด๋ฒคํธ ๋ฐ์
โ
Kafka Topic ๋ฐํ
โ
notification-service ์์
โ
์๋ฆผ ์ฒ๋ฆฌ ๋ฐ ์ ์ก
์ด๋ฒคํธ ํ๋ฆ
- threadly-service์์ ๋น์ฆ๋์ค ์ด๋ฒคํธ ๋ฐ์ (์ข์์, ๋๊ธ, ํ๋ก์ฐ ๋ฑ)
- Kafka๋ฅผ ํตํด ์ด๋ฒคํธ ๋ฉ์์ง ๋ฐํ
- notification-service์์ ์ด๋ฒคํธ ์์ ๋ฐ ํด๋น ๊ธฐ๋ฅ ์ํ
๋ฐฐํฌ ์ ๋ต
๊ฐ ์๋น์ค๋ณ ๋ฌด์ค๋จ ๋ฐฐํฌ
-
threadly-service:
- Blue: app-blue (8080 ํฌํธ)
- Green: app-green (8081 ํฌํธ)
-
notification-service:
- Blue: notification-blue (8082 ํฌํธ)
- Green: notification-green (8083 ํฌํธ)
์์ธ ๋ฌธ์: ๋ฌด์ค๋จ ๋ฐฐํฌ
๋ฐ์ดํฐ ์ ์ฅ์ ๋ถ๋ฆฌ
์๋น์ค๋ณ ์ ์ฉ ๋ฐ์ดํฐ๋ฒ ์ด์ค
- threadly-service: PostgreSQL (๊ด๊ณํ ๋ฐ์ดํฐ ์ ์ฅ)
- notification-service: MongoDB (์๋ฆผ/์ด๋ฒคํธ ๋ก๊ทธ์ฉ ๋ฌธ์ ๊ธฐ๋ฐ ์ ์ฅ)
- ๊ณตํต ์บ์: Redis (JWT ์ธ์ฆ ํ ํฐ ๊ด๋ฆฌ)
๋ฐ์ดํฐ ์ผ๊ด์ฑ ์์น
- ๊ฐ ์๋น์ค๋ ์์ฒด ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ง ์ง์ ์ ๊ทผ
- ์๋น์ค ๊ฐ ๋ฐ์ดํฐ ๊ณต์ ๋ API ๋๋ Kafka event ๋ฐํ์ผ๋ก๋ง ์ํ
- ๋ถ์ฐ ํธ๋์ญ์ ๋์ ์ด๋ฒคํธ ๊ธฐ๋ฐ์ผ๋ก ์ต์ข ์ ์ผ๊ด์ฑ ๋ณด์ฅ
์์ธ ๋ฌธ์: ๋ฐ์ดํฐ ๋ฒ ์ด์ค ๋ถ๋ฆฌ ์ ๋ต
์๋น์ค ๋ผ์ฐํ
Nginx๋ฅผ ๊ฒ์ดํธ์จ์ด๋ก ๋์ด ์ธ๋ถ ์์ฒญ์ ์๋น์ค๋ณ๋ก ๋ถ์ฐ ์ฒ๋ฆฌํ๋๋ก ๊ตฌ์ฑ.
๋ผ์ฐํ ๊ท์น
- notification-service
https://api.threadly.kr/api/notifications/**- WebSocket ์ ๊ทธ๋ ์ด๋ ์์ฒญ
- threadly-service
- ์์ ๊ฒฝ์ฐ๋ฅผ ์ ์ธํ๊ณ ๋ชจ๋ ์์ฒญ
์ด์ ๋ฐ ๋ชจ๋ํฐ๋ง
์๋น์ค๋ณ ๋ ๋ฆฝ ์ด์
- ๊ฐ ์๋น์ค๋ ๋ ๋ฆฝ์ ์ธ ๋ก๊ทธ ๋๋ ํ ๋ฆฌ ๊ด๋ฆฌ
- ์๋น์ค๋ณ Health Check ์๋ํฌ์ธํธ ์ ๊ณต
์ค์ํ๋ ๋ชจ๋ํฐ๋ง
- Prometheus: ๋ฉํธ๋ฆญ ์์ง
- Grafana: ํตํฉ ๋์๋ณด๋
- Loki: ์ค์ํ๋ ๋ก๊ทธ ์์ง
์์ธ ๋ฌธ์: ์ด์ ํ๊ฒฝ ๋ชจ๋ํฐ๋ง
MSA ๋์ ํจ๊ณผ
๊ธฐ์ ์ ์ด์
- ๋
๋ฆฝ ๊ฐ๋ฐ
- ๊ฐ ์๋น์ค(threadly-service, notification-service)๋ฅผ ๋ณ๋ ฌ๋ก ๊ฐ๋ฐ ๊ฐ๋ฅ
- ๊ธฐ์ ์คํ ์์ ๋
- ์๋น์ค๋ณ๋ก ์ต์ ํ๋ ๊ธฐ์ ์ฌ์ฉ
- ์ฅ์ ๊ฒฉ๋ฆฌ
- ํ ์๋น์ค ์ฅ์ ๊ฐ ๋ค๋ฅธ ์๋น์ค์ ์ ํ๋์ง ์์
- ํ์ฅ์ฑ
- ์๋น์ค ๋จ์๋ก ์ํ ํ์ฅ ๊ฐ๋ฅ
- ํนํ notification-service๋ Kafka Consumer ๊ทธ๋ฃน ๊ธฐ๋ฐ์ผ๋ก ์ค๊ณ๋์ด ์์ด ์ธ์คํด์ค๋ฅผ ๋๋ฆฌ๋ฉด ์๋์ผ๋ก ํํฐ์ ์ ๋ถ๋ฐฐ๋ฐ์ ๋ถํ ๋ถ์ฐ ๊ฐ๋ฅ
- ๋ฐฐํฌ ์ ์ฐ์ฑ
- ์๋น์ค๋ณ๋ก ๋ ๋ฆฝ ๋ฐฐํฌ๊ฐ ๊ฐ๋ฅํด ์ ์ฒด๋ฅผ ์ฌ๋ฐฐํฌํ์ง ์๊ณ ํน์ ์๋น์ค๋ง ์ ๋ฐ์ดํธ ๊ฐ๋ฅ
- ๋ชจ๋ํฐ๋ง ๊ฐํ
- ์๋น์ค ๋จ์๋ณ ๋ก๊ทธ/๋ฉํธ๋ฆญ ์์ง์ด ๊ฐ๋ฅํด ์ถ์ ์ด ์ฉ์ด