WebSocket akışları ve olayları
TL; DR
İş akışı = güvenilir kanal (WSS) + özetlenmiş ofsetler + idempotent olaylar + katı sınırlar ve geri basınç. Yap: JWT kimlik doğrulaması, konular için yetkilendirme, kalp atışları, seq/offset + resume-token, en az bir kez + deadup. Ölçek için - bir doğruluk kaynağı olarak kullanıcı/kiracı parçalama, yapışkan yönlendirme ve kuyruk (Kafka/NATS/Redis Akışları).
1) iGaming iş durumları (gerçekten yayınladığımız şey)
Denge/limitler: Dengede anlık değişiklikler, RG limitleri, kilitler.
Bahisler/turlar/sonuçlar: onay, durum, kazançların hesaplanması.
Turnuvalar/skor tabloları: pozisyonlar, zamanlayıcılar, ödül etkinlikleri.
Ödemeler: Ödeme/geri ödeme durumu, KYC/AML bayrakları - bildirimler gibi (ve eleştiriler REST + web kitaplarında kalır).
Hizmet etkinlikleri: sohbet mesajları, push banner'lar, oturum durumları, bakım.
2) Protokol ve bağlantı
Yalnızca WSS (TLS 1. 2+/1. 3). Varsayılan aygıt/oturum başına maksimum 1 etkin bağlantı.
Ping/Pong: Müşteri her 20-30 saniyede bir 'ping' gönderir, yanıt zaman aşımı 10 saniyedir. Sunucu ardışık 3 zaman aşımında bağlantıyı keser.
Sıkıştırma: 'Permessage-deflate', çerçeve boyutu sınırı (örneğin, ≤ 64 KB).
Taşıma biçimi: Harici için JSON, dahili/mobil için Protobuf/MsgPack.
3) Kimlik doğrulama ve yetkilendirme
Sorgu/başlıkta JWT el sıkışma ('Sec-WebSocket-Protocol'/' Authorization'), TTL belirteci kısa (≤ 15 dk), bant dışı (REST) ile yenileme.
Kiracı kapsamlı iddialar: 'sub', 'tenant', 'scopes', 'risk _ flags'.
Konulara/kanallara ACL'ler: Yalnızca izin verilen 'konulara' abone olmak (örneğin: 'user: {id}', 'tournament: {id}', 'game: {table}').
Belirteç sona erdiğinde bağlantı yeniden oluşturma: "yumuşak pencere" 60 s.
4) Abonelik modeli
İstemci bağlandıktan sonra komutlar gönderir:json
{ "op":"subscribe", "topics":["user:123", "tournament:456"], "resume_from":"1748852201:987654" }
{ "op":"unsubscribe", "topics":["tournament:456"] }
'resume _ from' - istemci yeniden bağlanırsa ofset (bkz. § 5).
Sunucu ack/nack ile yanıt verir, başarısız olan ACL'ler 'reason'ile' nack 'içindedir.
5) Teslimat garantileri ve özeti
Amaç: Kanal başına en az bir kez + istemcide idempotency.
Her etkinlik, "parça" (genellikle kullanıcı/oda) içinde monoton bir 'seq've veri tekilleştirme için global bir' event _ id 'içerir.
Yeniden bağlantı ile, istemci 'resume _ from' = son onaylanan 'seq' (veya komisyoncunun 'ofset') gönderir. Sunucu, "gerçeğin kaynağı'ndan (Kafka/NATS/Redis Streams) kaçırılan olayları yükler.
Gecikme tutma süresini aşarsa (örneğin, 24 saat), sunucu durumun "anlık görüntüsünü've yeni bir" seq "gönderir.
- Dayanıklı depolamada 'last _ seq'/' event _ id' depolayın (IndexedDB/Keychain).
- 'Event _ id'ile Dedup,' seq ≤ last_seq' ile olayları atlayın, delikleri (boşluk) algılayın - otomatik 'resync' anlık görüntü isteği.
6) Mesaj şeması (zarf)
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' - domain taksonomisi (olay sözlüğüne bakınız).
PII/PCI - ağ geçidi düzeyinde dışlama/maske.
7) Geri basınç, kotalar ve "pahalı" müşterilere karşı koruma
Sunucu - İstemci: Sürgülü pencereli bağlantı başına gönderme kuyruğu. "Gürültülü" konulara aboneliklerin tamamen sıfırlanması veya '1013'/' policy _ violation' koduyla bağlantının kesilmesi.
Sunucu: 'abonelik/abonelikten çıkma' sınırları (örneğin, ≤ 10/sn), konu listesi sınırı (≤ 50), minimum yeniden abonelik aralığı.
IP/kiracı/anahtar ile oran sınırları. Anomaliler - geçici engelleme.
Öncelik: hayati olaylar (denge, RG sınırları) - öncelik kuyruğu.
8) Koruma ve güvenlik
El sıkışma uç noktasında WAF/bot profili, Origin izin verilen liste.
Kenar ağ geçidi ve akış düğümleri arasında mTLS.
DoS koruması: L4'teki SYN çerezleri, açık WS/keep-alive aralığının sınırlamaları.
Anti-replay: 'Zaman damgası' geçerli bir penceresi 5 dakika olan isteğe bağlı yük imzasında (ortaklar için).
Kiracı izolasyonu: fiziksel/mantıksal sharding, kiracı başına anahtarlar/belirteçler.
9) Ulaşım mimarisi
Ağ geçidi (kenar): TLS terminali, authN/Z, kotalar, parti başına yönlendirme.
Akış düğümleri: 'hash (user_id) % N'ile yapışkan yönlendirmeye sahip durumsuz çalışanlar.
Etkinlik aracısı: Kafka/NATS/Redis Streams - doğruluk kaynağı ve tekrar oynatma arabelleği.
Devlet hizmeti: Anlık görüntüleri saklar (denge, turnuvadaki pozisyonlar).
Çok bölgeli: varlık-varlık; En yakın bölgeye göre GSLB; Giriş sırasında ev-bölge sabittir; Bir feiler ile - başka bir bölgeden "soğuk'bir özet.
10) Düzen, tutarlılık, idempotency
Sipariş, küresel olarak değil, parti (kullanıcı/oda) içinde garanti edilir.
Tutarlılık: olay REST yanıtından önce gelebilir; UX bir ara durumla (iyimser UI + uzlaşma) yaşayabilmelidir.
Idempotence: 'event _ id' yeniden işleme istemcinin durumunu değiştirmez.
11) Hatalar, yeniden bağlantı ve fırtınalar
Kapanış kodları: '1000' (normal), '1008' (ilke), '1011' (dahili), '1013' (sunucu aşırı yüklemesi).
İstemci üstel geri dönüş + jitter: 1s, 2s, 4s... En fazla 30.
Toplu yeniden bağlantılar sırasında ("gürleyen sürü") - sunucu, salt okunur için SSE fallback'i kullanma isteğiyle "retry _ after've" gri "yanıtları verir.
12) Nakit ve anlık görüntüler
Her abonelik, geçerli durumun anlık görüntüsüyle başlayabilir, ardından diff olaylarının bir akışı.
Data _ version schema sürüm oluşturma ve uyumluluk (alan uzantısı istemcileri bozmaz).
13) Gözlemlenebilirlik ve SLO
Metrikler:- Bağlantılar: aktif, kurulmuş/sn, kiracı/bölgeye göre dağıtım.
- Teslimat: Komisyoncudan müşteriye p50/p95 gecikme, düşürme oranı, yeniden gönderme oranı.
- Güvenilirlik: Anlık görüntü, boşluk dedektörü olmadan başarılı özgeçmişlerin paylaşımı.
- Hatalar: El sıkışmada 4xx/5xx, kapanış kodları, limit isabetleri.
- Yük: 'Abone ol' komutlarının RPS'si, kuyruk boyutu, CPU/NET.
- WS p95 ≤ 500 ms (bölge içinde) kurulması.
- Uçtan uca gecikme olayı p95 ≤ 300 ms (kullanıcı bölümü).
- Başarınızı %99 ≥ sürdürün, mesaj kaybı = 0 (en az bir kez по).
- Uptime Stream Uç Nokta ≥ 99. 95%.
14) Şema ve sürüm yönetimi
Sahipler, örnekler ve semantiklerle olayların sözlüğü.
"Yumuşak" evrim: sadece isteğe bağlı alanlar ekleme; silme - '@ kullanımdan kaldırıldı' döneminden sonra.
İstemci SDK'lara karşı sözleşme testleri, JSON Schema/Protobuf'ta linters.
15) Olay oyun kitapları (paylaşılan oyun kitabınıza gömülür)
Gecikme artışı: Yedek düğümlere taraf değiştirin, komisyoncudaki partinin boyutunu artırın, hayati olayların önceliklendirilmesini sağlayın.
Storm'u yeniden bağlayın: 'retry _ after'ı etkinleştirin, geçici olarak el sıkışma sınırlarını yükseltin, SSE fallback'i etkinleştirin.
Token sızıntısı: JWKS rotasyonu, etkilenen tokenlerin iptali, yeniden auth ile yeniden bağlantı kurmaya zorlandı.
Broker taraf kaybı: Anlık görüntü moduna geçiş, kurtarma işleminden sonra tekrar oynatma.
16) API Mini Spesifikasyonu (Basitleştirilmiş)
El sıkışma (HTTP GET - WS):
GET /ws? tenant=acme&client=web
Headers:
Authorization: Bearer <JWT>
X-Trace-Id: <uuid>
İstemci komutları:
json
{ "op":"subscribe", "topics":["user:123"], "resume_from":"1748852201:42" }
{ "op":"unsubscribe", "topics":["user:123"] }
{ "op":"ping", "ts":"2025-11-03T12:34:56Z" }
Sunucu Yanıtları:
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 kontrol listesi
- Müşterinin 1/10/60 dakikalık kesinti süresinden sonra ofset özeti.
- Dedup: Aynı 'event _ id'in yeniden teslim edilmesi durumu değiştirmez.
- Boşluk dedektörü - otomatik 'anlık görüntü've hizalama.
- Kotalar ve geri basınç: yüklenen istemci politika bağlantısını keser.
- Multiregion: ofset korurken yük devretme bölgesi.
- Güvenlik: JWT tarafından token rocker süresi doldu, ACL dışında abone olmaya çalışıyor.
- RG/olay dengesi REST'ten önce/sonra gelir - UI doğru şekilde "dikişler".
18) Sık yapılan hatalar
'Seq/offset've yenileme yok - olayları ve güveni kaybedin.
WS mutasyonlarında kritik ödeme komutlarını karıştırma - REST kullanın.
Geri basınç/kota eksikliği - "askıya alınmış" bağlantılar ve bir bellek çığı.
Küresel düzenlilik pahalı ve gereksizdir; Partide yeterince düzen var.
PII etkinliklerinde oturum açma - gizlilik ihlalleri ve PCI/GDPR.
Olayların ve sürümlerin sözlüğünün olmaması - müşteriler bozulur.
Özet
WebSocket akışları, özetlenmiş, korumalı ve sınırlı bir kanal olarak oluşturulursa reaktif UX ve operasyonel sinyaller verir: WSS + mTLS/JWT, konularda ACL, seq/offset + resume, en az bir kez veri tekilleştirme, geri baskı/kotalar, bir gerçek kaynağı olarak broker, gözlemlenebilirlik ve SLO. Böylece akışlar kullanıcı için hızlı ve platform için yönetilebilir kalır - güvenlik ve paradan ödün vermeden.