GH GambleHub

WebSocket ნაკადები და მოვლენები

TL; DR

სამუშაო ნაკადი = საიმედო არხი (WSS) + შეაჯამეს ოფსეტები + იდემპოტენტური მოვლენები + მკაცრი შეზღუდვები და დაბალანსება. გააკეთეთ: JWT ავთენტიფიკაცია, ტოპიკის ავტორიზაცია, heartbeats, seq/offset + resume ნიშანი, at-last-once + დედაპლატი. მასშტაბისთვის - შარდვა user/tenant, sticky routing და ჯერი (Kafka/NATS/Redis Streams), როგორც ჭეშმარიტების წყარო.

1) iGaming ბიზნეს შემთხვევები (რაც ნამდვილად ნაკადია)

ბალანსი/ლიმიტები: მყისიერი ბალანსის ცვლილებები, RG ლიმიტები, ბლოკირება.
განაკვეთები/რაუნდი/შედეგები: დადასტურება, სტატუსი, მოგების გაანგარიშება.
ტურნირები/ლიდერები: პოზიციები, ტაიმერები, საპრიზო მოვლენები.
გადახდები: payout/refund სტატუსი, KYC/AML დროშები - როგორც შეტყობინებები (და კრიტიკა რჩება REST + ვებჰუკში).
სერვისული მოვლენები: ჩატის შეტყობინებები, პუს ბანერები, სესიის სტატუსები, mintenance.

2) პროტოკოლი და კავშირი

მხოლოდ WSS (TLS 1. 2+/1. 3). მაქსიმუმ 1 აქტიური კავშირი მოწყობილობაზე/სესიაზე ნაგულისხმევი.
Ping/Pong: კლიენტი ჩაფხუტი 'ping' ყოველ 20-30 წამში, პასუხის ტაიმუტი 10. სერვერი ჩამოაგდებს კავშირს ზედიზედ 3 ტაიმუთში.
კომპრესია: 'permessage-deflate', ზღვარი ჩარჩოს ზომაზე (მაგალითად, 64 KB).
დატვირთვის ფორმატი: JSON გარე, Protobuf/MsgPack შიდა/მობილური.

3) ავთენტიფიკაცია და ავტორიზაცია

Handschake JWT- სთან ერთად query/header ('Sec-WebSocket-Protocol '/' Authorization'), TTL ნიშნის მოკლე (15 წუთი), REST).
Tenant-scoped claims: `sub`, `tenant`, `scopes`, `risk_flags`.
ACL ტოპიკებზე/არხებზე: გამოწერა მხოლოდ ნებადართული 'topic' (მაგალითად: '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' - ოფსეტი (იხ. § 5), თუ კლიენტი აღადგენს კავშირს.
სერვერი პასუხობს ack/nack, წარუმატებელი ACL - 'nack' s 'reason' - ში.

5) მიწოდებისა და შეჯამების გარანტიები

მიზანი: at-least-once არხზე + კლიენტის იდემპოტენტობა.

თითოეულ მოვლენას აქვს მონოტონური 'seq', როგორც "წვეულება" (ჩვეულებრივ, მომხმარებელი/ოთახი) და გლობალური 'ღონისძიება _ id "ბაბუისთვის.
პრო-კონექტით, კლიენტი გადასცემს 'resume _ from' = ბოლო დადასტურებული 'seq' (ან 'offset' ბროკერი). სერვერი ატვირთავს გამოტოვებულ მოვლენებს „ჭეშმარიტების წყაროდან“ (Kafka/NATS/Redis Streams).
თუ lag აღემატება retention (მაგალითად, 24 საათი) - სერვერი უგზავნის 'snapshot' სახელმწიფოებს და ახალ 'seq- ს.

სემანტიკა კლიენტში:
  • შენახვა 'last _ seq '/' event _ id' durable საცავში (IndexedDB/Keychain).
  • 'event _ id' dedup, გამოტოვეთ მოვლენები '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 ერთად „მოცურების ფანჯარა“. ხალხმრავალი - ხელმოწერების გამოტოვება „ხმაურიანი“ ტოპიკებისთვის ან disconnect კოდით '1013 '/' policy _ violation'.
Client Server: limites 'subscribe/unsubscribe' (მაგალითად, 10/წმ), ტოპიკების ჩამონათვალის შეზღუდვა (50 ევრო), მინიმალური ხელახალი გამოწერის ინტერვალი.
Rate limits IP/tenant/გასაღები. ანომალიები - დროებითი ბლოკირება.
პრიორიტეტი: სასიცოცხლო მოვლენები (ბალანსი, RG ლიმიტები) პრიორიტეტული ხაზია.

8) დაცვა და უსაფრთხოება

WAF/bot პროფილი Handscheik endpoint- ზე, ნებადართული Origin- ის სია.
mTLS edge კარიბჭესა და stream კვანძებს შორის.
DoS დაცვა: SYN ქუქი-ფაილები L4- ზე, ღია WS/keep-alive ნომრის ლიმიტები.

Anti-replay: 'timestamp' სურვილისამებრ წარწერა დატვირთვის დატვირთვისთვის (პარტნიორებისთვის) დასაშვები ფანჯრით 5 წთ

მოიჯარეების იზოლაცია: ფიზიკური/ლოგიკური შარდვა, გასაღებები/ნიშნები per-tenant.

9) სატრანსპორტო არქიტექტურა

კარიბჭე (edge): TLS ტერმინატი, authN/Z, კვოტები, მარშრუტიზაცია წვეულებაზე.
Stream კვანძები: stateless workers sticky routing 'hash (user _ id)% N'.
მოვლენების ბროკერი: Kafka/NATS/Redis Streams არის ჭეშმარიტების წყარო და raplay-bufer.
სახელმწიფო სერვისი: ინახავს სნაიპერებს (ბალანსი, პოზიციები ტურნირში).
მულტირეგიონი: აქტივი; GSLB უახლოეს რეგიონში; home-region ფიქსირდება ლოგინზე; ფეილოვერთან ერთად - „ცივი“ შეაჯამა სხვა რეგიონიდან.

10) ბრძანება, კოორდინაცია, იდემპოტენტობა

შეკვეთით გარანტირებულია წვეულება (მომხმარებელი/ოთახი), არა გლობალურად.
თანმიმდევრულობა: ღონისძიება შეიძლება მოვიდეს REST- ზე ადრე; UX- ს უნდა შეეძლოს შუალედური მდგომარეობის მქონე ცხოვრება (optimistic UI + reconciliation).
Idempotence: განმეორებითი დამუშავება 'event _ id' არ ცვლის კლიენტის მდგომარეობას.

11) შეცდომები, ჩანაწერები და „ქარიშხალი“

დახურვის კოდები: '1000' (ნორმალი), '1008' (პოლიტიკა), '1011' (internal), '1013' (სერვერი overload).
კლიენტის ექსპონენციალური backoff + jitter: 1s, 2s, 4s... მაქს 30s.
მასობრივი რეკონსტრუქციის დროს ("thundering herd") - სერვერი აძლევს 'retry _ after- ს "და" ნაცრისფერ "პასუხებს, რომლებიც ითხოვენ SSE fallback გამოყენებას read-only- სთვის.

12) კეში და ჭურვები

თითოეული გამოწერა შეიძლება დაიწყოს ამჟამინდელი მდგომარეობის snapshot- ით, შემდეგ - მოვლენების ნაკადით.
'data _ version' სქემის ვერსია და თავსებადობა (ველების გაფართოება არ არღვევს მომხმარებლებს).

13) დაკვირვება და SLO

მეტრიკა:
  • კავშირები: აქტიური, დადგენილი/წმ, განაწილება მოიჯარეებზე/რეგიონებში.
  • ადგილზე მიტანა: p50/p95 შეფერხებები ბროკერიდან კლიენტამდე, drop-rate, resend-rate.
  • საიმედოობა: წარმატებული შეკვეთების წილი Snapshot- ის გარეშე, gap დეტექტორი.
  • შეცდომები: 4xx/5xx ჰენდშეიკზე, დახურვის კოდები, ლიმიტის ჰიტები.
  • დატვირთვა: „subscribe“ ბრძანებების RPS, რიგების ზომა, CPU/NET.
SLO სახელმძღვანელო:
  • WS p95 500 ms (რეგიონის შიგნით) დაყენება.
  • P95-300 ms (მომხმარებლის წვეულება) ღონისძიების დასასრულს.
  • Resume success ≥ 99%, message loss = 0 (по at-least-once).
  • Uptime Strim endpointa 99. 95%.

