تدفقات وأحداث WebSocket
TL; د
تدفق العمل = قناة موثوقة (WSS) + تعويضات ملخصة + أحداث خفية + حدود صارمة وضغط خلفي. افعل: مصادقة JWT، الإذن بالموضوعات، دقات القلب، seq/offest + resume-token، مرة واحدة على الأقل + deadup. بالنسبة للمقياس - شحن المستخدم/المستأجر، والتوجيه اللزج، والانتظار (كافكا/ناتس/ريديس ستريمز) كمصدر للحقيقة.
1) حالات عمل iGaming (ما نقوم ببثه حقًا)
التوازن/الحدود: التغيرات الفورية في التوازن، حدود النمو الحقيقي، الأقفال.
الرهانات/الجولات/النتائج: التأكيد والحالة وحساب المكاسب.
البطولات/لوحات الصدارة: المناصب، المؤقتات، أحداث الجوائز.
المدفوعات: حالة الدفع/الاسترداد، أعلام KYC/AML - مثل الإشعارات (ويبقى النقد في خطابات الويب REST +).
أحداث الخدمة: رسائل الدردشة، لافتات الدفع، حالات الجلسة، الصيانة.
2) البروتوكول والربط
WSS فقط (TLS 1. 2+/1. 3). أقصى اتصال نشط 1 لكل جهاز/جلسة افتراضية.
Ping/Pong: يرسل العميل «ping» كل 20-30 ثانية، مهلة الاستجابة 10 ثوانٍ. يسقط الخادم الاتصال عند 3 فترات زمنية متتالية.
الضغط: «permessage-demlate»، حد حجم الإطار (على سبيل المثال، ≤ 64 كيلوبايت).
تنسيق الحمولة: JSON للخارجية، Protobuf/MsgPack للداخلية/المتنقلة.
3) التوثيق والإذن
مصافحة JWT في الاستعلام/الرأس ("Sec-WebSocket-Protocol'/" الترخيص")، TTL رمز قصير (≤ 15 دقيقة)، التحديث عن طريق خارج النطاق (REST).
المطالبات ذات النطاق المستأجر: "sub"، "المستأجر"، "scopes"، "risk _ flags'.
الرباط الصليبي الأمامي للمواضيع/القنوات: الاشتراك فقط في «المواضيع» المسموح بها (على سبيل المثال: «المستخدم: {معرف}»، «البطولة: {معرف}»، «اللعبة: {جدول}»).
إعادة إنشاء الاتصال عند انتهاء صلاحية الرمز: «نافذة ناعمة» 60 ثانية.
4) نموذج الاشتراك
يرسل العميل أوامر بعد الاتصال:json
{ "op":"subscribe", "topics":["user:123", "tournament:456"], "resume_from":"1748852201:987654" }
{ "op":"unsubscribe", "topics":["tournament:456"] }
'الاستئناف _ من' - التعويض (انظر الفقرة 5) إذا أعاد العميل الاتصال.
يستجيب الخادم بـ ack/nack، ACLs الفاشلة في «nack» مع «reason».
5) ضمانات التسليم وموجز
الغرض: مرة واحدة على الأقل لكل قناة + الخصوصية في العميل.
يحتوي كل حدث على «seq» رتيب في «الجزء» (عادة ما يكون المستخدم/الغرفة) و «حدث _ معرف» عالمي للتفريغ.
مع إعادة الاتصال، يرسل العميل «سيرة ذاتية _ من» = آخر «seq» مؤكدة (أو «تعويض» السمسار). أحمال الخادم فاتتها الأحداث من «مصدر الحقيقة» (كافكا/ناتس/ريديس ستريمز).
إذا تجاوز التأخر الاحتفاظ (على سبيل المثال، 24 ساعة)، يرسل الخادم «لقطة» للحالة و «seq» جديدة.
- قم بتخزين 'last' _ seq '/' event _ id' في تخزين متين (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 »/« انتهاك السياسة _».
خادم → العميل: حدود «الاشتراك/إلغاء الاشتراك» (على سبيل المثال، ≤ 10/ثانية)، حد قائمة المواضيع (≤ 50)، الحد الأدنى لفترة إعادة الاشتراك.
حدود الأسعار حسب IP/المستأجر/المفتاح. حالات شاذة → منع مؤقت.
الأولوية: الأحداث الحيوية (التوازن، حدود النمو الحقيقي) - قائمة الانتظار ذات الأولوية.
8) الحماية والسلامة
ملف تعريف WAF/bot على نقطة نهاية المصافحة، قائمة Origin المسموح بها.
mTLS بين بوابة الحافة وعقد التيار.
حماية DoS: ملفات تعريف الارتباط SYN على L4، تحد من عدد فترات WS/keep-alive.
مضاد إعادة التشغيل: «طابع زمني» في توقيع حمولة اختياري (للشركاء) مع نافذة صالحة تبلغ 5 دقائق.
عزل المستأجر: الشحن المادي/المنطقي، المفاتيح/الرموز لكل مستأجر.
9) بنية النقل
البوابة (الحافة): TLS terminal، authN/Z، الحصص، التوجيه لكل طرف.
عقد التيار: عمال عديمو الجنسية مع توجيه لزج بواسطة «هاش (user_id)٪ N».
وسيط الحدث: Kafka/NATS/Redis Streams - مصدر الحقيقة وحاجز إعادة التشغيل.
خدمة الدولة: تخزن اللقطات (التوازن، المراكز في البطولة).
تعدد المناطق: الأصول والأصول ؛ GSLB حسب أقرب منطقة ؛ وثبتت المنطقة الأصلية عند الدخول ؛ مع feiler - ملخص «بارد» من منطقة أخرى.
10) الترتيب والاتساق والخصوصية
الطلب مضمون داخل الحفلة (المستخدم/الغرفة)، وليس على مستوى العالم.
الاتساق: قد يأتي الحدث قبل رد REST ؛ يجب أن تكون UX قادرة على العيش مع حالة وسيطة (مصالحة واجهة المستخدم + متفائلة).
الخصوصية: إعادة المعالجة 'event _ id' لا تغير حالة العميل.
11) الأخطاء وإعادة الاتصال والعواصف
رموز الإغلاق: «1000» (عادي)، «1008» (بوليصة)، «1011» (داخلي)، «1013» (تحميل زائد للخادم).
التراجع الأسي للعميل + jitter: 1s، 2s، 4s... 30 كحد أقصى.
أثناء إعادة الاتصال الجماعي ("القطيع المدوي") - يعطي الخادم ردود "إعادة تجربة" بعد "و" رمادي "مع موجه لاستخدام احتياطي SSE للقراءة فقط.
12) النقد واللقطات
يمكن أن يبدأ كل اشتراك بلقطة من الحالة الحالية، ثم سلسلة من أحداث diff.
Data _ version schema versioning and complability (الامتداد الميداني لا يكسر العملاء).
13) إمكانية الرصد و SLO
المقاييس:- الوصلات: نشطة، ثابتة/ثانية، توزيع حسب المستأجر/المنطقة.
- التسليم: p50/p95 التأخير من سمسار إلى عميل، معدل الانخفاض، معدل إعادة الإرجاع.
- الموثوقية: حصة السير الذاتية الناجحة بدون لقطة، كاشف الثغرات.
- الأخطاء: 4xx/5xx عند المصافحة، إغلاق الرموز، الحد من الضربات.
- الحمل: RPS لأوامر «الاشتراك»، حجم قائمة الانتظار، CPU/NET.
- إنشاء WS p95 ≤ 500 mm (داخل المنطقة).
- حدث زمن الانتقال من طرف إلى طرف p95 ≤ 300 ms (تقسيم المستخدم).
- استأنف النجاح ≥ 99٪، وفقدان الرسالة = 0 (по مرة واحدة على الأقل).
- Uptime Stream Endpoint ≥ 99. 95%.
14) المخطط وإدارة النسخ
قاموس الأحداث مع المالكين والأمثلة والدلالات.
التطور «الناعم»: إضافة مجالات اختيارية فقط ؛ الحذف - بعد فترة «@ decrecated».
اختبارات العقد ضد العملاء SDKs، بطانات على JSON Schema/Protobuf.
15) كتب اللعب الخاصة بالحوادث (مضمنة في كتاب اللعب المشترك)
نمو زمن الكمون: تحويل الأطراف إلى عقد احتياطية، وزيادة حجم الدفعة في الوسيط، وتمكين تحديد أولويات الأحداث الحيوية.
إعادة الاتصال العاصفة: تنشيط «إعادة التجربة - بعد»، ورفع حدود المصافحة مؤقتًا، وتمكين SSE الاحتياطي.
تسريب الرمز: تناوب JWKS، وإلغاء الرموز المتأثرة، وإعادة الاتصال القسري مع إعادة التوصيل.
فقدان طرف الوسيط: التحويل إلى وضع اللقطة، إعادة التشغيل بعد الاسترداد.
16) مواصفات مصغرة لواجهة برمجة التطبيقات (مبسطة)
المصافحة (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» لا يغير الحالة.
- كاشف الثغرات → «لقطة» أوتوماتيكية ومحاذاة.
- الحصص والضغط الخلفي: يتلقى العميل المحمل فصل السياسة.
- منطقة متعددة: منطقة فاشلة مع الحفاظ على التعويض.
- الأمان: انتهت صلاحية Token rocker بواسطة JWT، في محاولة للاشتراك خارج ACL.
- يأتي توازن RG/الحدث قبل/بعد REST - واجهة المستخدم بشكل صحيح «غرز».
18) الأخطاء المتكررة
لا "seq/offest' والتجديد - تفقد الأحداث والثقة.
خلط أوامر الدفع الحرجة في طفرات WS - استخدم REST.
نقص الضغط/الحصص - اتصالات «معلقة» وسيل من الذاكرة.
النظام العالمي مكلف وغير ضروري ؛ ما يكفي من النظام في الحفلة.
تسجيل PII في الأحداث - انتهاكات الخصوصية و PCI/GDPR.
عدم وجود قاموس للأحداث والتحرير - ينهار العملاء.
موجز
تعطي تدفقات WebSocket إشارات UX وتشغيلية تفاعلية إذا تم بناؤها كقناة ملخصة ومحمية ومحدودة: WSS + mTLS/JWT، ACL حول الموضوعات، seq/offest + سيرة ذاتية، مرة واحدة على الأقل مع التثبيت، الضغط الخلفي/الحصص، الوسيط كمصدر الحقيقة وقابلية الملاحظة و SLO. لذلك تظل التدفقات سريعة للمستخدم ويمكن التحكم فيها للمنصة - دون تنازلات بشأن الأمان والمال.