GH GambleHub

사가 패턴 및 분산 거래

사가 패턴 및 분산 트랜잭션

1) 사가가 필요한 이유

클래식 2PC (2 상 래칭) 는 확장 불가능하고 실패시 복잡하며 리소스를 차단합니다. 사가는 전체 비즈니스 프로세스를 일련의 현지 거래 (단계) 로 분류하며, 각 비즈니스 프로세스는 독립적으로 커밋됩니다. 실패의 경우 후속 단계가 취소되고 이미 완료 된 단계는 역 작업으로 보상됩니다.
결과: 글로벌 차단, 높은 생존 성 및 명확한 복구 프로토콜없이 최종 일관성을 관리했습니다.

2) 기본 모델

2. 1 오케스트레이션

전용 사가 코디네이터가 단계를 관리합니다. 명령을 보내고 응답/이벤트를 기다리며 보상을 시작합니다.
장점: 중앙 집중식 제어, 간단한 관찰 성, 명시적인 마감일. 단점: 선택 구성 요소.

2. 2 안무

코디네이터 없음; 서비스는 서로의 이벤트에 응답합니다 ("OrderPlaced →" "PaymentCaptured" → "InventoryReserved"...).
장점: 연결성이 약합니다. 단점: 추적하기 어렵고 명확한 규칙없이 "죽음의 춤" 의 위험.

2. 3 TCC (확인/취소)

"동결" 리소스가있는 옵션:

1. 시도-준비/예비,

2. 확인 - 고정,

3. 취소-롤백.

보장은 높지만 계약 및 예비 타임 아웃은 더 복잡합니다.

3) 단계 및 보상 계약

각 단계 = 로컬 트랜잭션 + 보상 (demempotent, 반복 허용).
"세계를 반환" 하기 위해 보상이 필요하지 않습니다. 도메인 동등성으로 충분합니다 (예: "지불 삭제" 대신 "반품 지불").
불변량을 정의하십시오: 돈을 위해-균형은 마이너스로 들어 가지 않습니다. 주문 - "매달린" 상태 없음.
연체 시도에 대한 마감일/TTL 준비금 및 "가비지 수집기" 를 입력하십시오.

4) 일관성 및 전달 의미론

메시지 전달: 적어도 한 번 (기본값) → 모든 작업은 demmpotent이어야합니다.
주문: 상관 키에 의해 중요합니다 (예: 'order _ id', 'player _ id').
정확히 한 번은 사가의 목표가 아닙니다. 우리는 demempotent 키, Outbox/받은 편지함 및 올바른위원회를 통해 효과적인 균일 성을 달성합니다.

5) 사가의 상태와 통나무

저장할 내용:
  • 'saga _ id', 'correlation _ id', 현재 상태 (실행/완료/보상/보상/실패),
  • 단계 및 변수 (지불/예약 ID),
  • 이벤트/결정, 타임 스탬프, 마감일, 배송 횟수의 이력 (로그).
보관할 곳:
  • 코디네이터가 사용할 수있는 별도의 Saga Store (표/문서).
  • 안무의 경우-사가의 현지 "에이전트", 공통 주제로 상태 이벤트 게시.

6) 신뢰할 수있는 게시 패턴: 아웃 박스/받은 편지

편지함: 단계는 변경을 저지르고 한 번의 트랜잭션으로 이벤트/명령을 아웃 박스 테이블에 씁니다. 작업자가 타이어에 게시합니다.
받은 편지함: 소비자는 처리 된 '메시지 _ id' → dedup + dedempotency 테이블을 유지 관리합니다.
성공적인 부작용 후 오프셋/ACK (Kafka/RabbitMQ) 를 커밋합니다.

7) 사가 단계 설계

7. 1 예 (iGaming/전자 상거래 구매)

1. PlaceOrder → 상태 'PENDING'.
2. AuthorizePayment (Try) → 'payment _ hold _ id'.
3. 예약 인벤토리 → '예약 _ id'.
4. 자본 지불 (확인).
5. FinalizeOrder → 'COMPLETED'.

