반응형
Saga Pattern
실패한 비즈니스 작업을 되돌리는 패턴
- 여러 서버
- 여러 DB
- 긴 비즈니스 흐름
- 분산 트랜잭션
Outbox Pattern
이벤트를 절대 잃어버리지 않게 하는 패턴
- 이벤트 기반 시스템
- Kafka/RabbitMQ 사용
- 이벤트 유실 방지 필요
- 로그/분석/업적/랭킹
상황: 게임 가챠 시스템
유저가 10연속 가챠했을떄
요구사항
- 유저 재화 차감
- 가챠 결과 저장
- 업적 반영
- 통계 서버 전송
- 로그 저장
- 푸시 알림
[게임 서버]
↓
DB 저장
↓
Kafka/RabbitMQ 이벤트 발행
↓
업적 서버 / 로그 서버 / 통계 서버 반응
문제
중간에 실패할 수 있음
예)
재화 차감 성공
가챠 결과 저장 성공
근데 이벤트 발행 실패
는
재화 차감 성공
근데 가챠 생성 실패
여기서
- Saga
- Outbox
둘 다 등장
전체 구조
[Game Server]
↓
[DB]
├─ UserCurrency
├─ GachaHistory
└─ Outbox
↓
[Background Worker]
↓
[Kafka/RabbitMQ]
↓
[Achievement Server]
[Analytics Server]
[Log Server]
Saga 역할
가챠 시작
1. 재화 차감
2. 가챠 결과 생성
3. DB 저장
만약 가챠 생성 실패 한다면?
saga가 발동해야한다.
Saga 흐름 그림
비즈니스 상태를 되돌린다
재화 차감
↓
가챠 생성 실패
↓
재화 복구
Outbox 역할
이번엔 DB 저장은 성공했다고 가정
재화 차감 성공, 가챠 저장 성공했다고 해보자
업적 서버
통계 서버
로그 서버
에 이벤트 보내야 할것이다.
보통 코드는 아래 처럼 보낼텐데
SaveGachaResult();
PublishEvent();
만약 이벤트 발행에 실패가 된다면?
DB 저장 성공
이벤트 발행 실패
문제 발생
업적 미반영
통계 누락
로그 누락
Outbox 사용
DB 저장 시
OUTBOX에 같이 저장한다
GachaHistory 저장
+
OutboxEvent 저장
GachaHistory
UserReward
| 1 | SSR |
Outbox
EventTypePayload
| GachaRolled | JSON |
두개 데이터를 묶는다
BEGIN TRANSACTION
INSERT GachaHistory
INSERT Outbox
COMMIT
그 다음
백그라운드 워커가:
Outbox 읽음
↓
Kafka 발행
↓
성공하면 Processed=true
실패하면?
ㄱㅊㄱㅊ OUTBOX에 남아 있어 재시도도 가능하다!
전체 흐름 정리
Saga 담당
재화 차감 실패?
→ 복구
가챠 생성 실패?
→ 롤백
Outbox 담당
이벤트 발행 실패?
→ Outbox에 남음
→ 재발행
총정리
[유저 가챠 요청]
↓
[Saga]
재화 차감
↓
가챠 생성
↓ 실패
재화 복구
-------------------------
성공 시
DB 저장
+
Outbox 저장
↓
[Background Worker]
↓
Kafka 이벤트 발행
↓
업적/로그/통계 서버 처리
반응형
'유니티' 카테고리의 다른 글
| 파이어베이스 게임 데이터 수집 및 분석 관련 블로그 (0) | 2026.05.14 |
|---|---|
| c# unity Delegate 델리게이트 (0) | 2026.04.29 |
| c# 심화 (0) | 2026.04.28 |
| 유니티 생성자, 소멸자 (0) | 2026.04.28 |
| Unity Thread, Task, async/await, EventBus (0) | 2026.04.28 |