ذخیره معاملات و نتایج بازی: رویکردها و خطرات
1) چرا کش و جایی که شما واقعا به آن نیاز دارید
Cache یک ابزار برای کاهش تاخیر و بار در هسته است. در iGaming، این مهم است:- خواندن ترازنامه ها و وضعیت های معامله (درخواست های مکرر GET) ؛
- تاریخچه بازی/چرخش و aggregates (تاپس از رهبران، آخرین نتایج N) ؛
- ابرداده بازی ها/ارائه دهندگان, محدودیت شرط بندی, دایرکتوری ها استاتیک;
- تغذیه ضرایب و منابع «سریع» برای UX (آگهی ها، وضعیت های تبلیغاتی).
اما حافظه پنهان هرگز منبع حقیقت برای پول و نتایج نیست. Truth - دفتر کل/کیف پول و نتایج تأیید شده از ارائه دهنده.
2) خط قرمز: که شما نمی توانید ذخیره کنید
ضبط پول: بدهی/اعتبار تعادل (عملیات ضبط) - تنها از طریق پایگاه داده/لجر با معاملات و idempointency.
شرط/برنده تصمیم گیری قبل از تایید ارائه دهنده.
KYC/AML و پرچم های انطباق موثر بر پرداخت.
اسرار/نشانه ها (حافظه پنهان در حافظه پردازش معتبر است، اما حافظه پنهان مشترک نیست).
3) الگوهای ذخیره سازی عمومی
Cache-aside (lazy): برنامه برای اولین بار در حافظه پنهان به نظر می رسد، اگر آن را از دست بدهد، از پایگاه داده می خواند و آن را در حافظه پنهان قرار می دهد ('get → miss → load → set'). همه کاره و امن برای خواندن.
نوشتن از طریق: نوشتن به پایگاه داده می رود از طریق کش ؛ تضمین می کند که کلید به روز است، اما تاخیر رکورد را افزایش می دهد.
Write-behind (write-back): نوشتن اول در حافظه پنهان، سپس به صورت ناهمگام در پایگاه داده. ممنوع برای پول/نتایج - خطر از دست دادن در هنگام سقوط.
خواندن از طریق: حافظه پنهان خود را می داند که چگونه از پایگاه داده خارج شود (حافظه پنهان پروکسی، به عنوان مثال، Redis با ماژول ها/sidecar). مناسب برای متادیتا
توصیه: کنار برای خواندن, نوشتن از طریق تنها که در آن امن, نوشتن پشت - هرگز برای پول/حقایق بازی.
4) سازگاری و idemotency
منبع حقیقت: دفتر کل (فقط ضمیمه)، عملیات با 'operation _ id' و پردازش idempoint.
تعادل: ما از حافظه پنهان به عنوان خوانده شده, اما هر گونه اختلاف از پایگاه داده قبل از اقدامات مهم تایید (واریز/برداشت/نرخ بزرگ).
ناتوانی: اگر کلیدهای تعادل/وضعیت مربوطه با موفقیت در پایگاه داده → del/expire نوشته شوند.
Deduplication: صندوق خروجی/صندوق ورودی + کلید های idemotency برای webhooks/پرداخت ؛ حافظه پنهان در dedup شرکت نمی کند، آن را تنها سرعت خواندن.
5) TTL، ناتوانی و «حق منسوخ»
کوتاه TTL برای تعادل: 1-5 ثانیه (یا نرم TTL با تازه کردن پس زمینه).
وضعیت معاملات: TTL کوتاه (5-30 ثانیه) با ناتوانی فعال توسط حوادث («سپرده _ تکمیل شده»، «حل و فصل»).
تاریخچه بازی: TTL 1-10 دقیقه، ناتوانی به دلیل رویداد «new _ round».
متادیتا/دایرکتوری ها: TTL 10-60 دقیقه، گرم شدن در هنگام تخلیه.
ناتوانی رویداد محور: اتوبوس رویداد (Kafka/PubSub) منتشر «کیف پول به روز»، «شرط _ حل و فصل»، «پاداش _ تغییر» → مشترکین کلید حذف/به روز رسانی.
6) الگوهای ضد طوفان (خانم طوفان و دوگون)
درخواست ادغام: یک موضوع «منجر» درخواست به پایگاه داده، بقیه در حال انتظار (mutex در هر کلید).
Stale-while-revalidate: انتشار «کمی قدیمی»، به طور همزمان در پس زمینه به روز می شود.
Jitter for TTL: TTL تصادفی (± 20٪) بنابراین کلید در همان زمان منقضی نمی شود.
Back-off on misses: با اشتباهات/خطاهای ثابت - موقت منفی کش (پایین را ببینید).
7) منفی ذخیره سازی و خطاهای کاردینال خاکستری
برای «یافت نشد» (برای مثال، هنوز وضعیت تراکنش وجود ندارد) - یک TTL منفی کوتاه 1-3 s.
خطاهای پایگاه داده/ارائه دهنده را بیش از چند ثانیه ذخیره نکنید - در غیر این صورت حادثه را حل کنید.
کلیدهای قناری را برای مشاهده وارد کنید: افزایش سهم بازدیدهای منفی دلیلی برای هشدار است.
8) ساختار کلیدی و تقسیم بندی
Именование: 'wallet: {userId}', 'txn: {txnId}: status', 'game: {provider}: {tableId}: last _ results', 'leaderboard: {tournamentId}: top100'.
بخشها/فضاهای نام بر اساس env/region/brand: 'prod: eu: wallet: {userId}' - حذف تقاطعها و زبالههای بین منطقهای.
محدود کردن کاردینالیتی - به ویژه برای مدیران و تاریخ.
9) کش در لبه، در خوشه و در حافظه
حافظه پنهان لبه (CDN/WAF): فقط برای داده های غیر شخصی (ابرداده بازی، رهبران عمومی، رسانه ها). پارامترهای پرس و جو - لیست سفید ؛ حفاظت از حافظه پنهان.
Redis/Memcached (خوشه): پایه ای برای خواندن شخصی ؛ شامل AOF/RDB عکس های فوری، ماکت، و سهمیه.
در فرایند حافظه پنهان: دسترسی میکروثانیه برای دایرکتوری های داغ ؛ مکانیسم های غیر فعال کردن (پخش، کلید نسخه) مورد نیاز است.
10) موارد پول: شتاب امن
تعادل بازیکن
خواندن: کش کنار با TTL 1-5 s.
رکورد: معامله در تعادل → پایگاه داده حافظه پنهان ؛ در یک اقدام بحرانی (خروجی/شرط بزرگ) - «بررسی مجدد از DB».
Antigone: نسخه قفل خوش بینانه ترازنامه.
وضعیت پرداخت
سناریو: کاربر «وضعیت به روز رسانی» را فشار می دهد.
راه حل: cache-aside + TTL منفی به «pending «/» unknown «2-5 s ؛ PSP Webhook به روز رسانی → ناتوانی.
جوایز/جایزه
مصالح (پیشرفت در٪): کش 10-30 ثانیه ؛ معلولیت به دلیل رویداد 'bet _ posted/settled'.
11) موارد بازی: جبهه با سرعت بالا و بدون تحریف حقیقت
تاریخچه چرخش/شرط بندی
آخرین رویدادهای N: لیست کش با محدودیت (به عنوان مثال، 100)، TTL 1-10 دقیقه، دوباره پر کردن توسط رویداد 'round _ finished'.
شما نمی توانید نشان می دهد «برنده» تا زمانی که تایید از ارائه دهنده وجود دارد → وضعیت متوسط است «در انتظار».
زنده بازی ها (وب سوکت)
کش کوتاه مدت پیام های اخیر/وضعیت جدول برای 1-3 ثانیه برای مشتریان سریع متصل.
تقسیم کلیدهای حالت بر اساس «شناسه جدول/بازار».
مدیران
پیش محاسبه + کش برای 10-60 ثانیه ؛ برای به روز رسانی انبوه - به روز رسانی دسته ای و ناتوانی جزئی از «پنجره ها».
12) خطرات و نحوه بستن آنها
دو بار شارژ/فانتوم برنده: فقط خواندنی از کش ؛ تمام اتهامات/اعتبارات - از طریق DB و idempotence.
داده های قدیمی → اختلاف با بازیکن: TTL کوتاه، «واقعیت سخت» قبل از پرداخت، وضعیت شفاف («در انتظار تایید»).
خوشه حافظه پنهان تقسیم مغز: quorum/sentinel، timeouts، رد نوشتن پشت.
تجمع حافظه نهان روی کلیدهای داغ: ادغام، لرزش، stale-while-revalidate.
Cache injection/poisoning: strong keys, signature/signature for cached API responses, canary checks. تزریق حافظه پنهان/مسمومیت: کلیدهای قوی, امضا/امضا برای پاسخ های ذخیره شده API, canary checks.
حریم خصوصی/PII: رمزگذاری کانال (mTLS)، ممنوعیت کش در لبه برای اطلاعات شخصی، TTL کوتاه، تمیز کردن خروج.
13) قابلیت مشاهده کش
معیارها در هر لایه:- آمار/نسبت خانم های دسته کلیدی ؛ redis_ops/sec، تاخیر p95/p99، اخراج، memory_usage.
- کلید Canary: «cache _ health: {segment}» - سهم حافظه پنهان منفی و زمان به روز رسانی را بررسی می کند.
- سیاهههای مربوط: «در دسته»، مکرر «del» در یک بخش = نشانه ای از یک سرویس «پر سر و صدا».
- مسیرهای پیاده روی: دهانه «کش دریافت/تنظیم/دل» با برچسب های کلیدی (بدون PII).
14) مینی معماری (مرجع)
1. کاربرد (API/WS) → خوشه Redis (TLS، auth).
2. منبع حقیقت: Wallet DB (ledger)، فروشگاه نتایج بازی.
3. اتوبوس رویداد: «wallet _ updated»، «bet _ settled»، «promo _ changed».
4. غیرفعال: → 'del '/' set' مشترک رویداد کلید داغ.
5. کش لبه: فقط منابع عمومی/هیئت مدیره رهبری.
6. قابلیت مشاهده: داشبورد کش، هشدار stampede، بازدید منفی.
15) سیاست های TTL (ماتریس نمونه)
16) کد شبه نمونه (تعادل امن خوانده شده)
پایتون دف get_balance (user_id):
key = f «wallet: {user _ id}»
بال = کش دریافت (کلید)
اگر بال هیچ نیست:
bal miss را برگردانید: آن را از پایگاه داده بگیرید و آن را با یک TTL + jitter bal = db قرار دهید. get_wallet_balance (user_id)
کش. مجموعه (کلید, بال, ttl = randint (1,5))
بازگشت بال
دف apply_transaction (op_id، user_id، دلتا):
ورودی اتمی در پایگاه داده با idempotency اگر db. exists_op (op_id):
بازگشت DB get_result (op_id)
Res = db. apply_ledger (op_id، user_id، دلتا) # معامله کش. (f «wallet: {user _ id}») را حذف کنید17) چک لیست آمادگی تولید
- پاک کردن محدودیت: حقیقت در پایگاه داده، حافظه پنهان - فقط برای خواندن.
- الگوهای: کش کنار برای خواندن ؛ پشت نویسی ممنوع است.
- ناتوانی رویداد: «wallet _ updated»، «bet _ settled»، «promo _ changed».
- کوتاه TTL + لرزش ؛ منفی کش ≤ 3 с.
- ضد طوفان: coalescing، stale-while-revalidate.
- تقسیم بندی کلیدی توسط ENV/منطقه/نام تجاری ؛ محدودیت کاردینالیتی
- قابلیت مشاهده: ضربه/خانم، اخراج، p95، هشدار در stampede/منفی سنبله.
- کش لبه فقط برای داده های عمومی ؛ شخصی - فقط در Redis/TLS.
- Runbook: چه کاری باید انجام دهید وقتی که از همگام سازی (مجبور تازه کردن، به طور موقت غیر فعال کردن کش بخش).
- آزمون به طور منظم: بار کلید داغ، تمرینات stampede.
خلاصه رزومه
کش در iGaming یک شتاب دهنده خواندن است، نه یک پایگاه داده دوم برای پول. "حقیقت را در دفتر کل نگه دارید، از ناتوانی و ناتوانی رویداد اطمینان حاصل کنید، TTL کوتاه و مکانیک ضد طوفان را حفظ کنید، حافظه پنهان و اطلاعات شخصی را جدا کنید، معیارهای حافظه پنهان را نظارت کنید. بنابراین شما یک UX سریع بدون «توهم برنده شدن»، هزینه های دوگانه و مشکلات قانونی دریافت می کنید.
