جریانها و رویدادهای WebSocket
TL ؛ دکتر متخصص
جریان کار = کانال مورد اعتماد (WSS) + آفست خلاصه + رویدادهای idempotent + محدودیت های سخت و فشار به عقب. انجام: احراز هویت JWT، مجوز برای موضوعات، ضربان قلب، seq/offset + resume-token، حداقل یک بار + deadup. برای مقیاس - sharding کاربر/مستاجر، مسیریابی چسبنده و صف (جریانهای کافکا/NATS/Redis) به عنوان منبع حقیقت.
1) موارد کسب و کار iGaming (آنچه ما واقعا جریان)
تعادل/محدودیت: تغییرات لحظه ای در تعادل، محدودیت RG، قفل.
شرط/دور/نتایج: تایید، وضعیت، محاسبه برنده.
مسابقات/مدیران: موقعیت، تایمر، رویدادهای جایزه.
پرداخت ها: وضعیت پرداخت/بازپرداخت، پرچم های KYC/AML - مانند اعلان ها (و انتقاد در REST + webhooks باقی می ماند).
رویدادهای خدمات: پیام های چت، آگهی های فشار، وضعیت جلسه، تعمیر و نگهداری.
2) پروتکل و اتصال
فقط WSS (TLS 1) 2+/1. 3). حداکثر 1 اتصال فعال در هر دستگاه/جلسه پیش فرض.
پینگ/پنگ: مشتری «پینگ» را هر 20-30 ثانیه ارسال می کند، زمان پاسخگویی 10 ثانیه است. سرور اتصال را در 3 زمان متوالی قطع می کند.
فشرده سازی: 'permessage-deflate'، محدودیت اندازه قاب (به عنوان مثال، ≤ 64 کیلوبایت).
فرمت بارگیری: JSON برای خارجی، Protobuf/MsgPack برای داخلی/تلفن همراه.
3) احراز هویت و مجوز
دست دادن JWT در پرس و جو/هدر ('Sec-WebSocket-Protocol '/' Authorization')، نشانه TTL کوتاه (≤ 15 دقیقه)، تازه کردن توسط خارج از باند (REST).
ادعاهای دامنه مستاجر: «sub»، «tenant»، «scopes»، «risk _ flags».
ACL ها به موضوعات/کانال ها: اشتراک فقط به موضوعات مجاز (به عنوان مثال: 'کاربر: {id}'، 'مسابقات: {id}'، 'بازی: {جدول}').
ایجاد مجدد اتصال زمانی که توکن منقضی می شود: «پنجره نرم» 60 ثانیه.
4) مدل اشتراک
مشتری پس از اتصال دستورات را ارسال می کند:json
{ "op":"subscribe", "topics":["user:123", "tournament:456"], "resume_from":"1748852201:987654" }
{ "op":"unsubscribe", "topics":["tournament:456"] }
'resume _ from' - offset (نگاه کنید به § 5) اگر مشتری دوباره متصل شود.
سرور با ack/nack پاسخ می دهد، ACL های شکست خورده در «nack» با «reason» هستند.
5) تضمین تحویل و خلاصه
هدف: حداقل یک بار در هر کانال + idempotency در مشتری.
هر رویداد دارای یک «seq» یکنواخت با «قسمت» (معمولا کاربر/اتاق) و یک «event _ id» جهانی برای deduplication است.
با اتصال مجدد، مشتری «resume _ from» = آخرین «seq» (یا «offset» کارگزار) را ارسال می کند. سرور رویدادهای از دست رفته را از «منبع حقیقت» (جریانهای کافکا/NATS/Redis) بارگیری می کند.
اگر تاخیر بیش از نگهداری (به عنوان مثال، 24 ساعت)، سرور یک عکس فوری از وضعیت و یک «seq» جدید ارسال می کند.
- Store 'last _ seq '/' event _ id' in ذخیره سازی با دوام (IndexedDB/Keychain).
- Dedup توسط 'event _ id'، پرش حوادث با 'seq ≤ last_seq'، تشخیص سوراخ (شکاف) → خودکار' resync 'درخواست عکس فوری.
6) طرح پیام (پاکت)
json
{
"ts": "2025-11-03T12:34:56. 789Z",
"topic": "user:123",
"seq": "1748852201:987654", // partition:offset
"event_id": "01HF..", // UUID/KSUID
"type": "balance. updated",
"data": { "currency":"EUR", "delta"--5. 00, "balance":125. 37 },
"trace_id": "4e3f.., "//for correlation
"signature": "base64 (hmac (...)) "//optional for partners
}
«نوع» - طبقه بندی دامنه (نگاه کنید به فرهنگ لغت رویداد).
PII/PCI - حذف/ماسک در سطح دروازه.
7) فشار پشتی، سهمیه و حفاظت در برابر مشتریان «گران»
سرور → مشتری: ارسال هر اتصال صف با پنجره کشویی. کامل - بازنشانی اشتراک به موضوعات «پر سر و صدا» و یا قطع با کد «1013 »/« سیاست _ نقض».
Client → Server: محدودیت در «subscribe/unsubscribe» (به عنوان مثال، ≤ 10/ثانیه)، محدودیت لیست موضوع (≤ 50)، حداقل فاصله بازپرداخت.
محدودیت نرخ توسط IP/مستاجر/کلید. ناهنجاری → مسدود کردن موقت.
اولویت: رویدادهای حیاتی (تعادل، محدودیت RG) - صف اولویت.
8) حفاظت و ایمنی
مشخصات WAF/bot در نقطه پایانی دست دادن، لیست مجاز منبع.
mTLS بین دروازه لبه و گره های جریان.
حفاظت از DoS: کوکی SYN در L4، محدودیت در تعداد WS باز/نگه داشتن فاصله زنده.
ضد پخش: «برچسب زمان» در امضای اختیاری بار (برای شرکا) با یک پنجره معتبر 5 دقیقه.
جداسازی مستاجر: تقسیم فیزیکی/منطقی، کلید/نشانه در هر مستاجر.
9) معماری حمل و نقل
دروازه (لبه): ترمینال TLS، authN/Z، سهمیه، مسیریابی در هر حزب.
گره های جریان: کارگران بدون حالت با مسیریابی چسبنده توسط 'هش (user_id)٪ N'.
کارگزار رویداد: Kafka/NATS/Redis Streams - منبع حقیقت و بافر پخش.
خدمات دولتی: عکس های فوری را ذخیره می کند (تعادل، موقعیت در مسابقات).
چند منطقه ای: دارایی-دارایی ؛ GSLB توسط نزدیکترین منطقه ؛ صفحه اصلی منطقه در ورود به سیستم ثابت است ؛ با یک feiler - خلاصه «سرد» از یک منطقه دیگر.
10) نظم، انسجام، بی نظمی
سفارش در داخل حزب (کاربر/اتاق) تضمین شده است، نه در سطح جهانی.
ثبات: رویداد ممکن است قبل از پاسخ REST باشد ؛ UX باید بتواند با یک حالت متوسط (رابط کاربری خوش بینانه + آشتی) زندگی کند.
Idempotence: پردازش مجدد «event _ id» وضعیت مشتری را تغییر نمی دهد.
11) خطاها، اتصال مجدد و طوفان
کدهای بسته شدن: «1000» (عادی)، «1008» (سیاست)، «1011» (داخلی)، «1013» (اضافه بار سرور).
عقب نشینی مشتری + jitter: 1s، 2s، 4s... حداکثر 30 ثانیه
در طول اتصال مجدد دسته جمعی («گله رعد آسا») - سرور پاسخ های «retry _ after» و «خاکستری» را با یک اعلان برای استفاده از SSE fallback برای فقط خواندنی می دهد.
12) نقدی و عکس های فوری
هر اشتراک می تواند با یک عکس فوری از وضعیت فعلی شروع شود، سپس یک جریان از رویدادهای مختلف.
Data _ version schema versioning and compatibility (پسوند فیلد مشتریان را خراب نمی کند).
13) قابلیت مشاهده و SLO
معیارها:- اتصالات: فعال، تاسیس/ثانیه، توزیع توسط مستاجر/منطقه.
- تحویل: تاخیر p50/p95 از کارگزار به مشتری، نرخ افت، نرخ ارسال مجدد.
- قابلیت اطمینان: سهم رزومه موفق بدون یک عکس فوری، آشکارساز شکاف.
- خطاها: 4xx/5xx در دست دادن، کدهای بسته شدن، بازدید محدود.
- بار: RPS از دستورات مشترک، اندازه صف، CPU/NET.
- ایجاد WS p95 ≤ 500 ms (در منطقه).
- رویداد تأخیر پایان به پایان p95 ≤ 300 ms (پارتیشن کاربر).
- موفقیت رزومه ≥ 99٪، از دست دادن پیام = 0 (по حداقل یک بار).
- آپتایم جریان نقطه پایانی ≥ 99. 95%.
14) طرح و مدیریت نسخه
فرهنگ لغت رویدادها با صاحبان، نمونه ها و معانی.
تکامل «نرم»: فقط اضافه کردن زمینه های اختیاری ؛ حذف - پس از دوره «@ deprecated».
تست قرارداد در برابر SDK های مشتری، خطوط در JSON Schema/Protobuf.
15) playbooks حادثه (جاسازی در playbook مشترک شما)
رشد تأخیر: احزاب را به گره های پشتیبان تغییر دهید، اندازه دسته را در کارگزار افزایش دهید، اولویت بندی رویدادهای حیاتی را فعال کنید.
طوفان مجدد را فعال کنید: «retry _ after» را فعال کنید، به طور موقت محدودیت های دست دادن را افزایش دهید، SSE را فعال کنید.
نشت توکن: چرخش JWKS، ابطال توکن های آسیب دیده، مجبور به اتصال مجدد با اتصال مجدد.
از دست دادن حزب کارگزار: انتقال به حالت عکس فوری، پخش پس از بازیابی.
16) API مینی مشخصات (ساده شده)
دست دادن (HTTP GET → WS):
GET /ws? tenant=acme&client=web
Headers:
Authorization: Bearer <JWT>
X-Trace-Id: <uuid>
دستورات مشتری:
json
{ "op":"subscribe", "topics":["user:123"], "resume_from":"1748852201:42" }
{ "op":"unsubscribe", "topics":["user:123"] }
{ "op":"ping", "ts":"2025-11-03T12:34:56Z" }
پاسخ های سرور:
json
{ "op":"ack", "id":"subscribe:user:123" }
{ "op":"event", "topic":"user:123", "seq":"1748852201:43", "type":"balance. updated", "data":{...} }
{ "op":"snapshot", "topic":"user:123", "seq":"1748852201:42", "state":{...} }
{ "op":"error", "code":"acl_denied", "reason":"no access to topic tournament:456" }
{ "op":"pong", "ts":"..." }
17) چک لیست UAT
- خلاصه ای از افست پس از 1/10/60 دقیقه از خرابی مشتری.
- Dedup: تحویل مجدد همان «event _ id» حالت را تغییر نمی دهد.
- آشکارساز شکاف → خودکار «عکس فوری» و تراز.
- سهمیه ها و فشار پشتی: مشتری بارگیری شده قطع ارتباط را دریافت می کند.
- Multiregion: منطقه failover در حالی که حفظ افست.
- امنیت: توکن rocker منقضی شده توسط JWT، تلاش برای اشتراک در خارج از ACL.
- تعادل RG/event قبل/بعد از REST - UI به درستی «بخیه» می آید.
18) خطاهای مکرر
بدون «SEQ/جبران» و تجدید - از دست دادن حوادث و اعتماد.
مخلوط کردن دستورات پرداخت بحرانی در جهش های WS - از REST استفاده کنید.
کمبود فشار پشتی/سهمیه - اتصالات «معلق» و بهمن حافظه.
نظم جهانی گران و غیر ضروری است ؛ نظم در حزب کافی است.
ورود PII به رویدادها - نقض حریم خصوصی و PCI/GDPR.
فقدان یک فرهنگ لغت از حوادث و نسخه - مشتریان شکستن.
خلاصه
جریان های WebSocket UX و سیگنال های عملیاتی را فعال می کنند اگر آنها به عنوان یک کانال خلاصه، محافظت شده و محدود ساخته شوند: WSS + mTLS/JWT، ACL در موضوعات، seq/offset + resume، حداقل یک بار با deduplication، backpressure/quotas، کارگزار به عنوان منبع حقیقت، مشاهده و SLO. بنابراین جریان برای کاربر سریع و قابل کنترل برای پلت فرم باقی می ماند - بدون مصالحه در امنیت و پول.