보상:
  • (3) 'CancelPaymentHold' → 실패 경우;
  • (4) (3) → 'ReleaseInventory' 이후 실패했습니다.
  • (5) 'RefundPayment' 및 'ReleaseInventory' → 실패 경우.

7. 마감일 2 개/후퇴

지수 지연 + 지터가있는 최대 N 반전.
초과 후-' 보상 '으로 이동하십시오.

(PHP 3 = 3.0.6, PHP 4)

8) 오케스트레이터 vs 플랫폼

옵션:
  • 경량 홈 오케 스트레이터 (마이크로 세르 비체 + 사가 테이블).
  • 플랫폼: Temporal/Cadence, Camunda, Netflix Conductor, Zeebe-타이머, 배신, 수명이 긴 워크 플로, 가시성 및 웹 콘솔을 제공합니다.
  • 안무를 위해 이벤트 카탈로그와 엄격한 상태/키 규칙을 사용하십시오.

9) 통합 프로토콜

9. 1 비동기 (Kafka/RabbitMQ)

명령: '지불. 승인. v1 ',' 재고. 예약. v1 '.
이벤트: '지불. 승인 된. v1 ',' 재고. 예약. v1 ',' 지불. 캡처. v1 ',' 지불. 환불. v1 '.
파트 키 = 'order _ id '/' player _ id' 주문.

9. 2 단계 내에서 동기식 (해/gRPC)

"짧은" 단계에 유효하지만 항상 타임 아웃/retrays/dedempotency 및 비동기 보상으로 대체됩니다.

10) 이념과 열쇠

명령 및 보상 요청에서 'idempotency _ key' 를 통과하십시오.
부작용 (데이터베이스에 쓰기/쓰기) 은 조건부로 수행됩니다. "아직 'idempotency _ key' 를 보지 못한 경우 수행하십시오".
보상도 엄청납니다. 'RefundPayment (id = X)' 반복은 안전합니다.

11) 오류 처리

수업:
  • 과도 (네트워크/타임 아웃) → retray/backoff.
  • 비즈니스 (불충분 한 자금, 한도) → 즉각적인 보상/대체 경로.
  • 복구 할 수없는 → 수동 개입, 수동 보상.
  • 솔루션 행렬 구축: 오류 유형 → 동작 (재 시도/보상/에스컬레이션).

12) 관찰 및 SLO 처짐

SLI/SLO:
  • 사가의 엔드 투 엔드 대기 시간 (p50/p95/p99).
  • 성공률.
  • (PHP 3 = 3.0.6, PHP 4)
  • 고아가 된 사가와 GC까지의 시간.
  • 추적: 단계 간 스팬 링크로서 'trace _ id '/' saga _ id'; 오류 예산에 대한 연소율 지표.

통나무: 각 사가 상태 변경 = 원인이있는 구조화 된 기록.

13) 예 (의사 코드)

13. 1 오케스트레이터 (아이디어)

python def handle(OrderPlaced e):
saga = Saga. start(e. order_id)
saga. run(step=authorize_payment, compensate=cancel_payment)
saga. run(step=reserve_inventory, compensate=release_inventory)
saga. run(step=capture_payment, compensate=refund_payment)
saga. run(step=finalize_order, compensate=refund_and_release)
saga. complete()

def run(step, compensate):
try:
step () # local transaction + outbox except Transient:
schedule_retry()
except Business as err:
start_compensation(err)

13. 2 보내기 (테이블 아이디어)


outbox(id PK, aggregate_id, event_type, payload, created_at, sent_at NULL)
inbox(message_id PK, processed_at, status)
saga(order_id PK, state, step, next_attempt_at, deadline_at, context JSONB)
saga_log(id PK, order_id, time, event, details)

13. 3 안무 (테마 아이디어)

'주문. '→ 소비자: ' 지불. ',' 재고를 승인하십시오. 예약 '

'지불. 승인 된 '+' 인벤토리. '→' 주문 예약. (PHP 3 = 3.0.6, PHP 4)

→ '주문의 실패. '→ 시작' 지불을 보상하십시오. 취소/환불 ',' 재고. 릴리스 '.

