하루에 수백만 건의 트랜잭션을 안전하게 처리하는 방법
전체 기사
1) 안전하지 않은 거래의 의미
실패한 상황은 실패한 상황이 돈과 데이터를 잃지 않고 안전한 정지 또는 보상 상태로 이어지는 경우입니다. 목표:- "이중 직불/크레딧" = 0.
- 잃어버린 거래/이벤트 = 0.
- 대기 시간/전달, 명확한 분해 모드 및 DR에 의한 예측 가능한 SLO
기초-통화 불변량 (한 곳에서 진정한 균형), dempotence, 합의 된 이벤트 전달.
2) 건축 원칙 (짧은)
1. 단일 진실의 원천: 대차 대조표 및 회계-Ledger/Wallet. 주변 서비스는 돈이 아닌 프로세스 상태를 유지합니다.
2. 모든 곳의 이념성: 모든 "쓰기" 작업에는 'Idempotency-Key' 가 필요합니다. 반복하면 동일한 결과가 반환됩니
3. 배송 보증이있는 이벤트: 아웃 박스/CDC, 대기열, DLQ, 데드 업.
4. "수동 편집" 이 아닌 사가 및 보상.
5. 역압 및 우선 순위: 시스템 속도는 느려지지만 붕괴되지는 않습니다.
6. 기본 관찰 가능성: 구조화 된 로그, 추적, 메트릭.
7. 다중 지역 및 DR: 자산 자산/자산 책임, 규칙적인 운동.
3) 참조 토폴로지
Edge/API GW -명령 API -앱 서비스 (Sagas)
│           │
(PHP 3 = 3.0.6, P
RateLimit 전송 표 -출판사 -Kafka/Pulsar -소비자
│                      │
WAF -DLQ/리플레이
│
원장/지갑 (ACID, dempotent debit/credit)
│
-CDC/체인지 피드 -DWH/BI/정찰주요 장소: 전송 (팀의 원자 기록 및 이벤트의 "초안"), 게시자 (정확히 하나의 전달), 소비자 (dempotent, dedup 키가있는 dempotent), DLQ/Replay (제어 반복).
4) 통화 불변량과 일관성
잔액 별 진실-원장 (ACID, 직렬화 가능한 거래 또는 계정 별 엄격한 주문).
돈 명령: '직불', '신용', '보류', '커밋', '롤백' 은 유쾌합니다.
결합 된 프로세스는 사가와 같이 구축됩니다
'승인 → 크레딧', '요청 → 제출 → 제출/실패', '환불/무효'.
Ledger를 우회하여 직접 대차 대조표를 편집하지 않습니다.
5) Idempotence: 키 디자인
열쇠는 비즈니스 거래를 고유하게 식별해야합니다
'bet _ id + 릴리스 + 통화', 'payment _ constitude + capture _ id', 'payout _ id', 'chain _ txid'.
키 (응답 캐시) 별로 결과를 저장합니다. 동일한 키 → 동일한 본문/상태로 반복하십시오.
불일치 모니터-금액이 다른 동일한 키 → 'IDEMPOTENCY _ MISMATCH'.
6) 대기열, 주문 및 데드 업
정확히 한 번의 효과는 운송이 아니라 demempotent 소비자 + dedup 스토리지 (LRU/Redis/DB c TTL) 에 의해 달성됩니다.
키 순서를 유지하십시오 (파티션 키 = '계정 _ id/round _ id/player _ id').
"이기종" 키-엔터티 당 상태 머신.
DLQ는 필수입니다: N 시도 후-사람이 읽을 수있는 원인이있는 격리 된 주제로.
7) 전송/CDC: 이벤트가 "손실되지 않는" 이유
한 트랜잭션의 틀 안에서 서비스 데이터베이스에 비즈니스 변경 및 아웃 박스 항목을 모두 기록합니다.
별도의 게시자가 아웃 박스를 읽고 확인 버스에 게시합니다.
또는 데이터베이스 수준 (데베 지움/복제 로그) 의 CDC (데이터 캡처 변경).
트랜잭션 이후의 "이벤트 로그" 는 손실의 원인이 아닙니다.
8) 역압 및 우선 순위
토큰 버킷 및 입력 할당량 (테넌트/브랜드/지역당).
우선 순위 대기열: 프로모션/원격 측정 위의 돈 경로.
과부하시: '새로운 세션/요청 없음' 모드, 보조 기능 동결, 커널 저장.
자동 저하: 배경 작업의 빈도를 줄이고 중요한 작업자를 동적으로 확장하십시오.
9) 다지역 지속 가능성
API 및 대기열, 로컬 원장 (또는 지역/통화 샤딩이있는 글로벌) 에 대한 자산.
데이터 레지던트: 명시적인 규칙 없이는 돈/PII/로그가 교차되지 않습니다.
이벤트 복제는 지역 간 비동기이며 '지역' 으로 표시됩니다.
RPO/RTO: RPO를 조준하면 5 분, RTO는 30 분; 정기적으로 확인하
10) SLO/SLI 및 대시 보드
랜드 마크 (예):- p95 '승인/직불/신용' <150-300 ms (내부 경로).
- p95 엔드 투 엔드 "bus komanda → sobytiye" <1-2 s.
- 웹 후크/외부 이벤트 p99 <5 분 전달.
- Lost/Duplicated Transactions = 0 (계약 점검).
지표: 대기 시간 p50/p95/p99, 오류율 (4xx/5xx/business), 소비자/대기열 지연, 재 시도 폭풍, 지연 지연, 웹 후크 지연, DLQ 크기, 'IDEMPOTENCY _ MISMATCH' 주파수.
11) 관찰 및 감사
구조화 된 JSON은 'trace _ id', 'demempotency _ key', 비즈니스 ID, 오류 코드로 로그합니다.
OpenTelemetry: TP/gRPC/DB/bus 추적, 사가 범위.
WORM 감사: 변경 불가능한 중요한 변경 로그 (제한, 키, 프로모션/잭팟 구성).
로그 액세스를위한 PII/비밀 마스킹, 지역 버킷, RBAC/ABAC.
12) 신뢰성 테스트
계약 테스트: 반복/복제, 고장, demempotency, dedup.
로드: 피크 프로파일 (x10), 대기열의 안정성 및 DB.
혼돈 사례: 원장/지갑 드롭, 대기열/지역 덤프, CDC 지연, "폭풍"
게임 일: MTTR을 측정 한 정기적 인 DR 훈련 및 사건.
13) 저장 및 데이터
돈을위한 OLTP: 거래 데이터베이스 (RPO λ0), 엄격한 지수, 중요한 실체를위한 직렬화 가능한 수준.
캐시 (Redis) - "진실" 이 아니라 가속만을위한 것입니다. "TTL + 지터, 캐시 스탬피드 보호.
OLAP/DWH-보고서/분석 용. CDC/버스에서 흐르며 OLTP에는 부하가 없습니다.
데이터 스키마는 다양합니다. 다운 타임없이 마이그레이션 (확장/계약).
14) 회복 오케스트레이션
지수 백오프 + 지터, RPC의 마감일/시간 초과.
각 계층에서 이념적 반복 (클라이언트 → 서비스 → 소비자).
Retrai 할당량, "폭풍" (회로 차단기, 적절한 경우 헤지 요청) 으로부터 보호하십시오.
속도 제한이있는 DLQ에서 "안전한" 창으로 만 재생됩니다.
15) 운송의 안전
모든 곳의 mTLS, 단기 토큰 (OAuth2 CC), 웹 후크 용 바디 시그니처 (HMAC/EdUSA).
Vault/HSM의 비밀, 회전, 브랜드/지역 당 키.
정치인들은 수동 운영에 대한 "네 눈" 을 최소화합니다.
16) 샘플 계약 (조각)
이념적 직불 명령
POST/v1/지갑/직불
헤더: X-Idempotency-Key: debit _ pi _ 001, X-Trace-ID: tr _ a1b2
{
"계정 _ id": "acc _ 42", "금액": {"minor _ 단위": 5000, "통화": "EUR"}, "이유": "지불", "참조 _ id": "po _ 001"
}
→ 200 {"상태": "커밋", "entry _ id": "e _ 77"}
(반복 → 동일한 답변)아웃 박스에서 이벤트
json
{
"이벤트 _ id": "uIS", "이벤트 _ 유형": "지갑. 직불. 커밋 된 "" arched _ at ":" 2025-10-23T16: 21: 05Z "," play _ id ":" acc _ 42 "," amount _ minor ": 5000," qualy ":" EUR "," reference _ id ":" po _ 001, "deidempotency _ key": "debit _ pi _ 001", "버전". 3. 0"
}17) 점검표
플랫폼/운영자
- 균형에 대한 진실-하나의 원장; 해결 방법이 없습니다.
- 'Idempotency-Key' 를 사용한 모든 쓰기 작업; 키 응답이 저장됩니다.
- 모든 도메인 레코드, DLQ 및 관리 재생에 대한 전송/CDC.
- 우선 대기열, 역압, 열화 모드.
- 파티션 키는 비즈니스 키로 선택됩니다. 소비자는 유쾌합니다.
- SLO 대시 보드, OpenTelemetry, WORM 감사.
- 정기적 인 DR/xaoc 연습, 계약/부하 테스트.
- 데이터 레지던트, 암호화, Vault/HSM, 키 회전.
제공자/통합
- 재전송 준비가 된 Trace-ID/Idempotency-Key 보내기
- 웹 후크가 서명되고 중복됩니다.
- 체계/계약의 버전이 관찰됩니다 (semver, deprecation).
18) 적색 플래그 (패턴 방지)
Ledger에서 명령없이 웹 후크로 밸런스가 변경됩니다.
dempotency → 이중 쓰기/크레딧 부족.
Outbox/CDC를 우회하는 이벤트 게시.
역압: 모놀리스: 최대 트래픽은 모든 것을 무너 뜨립니다.
OLTP와 보고서 혼합: BI가 전투 데이터베이스에 충돌합니다.
DLQ/재생 부재; 오류의 "조용한" 섭취.
지역 PII/돈 격리가 없습니다. 여러 브랜드에서 공유 키.
데이터베이스의 잔액/상태를 수동으로 편집합니다.
19) 결론
하루에 수백만 건의 트랜잭션을 안전하게 처리하는 것은 불변과 징계에 관한 것입니다. 단일 진실의 원천, dem 등원 명령, 사가 및 아웃 박스/CDC, 대기열의 순서 및 데드 업, 관찰 가능성 및 관리 성능 저하. 액세스 명령, DR 관행 및 정기 연습을 추가하고 돈이 빠르게 한 번만 이동하고 이벤트가 손실되지 않으며 교통 체증과 중단이 놀라움이 아닌 관리 가능한 위험이되는 시스템을 얻으십시오.
