캐싱 거래 및 게임 결과: 접근 및 위험
1) 왜 캐시와 실제로 필요한 곳
캐시는 코어의 대기 시간과로드를 줄이는 도구입니다. iGaming에서는 다음에 중요합니다
대차 대조표 및 거래 상태 읽기 (빈번한 GET 요청);- 게임/스핀 및 골재의 이력 (리더 보드의 상단, 마지막 N 결과);
- 게임/공급자의 메타 데이터, 베팅 제한, 정적 디렉토리;
UX (배너, 판촉 상태) 에 대한 계수 및 "빠른" 참조 피드.
그러나 캐시는 결코 돈과 결과의 진실의 원천이 아닙니다. 진실-원장/지갑 및 공급자의 확인 된 결과.
2) 빨간 선: 캐시 할 수없는
자금 기록: 잔액 제거/신용 (기록 작업) -트랜잭션 및 demempotency가있는/원장 데이터베이스를 통해서만 가능합니다.
공급자 확인 전에 베팅/윈 결정.
지불금에 영향을 미치는 KYC/AML 및 규정 준수 플래그.
비밀/토큰 (프로세스 메모리의 캐시는 유효하지만 공유 캐시는 아님).
3) 기본 캐싱 패턴
캐시 제외 (게으른): 응용 프로그램이 먼저 캐시에서 보이고 누락되면 데이터베이스에서 읽은 다음 캐시에 넣습니다 ('확인 → 미스 → 로드 → 세트'). 다재다능하고 안전합니다.
쓰기: 데이터베이스에 쓰기는 캐시를 통과합니다. 키가 최신 상태인지 확인하지만 레코드 대기 시간이 늘어납니다.
쓰기 뒤에 (쓰기): 먼저 캐시에 기록한 다음 데이터베이스에 비동기식으로 기록합니다. 돈/결과에 대한 금지-넘어 질 때 손실 위험.
읽기: 캐시 자체는 데이터베이스에서 나가는 방법을 알고 있습니다 (예: 모듈/사이드카가있는 Redis). 메타 데이터에 좋습니다.
권장 사항: 읽기를위한 캐시 제외, 안전하고 쓰기 뒤에있는 경우에만-돈/게임 진실을위한 것이 아닙니다.
4) 일관성과 demmpotency
진실의 근원: 원장 (추가 전용), 'operation _ id' 작업 및 demempotent 처리 작업.
균형: 캐시에서 읽었지만 중요한 조치 (예금/인출/큰 비율) 전에 데이터베이스에서 불일치가 확인됩니다.
장애: 해당 잔액/상태 키가 → del/만료 데이터베이스에 성공적으로 작성된 경우.
중복 제거: 웹 후크/결제를위한 아웃 박스/받은 편지함 + dedempotency 키; 캐시는 dedup에 참여하지 않으며 읽기 속도 만 높입니다.
5) TTL, 장애 및 "노후화 권리"
저울의 짧은 TTL: 1-5 초 (또는 배경 새로 고침이있는 소프트 TTL).
거래 상태: 이벤트 별 활성 장애가있는 짧은 TTL (5-30 초) ('예금 _ 완료', '정착').
게임 기록: TTL 1-10 분, 'New _ round' 이벤트로 인한 장애.
메타 데이터/디렉토리: TTL 10-60 분, 고갈되면 예열.
이벤트 중심 장애: 이벤트 버스 (Kafka/PubSub) 는 'wallet _ uptaided', 'bet _ setted', 'bonus _ changeed' → 가입자 삭제/업데이트 키를 게시합니다.
6) 폭풍 방지 패턴 (Miss Storm and Dogon)
요청 통합: 하나의 스레드가 요청을 데이터베이스로 "리드" 하고 나머지는 대기 중입니다 (키당 뮤텍스).
부실한 상황: "약간 구식" 을 동시에 백그라운드에서 업데이트하십시오.
TTL 용 지터: Randomize TTL (λ20%) 이므로 키가 동시에 만료되지 않습니다.
미스에 대한 백오프: 일정한 미스/오류-일시적인 네거티브 캐시 (아래 참조).
7) 네거티브 캐싱 및 회색 기본 오류
"찾을 수 없음" (예: 아직 트랜잭션 상태가 없음) 의 경우 짧은 음의 TTL 1-3 초입니다.
몇 초 이상 데이터베이스/제공자 오류를 캐시하지 마십시오. 그렇지 않으면 사고를 수정하십시오.
관찰 가능성을 위해 카나리아 키를 입력하십시오. 부정적인 타격의 비율이 증가하는 것이 경고의 이유입니다.
8) 주요 구조 및 세분화
차이나: '지갑: {사용자 정의}', 'txn: {txnID}: 상태', '게임: {제공자}: {tableID}: last _ results', '리더 보드: {토너먼트}: top100'.
env/regional/brand별로 세그먼트/네임 스페이스: 'prod: eu: wallet: {ususer}' - 교차로 및 교차 지역 가비지를 제외하십시오.
특히 리더 보드와 역사를 위해 카디널리티를 제한하십시오.
9) 가장자리, 클러스터 및 메모리에 캐시
에지 캐시 (CNC/WAF): 비개인 데이터 (게임 메타 데이터, 공개 리더, 미디어) 만 해당됩니다. 쿼리 매개 변수 - 화이트리스트; 캐시 버스팅 보호.
Redis/Memcashed (클러스터): 개인 판독 기준; AOF/RDB 스냅 샷, 복제 및 할당량을 포함합니다.
프로세스 내 캐시: 핫 디렉토리에 대한 마이크로 초 액세스; 비활성화 메커니즘 (브로드 캐스트, 버전 키) 이 필요합니다
10) 돈 사례: 안전한 가속
플레이어 밸런스
읽기: TTL 1-5 초로 캐시 제외.
기록: 밸런스 → 델 캐시 데이터베이스의 트랜잭션; 중요한 조치 (출력/큰 내기) - "DB에서 재확인".
Antigone: 대차 대조표의 낙관적 잠금 버전.
지불 상태
시나리오: 사용자가 "업데이트 상태" 를 누릅니다.
솔루션: 캐시 제외 + 음의 TTL에서 "보류 중 "/" 알 수없는" 2-5 초; PSP 웹훅 업데이트 → 장애.
보너스/베이거
집계 (% 의 진행 상황): 캐시 10-30 초; 'bet _ placed/setted' 이벤트로 인한 장애.
11) 게임 케이스: 진실의 왜곡이없는 고속 전선
스핀/베팅 기록
마지막 N 이벤트: 제한이있는 캐시 목록 (예: 100), TTL 1-10 분, 'round _ finished' 이벤트로 보충.
공급자의 확인이있을 때까지 "승리" 를 표시 할 수 없습니다 → 중간 상태가 "보류 중" 입니다.
라이브 게임 (웹 소켓)
빠르게 연결된 클라이언트의 경우 1-3 초 동안 최근 메시지/테이블 상태의 단기 캐시.
'tableID/market' 으로 세그먼트 상태 키.
리더 보드
10-60 초 동안 Precpute + 캐시; 대량 업데이트 용 - "창" 의 배치 업데이트 및 부분 장애.
12) 위험과 폐쇄 방법
이중 충전/팬텀 승리: 캐시에서 읽기 전용; DB 및 demempotence를 통한 모든 요금/크레딧.
오래된 데이터 → 플레이어와의 분쟁: 짧은 TTL, 지불 전 "엄격한 현실", 투명한 상태 ("확인 대기 중").
분할 뇌 캐시 클러스터: 쿼럼/센티넬, 타임 아웃, 쓰기 거부.
캐시는 뜨거운 키에 각인되어 있습니다: 통합, 지터, 부실한 동안.
캐시 주입/중독: 캐시 된 API 응답에 대한 강력한 키, 서명/서명, 카나리아 검사.
개인 정보 보호/PII: 채널 암호화 (mSL), 개인 데이터의 가장자리에 대한 캐시 금지, 짧은 TTL, 로그아웃 청소.
13) 캐시 관찰 가능성
계층 당 측정 항목:- 주요 범주 별 적중/미스 비율; redis _ ops/sec, 대기 시간 p95/p99, 퇴거, 메모리 _ 사용.
- 카나리아 키: 'cash _ health: {segment}' -음수 캐시의 점유율을 확인하고 시간을 업데이트하십시오.
- 통나무: 한 세그먼트에서 빈번한 'del' = "잡음" 서비스의 표시를 놓칩니다.
- 트레일: 키 태그가있는 "캐시 가져 오기/설정/델" 에 걸쳐 있습니다 (PII 없음).
14) 미니 아키텍처 (참조)
1. 응용 프로그램 (API/WS) → Redis 클러스터 (SL, 조정).
2. 진실의 근원: 월렛 DB (원장), 게임 결과 저장소.
3. 이벤트 버스: 'wallet _ uptaided', 'bet _ setted', 'promo _ changeed'.
4. 비활성화: → 'del '/' set' 핫 키 이벤트 가입자.
5. 에지 캐시: 공공 자원/리더십 보드 만.
6. 관찰 가능성: 캐시 대시 보드, 스탬프 경고, 부정적인 적중.
15) TTL 정책 (샘플 매트릭스)
16) 샘플 의사 코드 (안전 균형 읽기)
python def get _ balance (user _ id):
key = f "지갑: {user _ id}"
bal = 캐시. 가져 오기 (키)
발이 없다면:
bal miss 반환: 데이터베이스에서 가져 와서 짧은 TTL + jitter bal = db로 넣습니다. (PHP 3 = 3.0.6, PHP 4)
캐시. 세트 (key, bal, ttl = randint (1,5))
귀환 발
(PHP 3 = 3.0.6, PHP 4)
(PHP 3 = 3.0.6, PHP 4) (PHP 3 = 3.0.6, PHP 4)
return db. (PHP 3 = 3.0.6, PHP 4)
res = db. (PHP 3 = 3.0.6, PHP 4) 삭제 (f "wallet: {user _ id}") # 장애 수익률17) 생산 준비 점검표
- 명확한 구분: 데이터베이스의 진실, 캐시-읽기 전용.
- 패턴: 읽기를위한 캐시 제외; 쓰기는 금지되어 있습니다.
- 이벤트 장애: 'wallet _ uptaided', 'bet _ setted', 'promo _ changeed'.
- 짧은 TTL + 지터; 네거티브 캐시
- 폭풍 방지: 합병, 오래된 재발.
- env/region/brand에 의한 주요 세분화; 카디널리티 제한.
- 관찰 가능성: 적중/미스, 퇴거, p95, 각인/음성 스파이크에 대한 경고.
- 공개 데이터 전용 엣지 캐시; 개인-Redis/TLS에서만.
- 런북: 동기화되지 않을 때해야 할 일 (강제 새로 고침, 세그먼트 캐시 일시적으로 비활성화).
- 정기적 인 테스트: 뜨거운 키 부하, 각인 운동.
요약 다시 시작
iGaming의 캐시는 "돈을위한 두 번째 데이터베이스" 가 아닌 판독 액셀러레이터입니다. "원장에 진실을 유지하고, dempotence 및 이벤트 장애를 보장하고, 짧은 TTL 및 폭풍 방지 메커니즘, 별도의 에지 캐시 및 개인 데이터를 유지하고, 캐시 메트릭을 모니터링하십시오. 따라서 "승리의 환상", 이중 청구 및 규제 문제없이 빠른 UX를 얻을 수 있습니다.
