WebSocket axınlar və hadisələr
TL; DR
İş axını = etibarlı kanal (WSS) + yekunlaşdırıla bilən ofset + idempotent hadisələr + ciddi limitlər və backpressure. Edin: JWT autentifikasiyası, topik avtorizasiyası, heartbeats, seq/offset + resume-token, at-least-once + dedup. Ölçü üçün - user/tenant, sticky-routing və xətt (Kafka/NATS/Redis Streams) həqiqət mənbəyi kimi.
1) iGaming Business Cases (həqiqətən axın)
Balans/limitlər: ani balans dəyişikliyi, RG limitləri, bloklama.
Dərəcələr/raundlar/nəticələr: təsdiq, status, uduşların hesablanması.
Turnirlər/liderlər: mövqelər, taymerlər, mükafat tədbirləri.
Ödənişlər: payout/refund statusu, KYC/AML bayraqları - bildirişlər kimi (və tənqid REST + vebhuk qalır).
Xidmət tədbirləri: chat mesajları, push-bannerlər, sessiya statusları, maintenance.
2) Protokol və əlaqə
Yalnız WSS (TLS 1. 2+/1. 3). standart cihaz/seans üçün maksimum 1 aktiv qoşulma.
Ping/Pong: Müştəri hər 20-30 saniyədə bir «ping» göndərir, cavab müddəti 10 san. Server ardıcıl 3 taymautda əlaqəni sıfırlayır.
Sıxılma: 'permessage-deflate', çərçivə ölçüsü üçün limit (məsələn, ≤ 64 KB).
Faydalı yük formatı: Xarici üçün JSON, daxili/mobil üçün Protobuf/MsgPack.
3) Autentifikasiya və avtorizasiya
query/header JWT ilə Hendshake ('Sec-WebSocket-Protocol '/' Authorization'), TTL qısa (≤ 15 dəq), out-of-band (REST) refresh.
Tenant-scoped claims: `sub`, `tenant`, `scopes`, `risk_flags`.
Topik/kanallara ACL: Yalnız icazə verilən 'topic' abunəsi (məsələn: 'user: {id}', 'tournament: {id}', 'game: {table}').
Token bitdikdə birləşmənin yenidən qurulması: «yumşaq pəncərə» 60 s.
4) Abunə modeli
connect sonra müştəri komandaları göndərir:json
{ "op":"subscribe", "topics":["user:123", "tournament:456"], "resume_from":"1748852201:987654" }
{ "op":"unsubscribe", "topics":["tournament:456"] }
'resume _ from' - müştəri əlaqəni bərpa edərsə, ofset (bax § 5).
Server ack/nack-ə cavab verir, ACL-dən əvvəl - 'nack' s 'reason'.
5) Çatdırılma və ümumiləşdirmə zəmanətləri
Məqsəd: at-least-once + müştərinin idempotentliyi.
Hər bir hadisə «partiya» (adətən user/room) çərçivəsində monoton 'seq' və dedup üçün qlobal 'event _ id' var.
Re-connect ilə müştəri 'resume _ from' = son təsdiqlənmiş 'seq' (və ya 'offset' broker) ötürür. Server «həqiqət mənbəyi» (Kafka/NATS/Redis Streams) buraxılmış hadisələri yükləyir.
Əgər laq retentiondan (məsələn, 24 saat) çox olarsa, server 'snapshot' hallarını və yeni 'seq' hallarını göndərir.
- durable-saxlama (IndexedDB/Keychain) 'last _ seq '/' event _ id' saxlayın.
- 'event _ id' dedupu, 'seq ≤ last_seq' ilə hadisələri qaçırmaq, dəlikləri aşkar etmək (gap) → auto' resync 'snapshot sorğu.
6) Mesaj sxemi (envelope)
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
}
'type' - domen taksonomiyası (hadisə lüğətinə baxın).
PII/PCI - şlüz səviyyəsində istisna/maskalamaq.
7) Backpressure, kvotalar və «bahalı» müştərilərə qarşı qorunma
Server → Client: «sürüşmə pəncərəsi» ilə per-connection send-queue. Həddindən artıq - «səs-küylü» topiklərə və ya '1013 '/' policy _ violation' kodu ilə disconnect abunələrinin sıfırlanması.
Client → Server: 'subscribe/unsubscribe' limitləri (məsələn, ≤ 10/san), top siyahısının məhdudlaşdırılması (≤ 50), minimum təkrar abunə intervalı.
IP/tenant/açar ilə Rate limits. Anomaliyalar → müvəqqəti kilidləmə.
Priority: həyati hadisələr (balans, RG-limitləri) - prioritet növbə.
8) Mühafizə və təhlükəsizlik
Handshake end point WAF/bot profil, Origin icazə siyahısı.
edge şlyuz və axın düyünləri arasında mTLS.
DoS-qorunması: L4-də SYN-cookies, açıq WS sayı limitləri/keep-alive interval.
Anti-replay: 'timestamp' 5 dəqiqə icazə verilən pəncərə ilə isteğe bağlı yükləmə imzasında (tərəfdaşlar üçün).
Kirayəçilərin izolyasiyası: fiziki/məntiqi parçalanma, açarlar/per-tenant tokenlər.
9) Nəqliyyat arxitekturası
Şluz (edge): TLS terminiti, authN/Z, kvotalar, partiyaya marşrut.
Stream-düyünlər: stateless-workers sticky-routing ilə 'hash (user_id)% N'.
Hadisə brokeri: Kafka/NATS/Redis Streams - həqiqət mənbəyi və reple-bufer.
State-service: snapshot saxlayır (balance, turnirdə mövqe).
Multiregion: aktiv-aktiv; GSLB ən yaxın bölgə; home-region login ilə sabitlənir; feilover - başqa bir bölgədən «soyuq» rezyum.
10) Nizam, uyğunluq, idempotentlik
Nizamlılıq qlobal deyil, partiya daxilində (user/room) təmin edilir.
Tutarlılıq: hadisə REST cavabından əvvəl gələ bilər; UX aralıq vəziyyətlə (optimist UI + reconciliation) yaşamağı bacarmalıdır.
İdempotentlik: 'event _ id' təkrar emalı müştərinin vəziyyətini dəyişmir.
11) Səhvlər, reconnect və «fırtına»
Bağlanış kodları: '1000' (normal), '1008' (policy), '1011' (internal), '1013' (server overload).
Müştəri eksponent backoff + jitter: 1s, 2s, 4s... max 30s.
Kütləvi rekonnektlər zamanı («thundering herd») - server 'retry _ after' və «boz» cavabları read-only üçün SSE fallback istifadə etmək üçün bir ipucu ilə verir.
12) Cache və Snapshot
Hər bir abunə mövcud vəziyyətin snapshot ilə başlaya bilər, sonra - diff hadisələrinin axını.
'data _ version' sxeminin versiyası və uyğunluğu (sahələrin genişləndirilməsi müştərilərə zərər vermir).
13) Müşahidə və SLO
Metriklər:- Qoşulmalar: aktiv, quraşdırılmış/saniyə, icarəçilər/regionlar üzrə paylama.
- Çatdırılma: p50/p95 brokerdən müştəriyə qədər gecikmə, drop-rate, resend-rate.
- Etibarlılıq: snapshot olmadan uğurlu nəticələr payı, gap detektor.
- Səhvlər: 4xx/5xx handshake, bağlama kodları, limit hitlər.
- Yük: RPS əmrləri 'subscribe', sıra ölçüsü, CPU/NET.
- Quraşdırma WS p95 ≤ 500 ms (region daxilində).
- End-to-end latency hadisə p95 ≤ 300 ms (user-partition).
- Resume success ≥ 99%, message loss = 0 (по at-least-once).
- Uptime axın end point ≥ 99. 95%.
14) Sxemlərin və versiyaların idarə edilməsi
Sahibləri, nümunələri və semantikası ilə hadisələr lüğəti.
«Yumşaq» təkamül: yalnız isteğe bağlı sahələrin əlavə edilməsi; silinməsi - '@deprecated' dövründən sonra.
müştəri SDK qarşı müqavilə testləri, JSON Schema/Protobuf linters.
15) Hadisə playbook (ümumi playbook daxil)
Latency artımı: hissələri ehtiyat qovşaqlara keçin, brokerdə batch ölçüsünü artırın, həyati hadisələrin prioritetləşdirilməsini daxil edin.
Fırtına reconnects: aktivləşdirmək 'retry _ after', müvəqqəti olaraq handshake limitləri qaldırmaq, SSE follbek daxil.
Tokenlərin sızması: JWKS rotasiyası, təsirlənmiş tokenlərin geri çağırılması, re-auth ilə məcburi reconnect.
Broker partiyasını itirmək: bərpa edildikdən sonra snapshot rejiminə keçid.
16) Mini API spesifikasiyası (sadələşdirilmiş)
Handshake (HTTP GET → WS):
GET /ws? tenant=acme&client=web
Headers:
Authorization: Bearer <JWT>
X-Trace-Id: <uuid>
Müştəri komandaları:
json
{ "op":"subscribe", "topics":["user:123"], "resume_from":"1748852201:42" }
{ "op":"unsubscribe", "topics":["user:123"] }
{ "op":"ping", "ts":"2025-11-03T12:34:56Z" }
Server cavabları:
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 çek siyahısı
- Müştərinin 1/10/60 dəqiqəlik endirimindən sonra offset rezyumu.
- Dedup: eyni 'event _ id' yenidən çatdırılması vəziyyəti dəyişdirmir.
- Gap detektor → avtomatik 'snapshot' və hizalama.
- Kvotalar və backpressure: yüklü müştəri policy-disconnect alır.
- Multi region: ofset saxlama ilə bölgənin failover.
- Təhlükəsizlik: JWT bitmiş rocker token, ACL xaricində abunə cəhd.
- RG/balans hadisələri REST-dən əvvəl/sonra gəlir - UI düzgün «tikir».
18) Tez-tez səhvlər
No 'seq/offset' və yeniləmə - hadisələri və inamı itiririk.
WS mutasiyalarında kritik ödəmə əmrlərini qarışdırın - REST istifadə edin.
Backpressure/kvotaların olmaması - «asılmış» bağlantılar və yaddaş uçqunu.
Qlobal nizam - bahalı və lazım deyil; partiyada kifayət qədər nizam var.
Hadisələrdə PII loqosu - gizlilik pozuntuları və PCI/GDPR.
Hadisə lüğətinin və versiyanın olmaması - müştərilər qırılır.
Xülasə
WebSocket axınları reaktiv UX və əməliyyat siqnalları verir, əgər onlar ümumiləşdirilə bilən, qorunan və məhdud kanal kimi qurulur: WSS + mTLS/JWT, ACL top, seq/offset + resume, at-least-once, backpressure/kvotalar, həqiqət mənbəyi kimi broker, müşahidə və SLO. Beləliklə, axınlar istifadəçi üçün sürətli və platforma üçün idarə oluna bilər - təhlükəsizlik və pul güzəştləri olmadan.