WebSocket akymlar we wakalar
TL; DR
Iş akymy = ygtybarly kanal (WSS) + jemlenýän ofsetler + demokratik wakalar + berk çäklendirmeler we backpressure. Ýerine ýetiriň: JWT-tassyklama, topiklere ygtyýarnama, heartbeats, seq/offset + resume-token, at-least-once + dedup. Masştab üçin - hakykat çeşmesi hökmünde user/tenant, sticky-routing we nobat (Kafka/NATS/Redis Streams).
1) iGaming iş halatlary (hakyky akym)
Balans/çäkler: balansyň, RG çäkleriniň, blokirlemeleriň dessine üýtgemegi.
Nyrhlar/tapgyrlar/netijeler: tassyklamak, status, ýeňişleri hasaplamak.
Ýaryşlar/liderbordlar: pozisiýalar, taýmerler, baýrakly wakalar.
Tölegler: töleg/refund statusy, KYC/AML baýdaklary - habarnama hökmünde (tankyt REST webhukide galýar).
Hyzmat wakalary: söhbetdeşlik habarlary, push-bannerler, sessiýanyň ýagdaýlary, maintenance.
2) Teswirnama we birleşme
Diňe WSS (TLS 1. 2+/1. 3). Enjamyňyza/sessiýaňyza iň köp 1 işjeň baglanyşyk.
Ping/Pong: Müşderi her 20-30 sekuntda "ping" iberýär, jogap wagty 10 s. Serwer yzly-yzyna 3 ýarymda baglanyşygy taşlaýar.
Gysyş: 'permessage-deflate', çarçuwanyň ululygyna çäk (mysal üçin ≤ 64 KB).
Peýdaly ýüküň formaty: daşarky JSON, içerki/ykjam üçin Protobuf/MsgPack.
3) Tassyklamak we ygtyýarlandyrmak
JWT-den query/header ('Sec-WebSocket-Protocol '/' Authorization'), TTL gysga (≤ 15 minut), out-of-band (REST) boýunça refresh.
Tenant-scoped claims: `sub`, `tenant`, `scopes`, `risk_flags`.
Topiklere/kanallara ACL: Diňe rugsat berlen 'topic' -lere abuna (mysal üçin: 'user: {id}', 'tournament: {id}', 'game: {table}').
Token gutaranda baglanyşygyň täzeden gurulmagy: "ýumşak penjire" 60 s.
4) Abuna ýazylmagyň nusgasy
Müşderi connect-den soň aşakdaky buýruklary iberýär:json
{ "op":"subscribe", "topics":["user:123", "tournament:456"], "resume_from":"1748852201:987654" }
{ "op":"unsubscribe", "topics":["tournament:456"] }
'resume _ from' - eger müşderi baglanyşygy dikeldýän bolsa, ofset (§ 5 serediň).
Serwer ack/nack jogap berýär.
5) Eltmegiň kepillikleri we jemlemek
Maksat: at-least-once + müşderiniň idempotentligi.
Her bir çäräniň "partiýa" (adatça user/room) çäginde monoton 'seq' we babyň global 'event _ id' bar.
Re-konnektde müşderi 'resume _ from' = iň soňky tassyklanan 'seq' (ýa-da 'offset' broker) geçirýär. Serwer "hakykat çeşmesinden" (Kafka/NATS/Redis Streams) sypdyrylan wakalary ýükleýär.
Eger lag retentiondan ýokary bolsa (mysal üçin, 24 sagat) - serwer 'snapshot' ýagdaýyny we 'seq' -ni iberýär.
- Durable-ammarda 'last _ seq '/' event _ id' saklamak (IndexedDB/Keychain).
- 'event _ id' dedupy, 'seq ≤ last_seq' bilen wakalary sypdyrmak, snapshot soragynyň deşiklerini (gap) → awto' resync 'tapmak.
6) Habar shemasy (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 taksonomiýasy (Wakalar sözlügine serediň).
PII/PCI - şlýuz derejesinde aýyrmak/gizlemek.
7) Backpressure, kwotalar we "gymmat" müşderilerden goramak
Server → Client: per-connection send-queue Artykmaç - "şowhunly" topiklere ýa-da '1013 '/' policy _ violation' kody bilen disconnect abunalyklaryny täzeden gurmak.
Client → Server: 'subscribe/unsubscribe' -a çäklendirmeler (mysal üçin ≤ 10/sek), topikleriň sanawyny çäklendirmek (≤ 50), iň az gaýtadan ýazylmak aralygy.
IP/tenant/açary boýunça rate limits. Anomaliýalar → Wagtlaýyn blokirleme.
Priority: möhüm wakalar (balans, RG-çäkleri) - ileri tutulýan ugur.
8) Gorag we howpsuzlyk
WAF/bot-profil hendshake-endpoint, rugsat edilen Origin sanawy.
mTLS edge-şlýuz bilen akym düwünleriniň arasynda.
DoS-gorag: L4-de SYN-cookies, açylan WS-leriň sanyna çäkler/keep-alive aralygy.
Anti-replay: 'timestamp' 5 minut rugsat edilýän penjire bilen peýdaly ýüküň (hyzmatdaşlar üçin) opsiýa golunda.
Kärendeçileriň izolýasiýasy: fiziki/logiki tertipleşdirmek, açarlar/per-tenant bellikleri.
9) Ulag arhitekturasy
Şlýuz (edge): TLS termineýti, authN/Z, kwotalar, partiýa ugry.
Akym düwünleri: sticky-routing 'hash (user_id)% N' stateless workers.
Waka brokeri: Kafka/NATS/Redis Streams - hakykat çeşmesi we bellik-bufer.
State-service: snapshotlary saklaýar (balance, ýaryşdaky pozisiýalary).
Köp sebit: aktiw-aktiw; Iň ýakyn sebit boýunça GSLB; home-region login bilen berkidilýär; feýlowerde - başga sebitden gelen "sowuk" rezýume.
10) Tertip, ylalaşyklylyk, idempotentlik
Tertiplilik partiýanyň içinde kepillendirilýär (user/room), global däl.
Yzygiderlilik: waka REST jogabyndan öň gelip biler; UX aralyk ýagdaý (optimistic UI + reconciliation) bilen ýaşap bilmelidir.
Idempotentlik: 'event _ id' gaýtadan işlemek müşderiniň ýagdaýyny üýtgetmeýär.
11) Ýalňyşlyklar, reconnect we "tupan"
Ýapyş kodlary: '1000' (adaty), '1008' (policy), '1011' (internal), '1013' (server overload).
Müşderi eksponenti backoff + jitter: 1s, 2s, 4s... maks 30s.
Köpçülikleýin rekonnektlerde ("thundering herd") - serwer 'retry _ after' we "çal" jogaplary berýär.
12) Nagt pul we snapshotlar
Her abuna ýazylmak häzirki ýagdaýyň snapşotyndan başlap biler, soňra - diff-wakalaryň akymy.
'data _ version' shemasyny wersiýalaşdyrmak we gabat gelmek (meýdanlary giňeltmek müşderileri bozmaýar).
13) Synlamak we SLO
Metrikler:- Baglanyşyklar: işjeň, kesgitlenen/sek, kärendeçiler/sebitler boýunça paýlanyş.
- Eltip bermek: p50/p95 brokerden müşderä çenli gijikdirmeler, drop-rate, resend-rate.
- Ygtybarlylyk: snapshotsyz üstünlikli netijeleriň paýy, gap-detektor.
- Ýalňyşlyklar: 4xx/5xx hendşeýkada, ýapylyş kodlary, limit-hitler.
- RPS buýruklary 'subscribe', nobatlaryň ululygy, CPU/NET.
- WS p95 ≤ 500 ms (sebitiň içinde).
- End-to-end latency hadysasy p95 ≤ 300 ms (user-partition).
- Resume success ≥ 99%, message loss = 0 (по at-least-once).
- Uptime akym endpoint ≥ 99. 95%.
14) Shemalary we wersiýalary dolandyrmak
Eýeler, mysallar we semantika bilen wakalaryň sözlügi.
"Ýumşak" ewolýusiýa: diňe goşmaça meýdanlary goşmak; aýyrmak - "@deprecated" döwürden soň.
Müşderi SDK-syna garşy şertnama synaglary, JSON Schema/Protobuf linterleri.
15) Wakalaryň pleýbuklary (umumy pleýbukyňyza goşuň)
Latency ösüşi: partiýany ätiýaçlyk düwünlerine geçirmek, dellalyň batch ululygyny köpeltmek, möhüm wakalaryň ileri tutulmagyny öz içine almak.
Täzeleniş tupany: 'retry _ after' -i işjeňleşdiriň, handshake çäklerini wagtlaýyn ýokarlandyryň, SSE-follbeki açyň.
Tokenleriň syzmagy: JWKS-iň aýlanmagy, täsir eden tokenleriň yzyna alynmagy, re-auth bilen mejbury reconnect.
Dellalyň partiýasynyň ýitmegi: dikeldilenden soň snapshotlaryň, repleriň re modeimine geçirmek.
16) Mini-spesifikasiýa API (ýönekeýleşdirilen)
Handshake (HTTP GET → WS):
GET /ws? tenant=acme&client=web
Headers:
Authorization: Bearer <JWT>
X-Trace-Id: <uuid>
Müşderi buýruklary:
json
{ "op":"subscribe", "topics":["user:123"], "resume_from":"1748852201:42" }
{ "op":"unsubscribe", "topics":["user:123"] }
{ "op":"ping", "ts":"2025-11-03T12:34:56Z" }
Serwer jogaplary:
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-sanawy
- Müşderiniň düşelgesiniň 1/10/60 minutyndan soň ofsetden rezýume.
- Dedup: şol bir "event _ id" -iň gaýtadan iberilmegi ýagdaýy üýtgetmeýär.
- Gap detektory → awtomatiki 'snapshot' we tekizlemek.
- Kwotalar we backpressure: ýüklenen müşderi policy-disconnect alýar.
- Köp sebit: ofseti saklamak bilen sebitiň failover.
- Howpsuzlyk: JWT möhleti geçen roker belligi, ACL-den daşarda ýazylmak synanyşygy.
- RG/wakalaryň balansy REST-den öň/soň gelýär - UI dogry "tikýär".
18) Ýygy-ýygydan ýalňyşlyklar
Ýok 'seq/offset' we täzelenmeler - wakalary we ynamy ýitirýäris.
WS-mutasiýalarda möhüm töleg buýruklaryny garyşdyrmak - REST ulanyň.
Backpressure/kwotalaryň ýoklugy - "asylan" baglanyşyklar we ýadyň göçmegi.
Global tertiplilik - gymmat we zerur däl; partiýada tertip ýeterlikdir.
Wakalarda PII-ni logirlemek - gizlinligiň bozulmagy we PCI/GDPR.
Wakalaryň sözlüginiň we wersiýasynyň ýoklugy - müşderiler döwülýär.
Gysgaça maglumat
WebSocket akymlary, eger olar jemlenýän, goralýan we çäklendirilen kanal hökmünde gurlan bolsa, reaktiw UX we operasiýa signallaryny berýär: WSS + mTLS/JWT, topiklere ACL, seq/offset + resume, at-least-once, backpressure/kwotalar, hakykat, gözegçilik we SLO çeşmesi hökmünde dellal. Şeýlelik bilen akymlar ulanyjy üçin çalt we platforma üçin dolandyrylyp bilner - howpsuzlyk we pul meselesinde eglişik bolmazdan.