14) 2PC와 ES와의 비교

2PC: 강력한 일관성이지만 막힘, 병목 현상, 구리 파이프.
사가: 최종 일관성, 보상 및 원격 측정 규칙이 필요합니다.
이벤트 소싱: 이벤트를 진실의 원천으로 저장합니다. 사가는 자연 스럽지만 마이그레이션/스냅 샷에 복잡성을 추가합니다.

15) 안전 및 준수

주제/대기열 당 ACL (리포트 보안).
이벤트-적어도 PII, 민감한 필드의 암호화, 토큰 화.
사가 및 보상 로그에 대한 감사 액세스.
외부 제공 업체가있는 SLA (결제/배송) = 마감일 및 재 트레이 제한 매개 변수.

16) 구현 점검표 (0-45 일)

0-10 일

후보 프로세스를 선택하십시오 (멀티 서비스, 보상).
모델 (오케스트레이션/안무/TCC) 과 상관 키를 선택하십시오.
단계/오프셋, 불변 및 마감일을 설명하십시오. 테이블 'saga', 'outbox', '받은 편지함' 을 올립니다.

11-25 일

아웃 박스/받은 편지함, demotency 및 백오프 복귀를 포함하십시오.
배치 첫 사가; SLI/SLO 대시 보드와 추적을 추가하십시오.
보상 런북 (매뉴얼 포함) 및 에스컬레이션을 작성하십시오.

26-45 일

GC "매달린" 사가를 자동화하고 마감일에 정기적으로 재시작/연속하십시오.
게임 데이: 단계 실패, 마감일 초과, 중개인 이용 불가.
이벤트 계약 (버전, 호환성) 을 표준화하고 "saga 디렉토리" 를 설정합니다.

17) 반 패턴

도메인 올바른 역 동작 대신 "보상 = 데이터베이스에서 삭제".
아웃 박스/받은 편지함 → 이벤트 손실/이중 효과가 없습니다.
지터가없는 배신자 → 자기 -DDoS 의존성.
"진행중인 처리" 없이 읽기에 대한 강력한 일관성을 기대합니다.
모든 → 제어 모놀리스를위한 하나의 거대한 오케 스트레이터.
가시성이없고 SLA → 제어 할 수없는 춤이없는 총 안무.
마감일을 무시하고 → 영원한 매장량/보유.

18) 성숙도 지표

중요한 프로세스의 90% 이상이 사가/보상으로 덮여 있으며 설명 된 불변량이 있습니다.
모든 Tier-0/1 생산자/소비자에게 인보드/받은 편지함이 통합되어 있습니다.
SLO: p95 엔드 투 엔드 사가는 정상이며 성공률은 안정적이며 고아 <대상입니다.
투명한 추적 및 대시 보드는 "단계적으로" 화상 경고입니다.
분기 별 게임 데이 및 수동 런북 보상 확인.

19) 결론

Saga는 명확한 단계 및 역 조치, 징계 (아웃 박스/받은 편지함) 게시, 마감일 및 배상, 관찰 가능성 및 보상 프로세스 등 분산 시스템에 대한 실질적인 일관성 계약입니다. 모델 (오케스트레이션/안무/TSS) 을 선택하고 불변량과 키를 수정하고 처리기를 dempotent로 만드십시오. 멀티 서비스 비즈니스 프로세스는 값 비싼 2PC 없이도 예측 가능하고 안정적으로 될 것입니다.

Contact

문의하기

질문이나 지원이 필요하시면 언제든지 연락하십시오.우리는 항상 도울 준비가 되어 있습니다!

통합 시작

Email — 필수. Telegram 또는 WhatsApp — 선택 사항.

이름 선택 사항
Email 선택 사항
제목 선택 사항
메시지 선택 사항
Telegram 선택 사항
@
Telegram을 입력하시면 Email과 함께 Telegram에서도 답변드립니다.
WhatsApp 선택 사항
형식: +국가 코드 + 번호 (예: +82XXXXXXXXX).

버튼을 클릭하면 데이터 처리에 동의하는 것으로 간주됩니다.