Önbellekleme İşlemleri ve Oyun Sonuçları: Yaklaşımlar ve Riskler
1) Neden önbellek ve gerçekten ihtiyacınız olan yer
Önbellek, çekirdek üzerindeki gecikmeyi ve yükü azaltmak için bir araçtır. IGaming'de, bu kritik öneme sahiptir:- Bilançoları ve işlem durumlarını okumak (sık sık GET talepleri);
- Oyunların/dönüşlerin ve agregaların geçmişi (liderlik tablosunun üst kısımları, son N sonuçları);
- Oyunların/sağlayıcıların meta verileri, bahis limitleri, statik dizinler;
- UX için katsayıların ve "hızlı" referansların beslemeleri (afişler, promosyon durumları).
Ancak önbellek asla para ve sonuçlar için gerçeğin kaynağı değildir. Gerçek - defter/cüzdan ve sağlayıcıdan onaylanmış sonuçlar.
2) Kırmızı çizgi: önbelleğe alamazsınız
Para kaydetme: Bakiyeyi borçlandırma/kredilendirme (kayıt işlemleri) - yalnızca işlemler ve idempotency ile/ledger veritabanı üzerinden.
Sağlayıcı onayından önce bahis/kazanma kararları.
Ödemeleri etkileyen KYC/AML ve uyumluluk bayrakları.
Sırlar/belirteçler (işlem belleğindeki önbellek geçerlidir, ancak paylaşılan önbellek değildir).
3) Temel önbellekleme desenleri
Cache-aside (lazy): Uygulama ilk önce önbelleğe bakar, eğer kaçırırsa, veritabanından okur ve önbelleğe koyar ('get? Miss? Load? Set'). Çok yönlü ve okunması güvenli.
Write-through: Veritabanına yazma önbellekten geçer; Anahtarın güncel olmasını sağlar, ancak kaydın gecikmesini artırır.
Write-behind (write-back): Önce önbelleğe, sonra eşzamansız olarak veritabanına yazma. Para/sonuç için yasaktır - düşerken kayıp riski.
Okuma: Önbelleğin kendisi veritabanından nasıl çıkılacağını bilir (proxy önbelleği, örneğin, modüller/sidecar ile Redis). Meta veriler için iyi.
Öneri: Okumalar için önbellek, yalnızca güvenli yerlerde yazma, geride yazma - asla para/oyun gerçekleri için.
4) Tutarlılık ve idempotency
Gerçeğin kaynağı: defter (yalnızca ekle), 'operation _ id've idempotent işleme ile işlemler.
Denge: Önbellekten okuruz, ancak herhangi bir tutarsızlık kritik eylemlerden önce veritabanından doğrulanır (para yatırma/çekme/büyük oran).
Engellilik: eğer ilgili bakiye/durum anahtarları başarılı bir şekilde ^ del/expire veritabanına yazılırsa.
Veri tekilleştirme: giden kutusu/gelen kutusu + webhook'lar/ödemeler için idempotency tuşları; Önbellek dedup'a katılmaz, sadece okumayı hızlandırır.
5) TTL, maluliyet ve "eskime hakkı"
Denge için kısa TTL: 1-5 saniye (veya arka plan yenilemeli soft-TTL).
İşlem durumları: Kısa TTL (5-30 s) olaylar tarafından aktif engelli ('deposit _ completed', 'setted').
Oyun geçmişi: TTL 1-10 dakika, 'new _ round' etkinliği nedeniyle sakatlık.
Meta veriler/dizinler: TTL 10-60 dakika, tükendiğinde ısınma.
Olay odaklı engellilik: Olay otobüsü (Kafka/PubSub) 'wallet _ updated', 'bet _ setted', 'bonus _ changed' yayınlıyor.
6) Fırtına Karşıtı Desenler (Miss Storm ve Dogon)
İstek birleştirme: bir iş parçacığı isteği veritabanına "yönlendirir", gerisi bekliyor (anahtar başına mutex).
Bayat-while-revalidate: "biraz modası geçmiş" verin, aynı anda arka planda güncelleyin.
TTL için Jitter: TTL'yi randomize edin (± %20), böylece anahtarlar aynı anda sona ermez.
Özlülükte geri dönüş: sürekli özlüyor/hatalarla - geçici negatif önbellek (aşağıya bakınız).
7) Negatif önbellekleme ve gri kardinal hatalar
"Bulunamadı" için (örneğin, henüz işlem durumu yoktur) - kısa bir negatif TTL 1-3 s.
Veritabanı/sağlayıcı hatalarını birkaç saniyeden fazla önbelleğe almayın - aksi takdirde kazayı düzeltin.
Gözlemlenebilirlik için kanarya tuşlarını girin: Negatif isabetlerin payındaki artış uyarı için bir nedendir.
8) Anahtar yapısı ve segmentasyonu
Именование: 'wallet: {userId}', 'txn: {txnId}: status', 'game: {provider}: {tableId}: last _ results', 'leaderboard: {tournamentId}: top100'.
Env/region/brand'e göre segmentler/ad alanları: 'prod: eu: wallet: {userId}' - kesişimleri ve bölgeler arası çöpleri hariç tutar.
Kardinaliteyi sınırlayın - özellikle liderler ve tarih için.
9) Kenarda, kümede ve bellekte önbellek
Kenar önbelleği (CDN/WAF): Yalnızca kişisel olmayan veriler (oyun meta verileri, genel liderler, medya) için. Sorgu parametreleri - beyaz liste; önbellek bozma koruması.
Redis/Memcached (küme): kişisel okumalar için temel; AOF/RDB anlık görüntülerini, çoğaltma ve kotaları ekleyin.
İşlem içi önbellek: sıcak dizinler için mikrosaniye erişimi; Devre dışı bırakma mekanizmaları (yayın, sürüm anahtarı) gereklidir.
10) Para Durumları: Güvenli Hızlandırmalar
Oyuncu dengesi
Oku: TTL 1-5 s ile önbellek kenara.
Kayıt: bakiyedeki işlem ^ del cache database; Kritik bir eylemde (çıktı/büyük bahis) - "DB'den yeniden kontrol edin".
Antigone: bilançonun iyimser kilitleme versiyonu.
Ödeme durumu
Senaryo: kullanıcı "update status" tuşuna basar.
Çözüm: önbellek kenara + negatif TTL "bekleyen "/" bilinmeyen "2-5 s; PSP Webhook Güncellemesi - Engellilik.
Bonuslar/vager
Toplamlar (ilerleme oranı %): önbellek 10-30 s; 'bet _ placed/settled' olayı nedeniyle sakatlık.
11) Oyun durumları: gerçeğin çarpıtılmadan yüksek hızlı bir cephe
Spin/bahis geçmişi
Son N olayları: kısıtlama ile önbellek listesi (örneğin, 100), TTL 1-10 dakika, 'round _ finished' olayı ile doldurma.
Sağlayıcıdan onay gelene kadar "kazan" gösteremezsiniz - ara durum "beklemede'dir.
Canlı oyunlar (WebSocket)
Hızlı bağlı istemciler için son iletilerin/tablo durumunun 1-3 saniye süreyle kısa süreli önbelleği.
Durum anahtarlarını 'tableId/market'e göre segmentlere ayırın.
Lider panoları
10-60 s için ön hesaplama + önbellek; Toplu güncellemeler için - toplu güncellemeler ve "pencerelerin" kısmi sakatlığı.
12) Riskler ve bunların nasıl kapatılacağı
Çift şarj/fantom kazanır: Önbellekten salt okunur; Tüm masraflar/krediler - DB ve idempotence aracılığıyla.
Eski veriler - oyuncu ile anlaşmazlık: Kısa TTL, ödeme öncesi "katı gerçeklik", şeffaf durumlar ("onay bekliyor").
Split-brain cache cluster: quorum/sentinel, zaman aşımları, geri yazmayı reddet.
Sıcak tuşlarda önbellek izdihamı: birleştirme, titreme, bayatlama-yeniden değerleme.
Önbellek enjeksiyonu/zehirlenmesi: güçlü anahtarlar, önbelleğe alınmış API yanıtları için imzalar/imzalar, kanarya kontrolleri.
Gizlilik/PII: kanal şifreleme (mTLS), kişisel veriler için kenarda önbellek yasağı, kısa TTL, çıkış temizleme.
13) Önbellek gözlemlenebilirliği
Katman başına metrikler:- Anahtar kategorisine göre Hit/Miss oranı; redis_ops/sec, gecikme süresi p95/p99, tahliyeler, memory_usage.
- Kanarya anahtarları: 'cache _ health: {segment}' - negatif önbellek payını ve güncelleme süresini kontrol eder.
- Günlükler: "gruplar halinde" özlüyor, bir segmentte sık 'del' = "gürültülü'bir hizmetin işareti.
- Yollar: anahtar etiketleriyle (PII olmadan) "önbellek get/set/del'i kapsar.
14) Mini mimari (referans)
1. Uygulama (API/WS) - Redis kümesi (TLS, auth).
2. Gerçeğin kaynağı: Cüzdan DB (defter), Oyun sonuçları deposu.
3. Etkinlik veri yolu: 'wallet _ updated', 'bet _ settled', 'promo _ changed'.
4. Devre Dışı: - 'del'/' set' hot key event subscriber.
5. Uç önbellek: yalnızca kamu kaynakları/liderlik kurulları.
6. Gözlenebilirlik: önbellek panoları, izdiham uyarıları, olumsuz isabetler.
15) TTL politikaları (örnek matris)
16) Örnek Sözde Kod (Güvenli Denge Okuma)
Python def get_balance (user_id):
key = f "cüzdan: {user _ id}"
bal = önbellek. get (anahtar)
Bal Hiçbiri değilse:
iade bal özledim: veritabanından almak ve kısa bir TTL + jitter bal = db ile koymak. get_wallet_balance (user_id)
önbellek. set (anahtar, bal, tl = randint (1,5))
dönüş bal
Def apply_transaction (op_id, user_id, delta):
Eğer db idempotency ile veritabanında atom girişi. exists_op (op_id):
Geri dönüş db. get_result (op_id)
res = db. apply_ledger (op_id, user_id, delta) # cache işlemi. Delete (f "cüzdan: {user _ id}") # disability return res17) Üretime hazırlık kontrol listesi
- Net sınırlama: veritabanındaki gerçek, önbellek - yalnızca okumalar için.
- Desenler: okumak için önbellek-kenara; Arkadan yazmak yasaktır.
- Olay sakatlığı: 'wallet _ updated', 'bet _ settled', 'promo _ changed'.
- Kısa TTL + jitter; Negatif önbellek ≤ 3 с.
- Anti-fırtına: birleşme, bayat-while-revalidate.
- Env/bölge/marka ile anahtar segmentasyonu; kardinalite sınırı.
- Gözlemlenebilirlik: hit/miss, tahliyeler, p95, izdiham/negatif sivri uyarıları.
- Yalnızca genel veriler için Edge önbellek; Kişisel - sadece Redis/TLS'de.
- Runbook: senkronize olmadığında ne yapmalı (zorla yenileme, segment önbelleğini geçici olarak devre dışı bırakma).
- Düzenli testler: sıcak anahtar yükü, izdiham egzersizleri.
Özgeçmiş Özeti
IGaming'deki önbellek bir okuma hızlandırıcısıdır, "para için ikinci bir veritabanı'değil. "Gerçeği defterde tutun, idempotans ve olay engelliliğini sağlayın, kısa TTL ve anti-fırtına mekaniği tutun, kenar önbelleği ve kişisel verileri ayırın, önbellek ölçümlerini izleyin. Böylece "kazanma yanılsaması", çift ücret ve düzenleyici problemler olmadan hızlı bir UX elde edersiniz.
