๋ถ์ฐ ํธ๋์ญ์
ํ๊ฒฝ์์ 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
- ์ฌ์ฉ์ ์์ฒญ โ Orchestrator
POST /sagas/transfer - ๋ฆฌ์คํฌ ์ฌ์ฌ โ
RiskApprovedorRiskRejected - ๊ณ์ข hold โ ์์ก ์์ฝ
- ์์ฅ ๊ธฐ๋ก โ ์ด์ค๋ถ๊ธฐ ๋ถ๊ฐ (Debit/Credit)
- ๊ณ์ข commit โ ์์ฝ๋ถ ํ์ ์ฐจ๊ฐ
- ์๋ฆผ ๋ฐ์ก โ ์ฑ๊ณต/์คํจ ๊ฒฐ๊ณผ ์ด๋ฒคํธ ๋ฐํ
- Orchestrator ์ํ ์ ์ด โ ์ต์ข
DONE๋๋FAILED
docker-compose up -d- Kafka (๋๋ RabbitMQ)
- PostgreSQL (๊ฐ ์๋น์ค DB)
- Redis
./gradlew clean build
./gradlew :orchestrator:bootRun
./gradlew :account-service:bootRun
./gradlew :ledger-service:bootRun
./gradlew :risk-service:bootRun
./gradlew :notification-service:bootRunstateDiagram-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
- Transactional Outbox: DB ํธ๋์ญ์ + Outbox ํ ์ด๋ธ โ ๋ณ๋ ํผ๋ธ๋ฆฌ์ ๊ฐ ์ด๋ฒคํธ ๋ฐํ
- Idempotency:
request_id๊ธฐ๋ฐ ์ค๋ณต ๋ฐฉ์ง ํ ์ด๋ธ - Retry/Timeout: Orchestrator ์ํ๋ณ watchdog
- Compensation: ์คํจ ์ ๋ณด์ ์ํฌํ๋ก (reverse ledger, release hold)
- Observability:
request_id๊ธฐ๋ฐ ๋ก๊ทธ ์๊ด๊ด๊ณ ์ถ์ , ๋ฉํธ๋ฆญ/ํธ๋ ์ด์ฑ
- ์ฝ๋ ์ค๊ทธ๋ํผ ๊ธฐ๋ฐ Saga ์คํ
- Debezium CDC Outbox ์ ํ
- OpenTelemetry ๊ธฐ๋ฐ ๋ถ์ฐ ํธ๋ ์ด์ฑ
- ๋ฉฑ๋ฑ ํค ๋ง๋ฃ ์ ์ฑ ๋์
- ์ค๋ฉ/ํํฐ์ ์ ๋ต ๊ฒ์ฆ