본문 바로가기
유니티

Saga Pattern, Outbox Pattern

by 유니티세상 2026. 5. 18.
반응형

Saga Pattern

실패한 비즈니스 작업을 되돌리는 패턴

  • 여러 서버
  • 여러 DB
  • 긴 비즈니스 흐름
  • 분산 트랜잭션

Outbox Pattern

이벤트를 절대 잃어버리지 않게 하는 패턴

  • 이벤트 기반 시스템
  • Kafka/RabbitMQ 사용
  • 이벤트 유실 방지 필요
  • 로그/분석/업적/랭킹

 


상황: 게임 가챠 시스템

유저가 10연속 가챠했을떄

요구사항

  1. 유저 재화 차감
  2. 가챠 결과 저장
  3. 업적 반영
  4. 통계 서버 전송
  5. 로그 저장
  6. 푸시 알림
[게임 서버]
   ↓
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 이벤트 발행

        ↓

업적/로그/통계 서버 처리

 

반응형