Skip to content

iohyeon/saga-microservices-lab

Repository files navigation

saga-laboratory

๋ถ„์‚ฐ ํŠธ๋žœ์žญ์…˜ ํ™˜๊ฒฝ์—์„œ SAGA ํŒจํ„ด(์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜/์ฝ”๋ ˆ์˜ค๊ทธ๋ž˜ํ”ผ)์„ ํ•™์Šตํ•˜๊ณ  ๊ฒ€์ฆํ•˜๊ธฐ ์œ„ํ•œ ์‹คํ—˜์šฉ ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค.
๊ธˆ์œต ๋„๋ฉ”์ธ(๊ณ„์ขŒ ์ด์ฒด, ์›์žฅ ๊ธฐ๋ก, ๋ฆฌ์Šคํฌ ์‹ฌ์‚ฌ, ์•Œ๋ฆผ)์„ ์˜ˆ์‹œ๋กœ ๊ตฌํ˜„ํ•˜๋ฉฐ, ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ๊ธฐ๋ฐ˜์„ ์šฐ์„ ์ ์œผ๋กœ ๋‹ค๋ฃน๋‹ˆ๋‹ค.


๐ŸŽฏ ํ”„๋กœ์ ํŠธ ๋ชฉํ‘œ

  • ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ํ™˜๊ฒฝ์—์„œ ๋ถ„์‚ฐ ํŠธ๋žœ์žญ์…˜ ์ •ํ•ฉ์„ฑ์„ ๋ณด์žฅํ•˜๋Š” ๊ตฌ์กฐ ํ•™์Šต
  • ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ๊ธฐ๋ฐ˜ Saga State Machine ๊ตฌํ˜„
  • ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ์•„ํ‚คํ…์ฒ˜(Kafka/RabbitMQ)์™€ Outbox ํŒจํ„ด ์ ์šฉ
  • ์‹คํŒจ/๋ณด์ƒ ์‹œ๋‚˜๋ฆฌ์˜ค ๋ฐ ํƒ€์ž„์•„์›ƒ/์žฌ์‹œ๋„ ์ •์ฑ… ๊ฒ€์ฆ
  • Redis, PostgreSQL ๊ธฐ๋ฐ˜ ๋ฉฑ๋“ฑ ์ฒ˜๋ฆฌ ๋ฐ ์ƒํƒœ ๊ด€๋ฆฌ

๐Ÿ“‚ ๋ชจ๋“ˆ ๊ตฌ์กฐ

saga-laboratory/ โ”œโ”€โ”€ common/ # DTO, ์ด๋ฒคํŠธ, ์—๋Ÿฌ, ๊ณตํ†ต ์œ ํ‹ธ (OutboxRecord, idempotency) โ”œโ”€โ”€ orchestrator/ # Saga Orchestrator (์ƒํƒœ ๋จธ์‹ , ํƒ€์ž„์•„์›ƒ/์žฌ์‹œ๋„, ๋ณด์ƒ ์ฒ˜๋ฆฌ) โ”œโ”€โ”€ account-service/ # ๊ณ„์ขŒ/์ž”์•ก ๊ด€๋ฆฌ (์ž”์•ก hold/commit, ์ฐจ๊ฐ/๊ฐ€์‚ฐ) โ”œโ”€โ”€ ledger-service/ # ์ด์ค‘๋ถ€๊ธฐ ์›์žฅ (Debit/Credit ๋ถ„๊ฐœ, reversal ์ง€์›) โ”œโ”€โ”€ risk-service/ # AML/์ด์ƒ๊ฑฐ๋ž˜ ์‹ฌ์‚ฌ (๋™๊ธฐ/๋น„๋™๊ธฐ) โ”œโ”€โ”€ notification-service/ # ์•Œ๋ฆผ ์„œ๋น„์Šค (์„ฑ๊ณต/์‹คํŒจ ๊ฒฐ๊ณผ ๋ฐœํ–‰) โ””โ”€โ”€ docker-compose.yml # Kafka/RabbitMQ, PostgreSQL, Redis ๋กœ์ปฌ ์‹คํ–‰


โš™๏ธ ๊ธฐ์ˆ  ์Šคํƒ

  • Language: Java 21
  • Framework: Spring Boot 3.x
  • Messaging: Kafka (๋˜๋Š” RabbitMQ)
  • Database: PostgreSQL (์„œ๋น„์Šค๋ณ„ DB), Redis (๋ฉฑ๋“ฑ์„ฑ, ๋ฝ)
  • Infra: Docker Compose (๊ฐœ๋ฐœ/ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ)
  • Testing: JUnit 5, Testcontainers

