交易和遊戲結果的權衡:方法和風險
1)為什麼要閑逛,真正需要的地方
Kesh是降低潛伏期和內核負荷的工具。在iGaming中,這對於:- 讀取資產負債表和事務狀態(頻繁的GET查詢);
- 遊戲/旋轉和集合的故事(排名第一,結果的最後N);
- 遊戲/提供商元數據,投註限制,靜態目錄;
- 系數饋線和UX的「快速」參考(橫幅,促銷狀態)。
但凱什從來都不是金錢和結果的真相來源。真相-ledger/錢包和提供商的確認結果。
2)紅線: 什麼不能結結
金錢記錄:資產負債表註銷/入賬(記錄操作)-僅通過DB/Ledger進行交易和平均值。
在提供商確認之前進行投註/獲勝決策。
影響付款的KYC/AML和合規標誌。
秘密/代幣(允許在進程內存中使用kesh,但不允許共享緩存)。
3)基本腰包模式
Cache-aside (lazy):應用程序首先在kesha中搜索,如果錯過,則從DB讀取並放入kesh(「get → miss → load → set」)。通用且易於閱讀。
寫作:DB的記錄通過kesh;提供密鑰相關性,但增加了記錄的潛伏性。
寫在背面(write-back):首先寫在kesh,然後異步寫入DB。禁止金錢/結果-跌倒時的損失風險。
閱讀通過:kesh自己知道如何從DB(代理kesh,例如Redis with modules/sidecar)中獲取。對元數據有好處。
建議: 讀書,寫作只有在安全的地方,寫作背後-永遠是金錢/遊戲真理.
4)一致性和相容性
真相來源:ledger(只有append-only),「operation_id」操作和偶數處理。
資產負債表:我們從腰果讀取,但在關鍵行動(存款/提款/大利率)之前確認任何差異。
殘疾情況:成功登記在數據庫中→ del/expire相應的平衡/狀態鑰匙。
重復數據消除:用於網絡包/支付的outbox/inbox+idempotency密鑰;kesh不參與重復數據消除,它只會加速讀取。
5)TTL,殘疾和「過時權」
用於平衡的Short-TTL:1-5秒(或帶有背面refresh的軟TTL)。
交易狀態:短的TTL(5-30 s),活動性事件殘疾(「deposit_completed」,「settled」)。
遊戲歷史:TTL 1-10分鐘,在「new_round」事件中殘疾。
元數據/參考資料:TTL 10-60分鐘,空白時扭曲。
事件驅動殘疾:事件總線(Kafka/PubSub)發布「wallet_updated」,「bet_settled」,「bonus_changed」 →訂戶刪除/更新密鑰。
6)反風暴模式(暴風雨失誤和dogon)
請求協商:一個線程「引導」查詢到基地,其余的則等待(mutex per key)。
Stale-wile-revalidate:發出「略有過時」,在背景中並行更新。
Jitter for TTL:隨機化TTL (± 20%),確保密鑰不會同時過期。
失誤背面:永久失誤/失誤-臨時失誤(見下文)。
7)Negative caching和灰色紅衣主教錯誤
對於「未找到」(例如,還沒有事務狀態)-簡短的negative TTL 1-3 s。
不要刷新DB/Supper錯誤超過幾秒鐘-否則,固定事故。
輸入用於可觀察性的金絲雀鍵:增加無關緊要的命中率是值得註意的原因。
8)密鑰結構和細分
Именование: `wallet:{userId}`, `txn:{txnId}:status`, `game:{provider}:{tableId}:last_results`, `leaderboard:{tournamentId}:top100`.
env/region/brand: 'prod: eu: wallet: {userId}-排除交叉和跨區域垃圾。
限制基數-特別是對於領導板和歷史。
9) Kesh在邊緣、群集和內存中
Edge-kesh(CDN/WAF):僅適用於非個人數據(遊戲元數據,公共領導板,媒體)。查詢參數為whitelist;cache-busting保護。
Redis/Memcached(集群):個人閱讀的基礎;包括AOF/RDB狙擊,復制副本和配額。
進程Kesh:熱目錄的微秒訪問;需要殘疾機制(廣播、版本密鑰)。
10)現金案例: 安全加速
玩家的平衡
閱讀:帶有TTL 1-5 s的cache-aside。
記錄:在資產負債表的DB → del kesha進行交易;在臨界動作(輸出/主要出價)中-「來自DB的回扣」。
Antigonca:優化的平衡鎖定版本。
付款狀況
腳本:用戶將「更新狀態」。
解決方案:「pending「/」unknown」 2-5 s上的cache-aside+negative TTL;PSP網絡包更新→殘疾。
獎金/vager
聚合物(進度%):以10-30為單位;在「bet_placed/settled」事件中致殘。
11)遊戲案例: 速度戰線沒有真相失真
自旋/投註歷史
最近的N事件:限制為(例如100)的kesh列表,TTL 1-10分鐘,「round_finished」事件補給。
除非提供者確認中間狀態為「pending」,否則您無法顯示「→」。
Live Games(WebSocket)
為快速連接的客戶提供1-3的短暫最新消息/桌面狀態。
在「tableId/market」上劃分州密鑰。
領導板
Precompute+kesh在10-60 s;對於大規模升級-戰鬥更新和「窗口」的部分殘疾。
12)風險以及如何關閉
雙重註銷/幻影勝利:僅從腰果中閱讀;所有註銷/入學-通過DB和IDP。
舊數據→與玩家的爭議:TTL短,付款前的「嚴格現實」,透明狀態(「等待確認」)。
分裂斷斷斷續續的kesh集群:法定人數/sentinel,timeouts,放棄寫作。
熱鍵上的cache stampede:coalescing,jitter,stale-while-revalidate。
緩存註入/poisoning:嚴格的密鑰、緩存API響應的簽名/簽名、金絲雀檢查。
隱私/PII:信道加密(mTLS),禁止在邊緣使用腰果以獲取個人數據,TTL短,登錄時清除。
13)kesh的可觀察性
每個層的度量標準為:- 按鍵類別命中/小姐評分;redis_ops/sec, latency p95/p99, evictions, memory_usage.
- 金絲雀鍵:'cache_health: {segment}'-驗證無關鍵的份額和更新時間。
- Logs:「packs」失誤,每個細分市場經常出現「del」=「嘈雜」服務的跡象。
- Traces:與關鍵標簽一起演唱「cache get/set/del」(沒有PII)。
14)迷你架構(參考)
1.應用程序(API/WS)→ Redis群集(TLS,auth)。
2.真相來源:Wallet DB(ledger),遊戲結果商店。
3.事件總線:「wallet_updated」,「bet_settled」,「promo_changed」。
4.殘疾人:→ 'del'/'set'熱鑰事件的訂閱者。
5.Edge-kesh:僅限公共資源/領導板。
6.可觀察性:kesha dashbords,stampede alerta,負命中。
15) TTL政策(近似矩陣)
16)示例偽代碼(安全地讀取平衡)
python def get_balance(user_id):
key = f"wallet:{user_id}"
bal = cache.get(key)
if bal is not None:
回歸球失誤:我們從DB和一個簡短的TTL+jitter bal=db的寶藏中獲取。get_wallet_balance(user_id)
cache.set(key, bal, ttl=randint(1,5))
return bal
def apply_transaction(op_id, user_id, delta):
if db等效的DB中的原子記錄。exists_op(op_id):
return db.get_result(op_id)
res = db.apply_ledger (op_id、user_id、三角洲)#cache事務。delete (f 「wallet: {user_id}」)#殘疾返回res17)生產就緒支票清單
- 明確的劃分:DB中的真相,kesh-僅供閱讀。
- 模式:讀取的cache-aside;禁止在背後寫字。
- 事件殘疾:「wallet_updated」,「bet_settled」,「promo_changed」。
- 短TTL+jitter;negative-cache ≤ 3 с.
- 反風暴:coalescing,stale-while-revalidate。
- 按env/region/brand細分鑰匙;基數限制。
- 觀察力:hit/miss, evictions, p95, alertes on stampede/negative-spikes.
- Edge-kesh僅用於公共數據;個人-僅在Redis/TLS中。
- Runbook:在同步時該怎麼辦(forced refresh,暫時禁用片段的腰果)。
- 定期測試:熱鍵負載,stampede演習。
二.總結
iGaming中的Kesh是閱讀加速器而不是「第二個貨幣數據庫」。將真相存儲在ledger中,確保等效性和事件性殘疾,保持短的TTL和反風暴力學,共享邊緣凱什和個人數據,關註凱什指標。因此,您將獲得快速的UX,而沒有「獲勝幻想」,雙重註銷和監管問題。
