GH GambleHub

WebSocket流和事件

TL;DR

工作流=可靠通道(WSS)+總結的offset+偶數事件+嚴格的限制和背景。做到:JWT認證,拓撲授權,heartbeats,seq/offset+resume-token,at-least-once+dedup。對於規模-通過用戶/tenant,粘性路由和隊列(Kafka/NATS/Redis Streams)進行混合,作為真理的來源。

1) iGaming商業案例(實際流)

資產負債表/限額:即時變更資產負債表、RG限額、鎖定。
投註/回合/結果:確認,狀態,獲勝計算。
比賽/排行榜:位置,計時器,獲獎活動。
付款:付款狀態/退款,KYC/AML標誌-作為通知(批評仍保留在REST+webhooks中)。
服務事件:聊天消息,推橫幅,會話狀態,維護。

2)協議和連接

僅WSS(TLS 1。2+/1.3).默認情況下,每個設備/會話最多有1個活動連接。
Ping/Pong:每20-30秒shlet 「ping」客戶端,響應計時10秒。服務器在連續3個計時時時重置連接。
壓縮:「permessage-deflate」(幀大小限制)(例如≤ 64 KB)。
有效載荷格式:用於外部的JSON,用於內部/移動的Protobuf/MsgPack。

3)認證和授權

帶有JWT的Handshake在query/header(「Sec-WebSocket-Protocol」/「授權」)中,TTL令牌短(≤ 15分鐘),脫口秀(REST)。

Tenant-scoped claims: `sub`, `tenant`, `scopes`, `risk_flags`.

ACL到拓撲/通道:僅訂閱允許的"拓撲"(例如:"user: {id}","tournament: {id}",'game: {table}")。
令牌到期時重新構建連接:「軟窗口」60秒。

4)訂閱模型

連接後客戶端發送命令:
json
{ "op":"subscribe", "topics":["user:123", "tournament:456"], "resume_from":"1748852201:987654" }
{ "op":"unsubscribe", "topics":["tournament:456"] }

「resume_from」-如果客戶端恢復連接,則為offset(參見§5)。
服務器在「nack」和「reason」中響應ack/nack,未請求的ACL。

5)交貨保證和總結

目的:在客戶中,在通道+相容性上保持一致。

每個事件在「分期付款」(通常是用戶/room)中具有單調的「seq」和用於重復數據消除的全局「event_id」。
在重新連接下,客戶會發送「resume_from」=最後確認的「seq」(或「offset」經紀人)。服務器將趕上從「真相源」(Kafka/NATS/Redis Streams)跳過的事件。
如果時差超過了retention(例如,24小時),服務器會發送「snapshot」狀態和新的「seq」。

客戶端的語義:
  • 將「last_seq」/「event_id」存儲在durable存儲中(IndexedDB/Keychain)。
  • 通過"event_id",通過"seq ≤ last_seq'跳過事件,檢測漏洞(gap)→自動"resync" snapshot請求。

6)消息模式(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
}

「類型」是域分類法(請參閱事件字典)。
PII/PCI-在網關級別排除/掩蔽。

7)Backpressure,配額和「昂貴」客戶保護

Server → Client:帶有「滑動窗口」的per-connection send-queue。溢出-重置帶有「1013」/「policy_violation」代碼的「嘈雜」拓撲或disconnect的訂閱。
Client → Server:「subscribe/unsubscribe」的限制(例如,≤ 10/秒),拓撲列表限制(≤ 50),最小重新訂閱間隔。
IP/tenant/密鑰的限額。異常→臨時鎖定。
優先:重要事件(平衡,RG限制)-優先排隊。

8)保護和安全

Handshake端點上的WAF/機器人配置文件,允許的起源列表。
邊緣網關和流節點之間的mTLS。
DoS保護:L4上的SYN cookie,開放的WS數量/保持間隔的限制。
反重播:可選有效載荷簽名(適用於合作夥伴)中的「timestamp」,帶有允許的5分鐘窗口。
租戶隔離:物理/邏輯硬化,按鍵或按鍵令牌。

9)運輸架構

網關(edge): TLS終端、authN/Z、配額、分批路由。
流節點:通過'hash (user_id)% N'進行僵硬漫遊的無狀態鍛煉者。
事件經紀人:Kafka/NATS/Redis Streams是真相和緩沖的來源。
國家服務:存儲狙擊手(balance,比賽位置)。
多區域:資產資產;最近地區的GSLB;居所區域在登錄時固定;failover是來自另一個地區的「冷」灌木叢。