๐Ÿ”„ ๊ธฐ๋ณธ ์œ ์Šค์ผ€์ด์Šค: ์†ก๊ธˆ (Transfer)

  1. ์‚ฌ์šฉ์ž ์š”์ฒญ โ†’ Orchestrator POST /sagas/transfer
  2. ๋ฆฌ์Šคํฌ ์‹ฌ์‚ฌ โ†’ RiskApproved or RiskRejected
  3. ๊ณ„์ขŒ hold โ†’ ์ž”์•ก ์˜ˆ์•ฝ
  4. ์›์žฅ ๊ธฐ๋ก โ†’ ์ด์ค‘๋ถ€๊ธฐ ๋ถ„๊ฐœ (Debit/Credit)
  5. ๊ณ„์ขŒ commit โ†’ ์˜ˆ์•ฝ๋ถ„ ํ™•์ • ์ฐจ๊ฐ
  6. ์•Œ๋ฆผ ๋ฐœ์†ก โ†’ ์„ฑ๊ณต/์‹คํŒจ ๊ฒฐ๊ณผ ์ด๋ฒคํŠธ ๋ฐœํ–‰
  7. Orchestrator ์ƒํƒœ ์ „์ด โ†’ ์ตœ์ข… DONE ๋˜๋Š” FAILED

๐Ÿ›  ์‹คํ–‰ ๋ฐฉ๋ฒ•

1. ์ธํ”„๋ผ ์‹คํ–‰

docker-compose up -d
  • Kafka (๋˜๋Š” RabbitMQ)
  • PostgreSQL (๊ฐ ์„œ๋น„์Šค DB)
  • Redis

2. ์„œ๋น„์Šค ๋นŒ๋“œ ๋ฐ ์‹คํ–‰

./gradlew clean build
./gradlew :orchestrator:bootRun
./gradlew :account-service:bootRun
./gradlew :ledger-service:bootRun
./gradlew :risk-service:bootRun
./gradlew :notification-service:bootRun

๐Ÿ“Š ์ƒํƒœ ๋‹ค์ด์–ด๊ทธ๋žจ

stateDiagram-v2
    [*] --> NEW
    NEW --> RISK_CHECK
    RISK_CHECK --> HOLD_FUNDS: RiskApproved
    RISK_CHECK --> FAILED: RiskRejected
    HOLD_FUNDS --> BOOK_LEDGER: FundsHeld
    HOLD_FUNDS --> COMPENSATE: HoldFailed
    BOOK_LEDGER --> COMMIT_FUNDS: LedgerBooked
    BOOK_LEDGER --> COMPENSATE: BookingFailed
    COMMIT_FUNDS --> NOTIFY: FundsCommitted
    COMMIT_FUNDS --> COMPENSATE: CommitFailed
    NOTIFY --> DONE
    COMPENSATE --> NOTIFY
Loading

๐Ÿงฉ ์ฃผ์š” ํŒจํ„ด

  • Transactional Outbox: DB ํŠธ๋žœ์žญ์…˜ + Outbox ํ…Œ์ด๋ธ” โ†’ ๋ณ„๋„ ํผ๋ธ”๋ฆฌ์…”๊ฐ€ ์ด๋ฒคํŠธ ๋ฐœํ–‰
  • Idempotency: request_id ๊ธฐ๋ฐ˜ ์ค‘๋ณต ๋ฐฉ์ง€ ํ…Œ์ด๋ธ”
  • Retry/Timeout: Orchestrator ์ƒํƒœ๋ณ„ watchdog
  • Compensation: ์‹คํŒจ ์‹œ ๋ณด์ƒ ์›Œํฌํ”Œ๋กœ (reverse ledger, release hold)
  • Observability: request_id ๊ธฐ๋ฐ˜ ๋กœ๊ทธ ์ƒ๊ด€๊ด€๊ณ„ ์ถ”์ , ๋ฉ”ํŠธ๋ฆญ/ํŠธ๋ ˆ์ด์‹ฑ

๐Ÿš€ ํ–ฅํ›„ ๊ณ„ํš

  • ์ฝ”๋ ˆ์˜ค๊ทธ๋ž˜ํ”ผ ๊ธฐ๋ฐ˜ Saga ์‹คํ—˜
  • Debezium CDC Outbox ์ „ํ™˜
  • OpenTelemetry ๊ธฐ๋ฐ˜ ๋ถ„์‚ฐ ํŠธ๋ ˆ์ด์‹ฑ
  • ๋ฉฑ๋“ฑ ํ‚ค ๋งŒ๋ฃŒ ์ •์ฑ… ๋„์ž…
  • ์ƒค๋”ฉ/ํŒŒํ‹ฐ์…˜ ์ „๋žต ๊ฒ€์ฆ

๐Ÿ“œ ๋ผ์ด์„ ์Šค

About

๐Ÿงฉ Saga Pattern Laboratory โ€“ Orchestration & Choreography based on Spring Boot, Kafka, PostgreSQL, Redis

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages