MSA - KimGyuBek/Threadly GitHub Wiki

MSA ๊ตฌ์„ฑ

๋ชฉ์ฐจ

  1. ์ „์ฒด ์‹œ์Šคํ…œ ๊ตฌ์„ฑ๋„
  2. ์„œ๋น„์Šค ๊ตฌ์„ฑ
  3. ์„œ๋น„์Šค๊ฐ„ ํ†ต์‹ 
  4. ๋ฐฐํฌ ์ „๋žต
  5. ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ ๋ถ„๋ฆฌ
  6. ์„œ๋น„์Šค ๋ผ์šฐํŒ…
  7. ๋„์ž… ํšจ๊ณผ

์ „์ฒด ์‹œ์Šคํ…œ ๊ตฌ์„ฑ๋„

msa_architecture


์„œ๋น„์Šค ๊ตฌ์„ฑ

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์—์„œ ์ด๋ฒคํŠธ ์ˆ˜์‹  ๋ฐ ํ•ด๋‹น ๊ธฐ๋Šฅ ์ˆ˜ํ–‰

๋ฐฐํฌ ์ „๋žต

๊ฐ ์„œ๋น„์Šค๋ณ„ ๋ฌด์ค‘๋‹จ ๋ฐฐํฌ

  1. threadly-service:

    • Blue: app-blue (8080 ํฌํŠธ)
    • Green: app-green (8081 ํฌํŠธ)
  2. 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 ๋„์ž… ํšจ๊ณผ

๊ธฐ์ˆ ์  ์ด์ 

  1. ๋…๋ฆฝ ๊ฐœ๋ฐœ
    • ๊ฐ ์„œ๋น„์Šค(threadly-service, notification-service)๋ฅผ ๋ณ‘๋ ฌ๋กœ ๊ฐœ๋ฐœ ๊ฐ€๋Šฅ
  2. ๊ธฐ์ˆ  ์Šคํƒ ์ž์œ ๋„
    • ์„œ๋น„์Šค๋ณ„๋กœ ์ตœ์ ํ™”๋œ ๊ธฐ์ˆ  ์‚ฌ์šฉ
  3. ์žฅ์•  ๊ฒฉ๋ฆฌ
    • ํ•œ ์„œ๋น„์Šค ์žฅ์• ๊ฐ€ ๋‹ค๋ฅธ ์„œ๋น„์Šค์— ์ „ํŒŒ๋˜์ง€ ์•Š์Œ
  4. ํ™•์žฅ์„ฑ
    • ์„œ๋น„์Šค ๋‹จ์œ„๋กœ ์ˆ˜ํ‰ ํ™•์žฅ ๊ฐ€๋Šฅ
    • ํŠนํžˆ notification-service๋Š” Kafka Consumer ๊ทธ๋ฃน ๊ธฐ๋ฐ˜์œผ๋กœ ์„ค๊ณ„๋˜์–ด ์žˆ์–ด ์ธ์Šคํ„ด์Šค๋ฅผ ๋Š˜๋ฆฌ๋ฉด ์ž๋™์œผ๋กœ ํŒŒํ‹ฐ์…˜์„ ๋ถ„๋ฐฐ๋ฐ›์•„ ๋ถ€ํ•˜ ๋ถ„์‚ฐ ๊ฐ€๋Šฅ
  5. ๋ฐฐํฌ ์œ ์—ฐ์„ฑ
    • ์„œ๋น„์Šค๋ณ„๋กœ ๋…๋ฆฝ ๋ฐฐํฌ๊ฐ€ ๊ฐ€๋Šฅํ•ด ์ „์ฒด๋ฅผ ์žฌ๋ฐฐํฌํ•˜์ง€ ์•Š๊ณ  ํŠน์ • ์„œ๋น„์Šค๋งŒ ์—…๋ฐ์ดํŠธ ๊ฐ€๋Šฅ
  6. ๋ชจ๋‹ˆํ„ฐ๋ง ๊ฐ•ํ™”
    • ์„œ๋น„์Šค ๋‹จ์œ„๋ณ„ ๋กœ๊ทธ/๋ฉ”ํŠธ๋ฆญ ์ˆ˜์ง‘์ด ๊ฐ€๋Šฅํ•ด ์ถ”์ ์ด ์šฉ์ด

๊ด€๋ จ ๋ฌธ์„œ