10)順序,一致性,相等性

有序性在批次(用戶/room)內得到保證,而不是全局保證。
一致性:事件可能早於REST響應;UX必須能夠生活在中間狀態(optimistic UI+reconciliation)。
等效性:重新處理「event_id」不會改變客戶的狀態。

11)錯誤,重新發現和「風暴」

關閉代碼為:'1000 '(normal), '1008' (policy), '1011' (internal), '1013 '(server overload)。
客戶指數backoff+jitter: 1s, 2s, 4s……max 30 s。
在質量重構(「thundering herd」)期間,服務器會發出「retry_after」和「灰色」響應,並提示使用SSE後退進行只讀。

12)Cash和snapshots

每個訂閱都可以從當前狀態的快照開始,然後是diff事件的流。
「data_version」模式的驗證和互操作性(字段擴展不會破壞客戶)。

13)可觀察性和SLO

度量標準:
  • 連接:主動,設置/秒,按租戶/地區分配。
  • 交付:p50/p95延遲從經紀人到客戶,下降率,恢復率。
  • 可靠性:成功的零碰碰碰碰撞的比例,gap檢測器.
  • 錯誤:handshake上的4xx/5xx,關閉代碼,限量版。
  • 負載:命令「subscribe」的RPS,隊列大小,CPU/NET。
SLO地標:
  • 建立WS p95 ≤ 500毫秒(在區域內)。
  • p95 ≤ 300毫秒事件的端到端後端(用戶分區)。
  • Resume success ≥ 99%, message loss = 0 (по at-least-once).
  • Uptime stream endpoint ≥ 99。95%.

14)圖形和版本管理

具有所有者,示例和語義的事件詞典。
「軟」演變:僅添加可選字段;刪除-在'@deprecated'期之後。
針對客戶端SDK的合同測試,JSON Schema/Protobuf 上的linter。

15)事件花花公子(嵌入您的共享花花公子)

後期增長:將批次切換到備用節點,增加經紀人的擊球大小,並優先考慮重要事件。
重構風暴:激活「retry_after」,暫時提高手勢限制,啟用SSE後衛。
令牌泄漏:JWKS輪換,受影響的令牌召回,從re-auth強制回收。
經紀人分期付款損失:轉為狙擊模式,恢復後倒帶。

16)微型API規範(簡化)

Handshake (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」不會改變狀態。
  • Gap檢測器→自動「快照」和對齊。
  • 配額和反向壓力:裝載的客戶端接收策略解密。
  • Multirregion:離岸保護區。
  • Security:已過期的JWT令牌搖滾,在ACL外嘗試訂閱。
  • RG/事件平衡在 REST之前/之後-UI正確地「縫合」。

18)常見錯誤

沒有「seq/offset」和恢復-我們失去事件和信任。
在WS突變中混合關鍵支付命令-使用REST。
缺少backpressure/配額-「懸掛」連接和內存雪崩。
全球有序性-昂貴且不需要;黨內有足夠的秩序。
在事件中編寫PII-違反隱私和PCI/GDPR。
沒有事件詞典和轉會-客戶崩潰。

總結

如果將響應式UX和操作信號構造為可總結,受保護和受限的通道,則WebSocket流會產生響應UX和操作信號:WSS+mTLS/JWT,拓撲上的ACL,seq/offset+resume,帶有重復數據消除的at-least-once,backpressure/配額,作為真理源的經紀人,可觀察性和SLO。因此,流對用戶來說仍然是快速的,對平臺來說是可以管理的--在安全和金錢方面沒有妥協。

Contact

與我們聯繫

如有任何問題或支援需求,歡迎隨時聯絡我們。我們隨時樂意提供協助!

開始整合

Email 為 必填。Telegram 或 WhatsApp 為 選填

您的姓名 選填
Email 選填
主旨 選填
訊息內容 選填
Telegram 選填
@
若您填寫 Telegram,我們將在 Email 之外,同步於 Telegram 回覆您。
WhatsApp 選填
格式:國碼 + 電話號碼(例如:+886XXXXXXXXX)。

按下此按鈕即表示您同意我們處理您的資料。