14) სქემებისა და ვერსიების მართვა

მოვლენების ლექსიკონი მფლობელებთან, მაგალითებთან და სემანტიკასთან.
„რბილი“ ევოლუცია: მხოლოდ სურვილისამებრ ველების დამატება; მოცილება - პერიოდის '@ deprecated' შემდეგ.
კონტრაქტის ტესტები კლიენტის SDK- ის წინააღმდეგ, საბრძოლო მასალები JSON Schema/Protobuf- ზე.

15) ინციდენტების ფლეიბუკი (თქვენს საერთო ფლეიბუკში ჩასმა)

latency ზრდა: წვეულებების გადაქცევა სარეზერვო კვანძებზე, ბროკერისგან batch- ის ზომების გაზრდა, სასიცოცხლო მოვლენების პრიორიტეტის ჩართვა.
რეკონექტების ქარიშხალი: გააქტიურება 'retry _ after', დროებით აამაღლეთ handshake ლიმიტები, ჩართეთ SSE fallback.
ნიშნების გაჟონვა: 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 წუთის შემდეგ.
  • დედაპი: იგივე ღონისძიების _ id 'ხელახალი მიწოდება არ ცვლის მდგომარეობას.
  • Gap დეტექტორი არის ავტომატური 'snapshot "და გასწორება.
  • კვოტები და დაბომბვა: დატვირთული კლიენტი იღებს პოლიტიკურ-დისკონექტს.
  • მულტირეგიონი: failover რეგიონი ოფსეტური შენარჩუნებით.
  • უსაფრთხოება: Tocken Rocker, რომელიც ამოიწურა JWT, ACL- ს გარეთ გამოწერის მცდელობა.
  • RG/ღონისძიების ბალანსი უფრო ადრე მოდის/REST- ის შემდეგ - UI სწორად „შეკერილია“.

18) ხშირი შეცდომები

არა „seq/offset“ და განახლება - ჩვენ კარგავს მოვლენებს და ნდობას.
კრიტიკული გადახდის ბრძანებების შერევა WS მუტაციებში - გამოიყენეთ REST.
backpressure/კვოტების არარსებობა არის „შეჩერებული“ ნაერთები და მეხსიერების ზვავი.
გლობალური მოწესრიგება ძვირია და არ არის საჭირო; პარტიაში საკმარისი წესრიგია.
მოვლენებში PII- ის ლოგიკაა კონფიდენციალურობის დარღვევა და PCI/GDPR.
მოვლენების ლექსიკონის არარსებობა და ვერსიის ვერსია - მომხმარებლები იშლება.

რეზიუმე

WebSocket ნაკადები იძლევა თვითმფრინავის UX და ოპერატიულ სიგნალებს, თუ ისინი აშენებულია როგორც შეაჯამებელი, დაცული და შეზღუდული არხი: WSS + mTLS/JWT, ACL ტოპიკებზე, seq/offset + resume, at-least-onconconconconconconconce, bs, bonoute, bbbboucoup, bbbbbbbboucows, boveass ბროკერი, როგორც ჭეშმარიტების წყარო, დაკვირვება და SLO. ასე რომ, ნაკადები სწრაფად რჩება მომხმარებლისთვის და კონტროლდება პლატფორმისთვის - უსაფრთხოების და ფულის კომპრომისის გარეშე.

Contact

დაგვიკავშირდით

დაგვიკავშირდით ნებისმიერი კითხვის ან მხარდაჭერისთვის.ჩვენ ყოველთვის მზად ვართ დაგეხმაროთ!

ინტეგრაციის დაწყება

Email — სავალდებულოა. Telegram ან WhatsApp — სურვილისამებრ.

თქვენი სახელი არასავალდებულო
Email არასავალდებულო
თემა არასავალდებულო
შეტყობინება არასავალდებულო
Telegram არასავალდებულო
@
თუ მიუთითებთ Telegram-ს — ვუპასუხებთ იქაც, დამატებით Email-ზე.
WhatsApp არასავალდებულო
ფორმატი: ქვეყნის კოდი და ნომერი (მაგალითად, +995XXXXXXXXX).

ღილაკზე დაჭერით თქვენ ეთანხმებით თქვენი მონაცემების დამუშავებას.