WebSocket агымдары жана окуялар
TL; DR
Жумушчу агым = ишенимдүү канал (WSS) + кыскача offsets + демократиялык окуялар + катуу чектөөлөр жана backpressure. Аткарыңыз: JWT-аутентификация, топик авторизациясы, heartbeats, seq/offset + resume-токен, at-least-once + дедуп. масштабы үчүн - user/tenant, sticky-роутинг, жана кезек (Kafka/NATS/Redis Streams) чындыктын булагы катары.
1) iGaming бизнес учурлары (бул чыныгы агым)
Баланс/лимиттер: баланстын, RG лимиттеринин, блоктордун заматта өзгөрүшү.
Коюмдар/раунддар/натыйжалар: тастыктоо, статус, утуштарды эсептөө.
Турнирлер/лидерлер: орундар, таймерлер, байгелүү окуялар.
Төлөмдөр: PayOut/refund статусу, KYC/AML желектери - эскертмелер катары (жана сын REST + Webhuks калат).
Сервистик окуялар: чат билдирүүлөрү, баннерлер, сессия статустары, maintenance.
2) Протокол жана байланыш
Бир гана WSS (TLS 1. 2+/1. 3). Максимум 1 түзмөк/сессия үчүн активдүү байланыш.
Ping/Pong: кардар ар бир 20-30 секунд "ping" жиберет, жооп берүү убактысы 10 с. Server катары менен 3 тайм менен байланышты таштайт.
Компрессия: 'permessage-deflate', кадр өлчөмү боюнча чек (мисалы, ≤ 64 KB).
Пайдалуу жүктүн форматы: Тышкы үчүн JSON, ички/мобилдик үчүн Protobuf/MsgPack.
3) Аутентификация жана авторизация
query/header JWT менен Hendshake ('Sec-WebSocket-Protocol '/' Authorization'), TTL кыска (≤ 15 мин), out-of-band боюнча refresh (REST).
Tenant-scoped claims: `sub`, `tenant`, `scopes`, `risk_flags`.
Топиктер/каналдар үчүн ACL: уруксат берилген 'topic' үчүн гана жазылуу (мисалы: 'user: {id}', 'tournament: {id}', 'game: {table}').
Токен аяктаганда байланышты кайра түзүү: "жумшак терезе" 60 с.
4) жазылуу модели
connect кийин кардар буйрук жөнөтөт:json
{ "op":"subscribe", "topics":["user:123", "tournament:456"], "resume_from":"1748852201:987654" }
{ "op":"unsubscribe", "topics":["tournament:456"] }
'resume _ from' - эгерде кардар байланышты калыбына келтирсе, оффсет (караңыз § 5).
Server ack/nack жооп берет, ACL чакырылбаган - 'nack' s 'reason'.
5) Жеткирүү жана жыйынтыктоо кепилдиктери
Максаты: канал боюнча at-least-once + кардар менен боштондук.
Ар бир иш-чара "партия" алкагында monoton 'seq' (адатта, user/room) жана global 'event _ id' дедуп үчүн.
Re-connect менен кардар 'resume _ from' = акыркы тастыкталган 'seq' (же 'offset' брокер). Сервер "чындык булагынан" (Kafka/NATS/Redis Streams) өтүп кеткен окуяларды жүктөйт.
Эгерде лаг retention ашса (мисалы, 24 саат) - сервер 'snapshot' абалын жана жаңы 'seq' абалын жөнөтөт.
- 'last _ seq '/' event _ id' турактуу сактагычта (IndexedDB/Keychain) сактоо.
- Дедуп 'event _ id', менен окуяларды сагынам 'seq ≤ last_seq', тешиктерди аныктоо (gap) → auto-' resync 'снапшот суроо.
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
}
'type' - домендик таксономия (окуялардын сөздүгүн караңыз).
PII/PCI - кулпу деъгээлинде жокко чыгаруу/жашыруу.
7) Backpressure, квота жана "кымбат" кардарларга каршы коргоо
Server → Client: "жылма терезе" менен per-connection send-queue. Толуп - '1013 '/' policy _ violation' коду менен "ызы-чуу" топик же disconnect боюнча жазылууларды калыбына келтирүү.
Client → Server: 'subscribe/unsubscribe' лимиттери (мисалы, ≤ 10/сек), топиктердин тизмесин чектөө (≤ 50), кайра жазылуунун минималдуу интервалы.
IP/tenant/ачкыч боюнча Rate limits. Аномалиялар → убактылуу бөгөт коюу.
Priority: маанилүү окуялар (баланс, RG-лимиттер) - артыкчылыктуу кезек.
8) Коргоо жана коопсуздук
WAF/Handshake EndPoint бот кароо, Origin уруксат тизмеси.
mTLS edge шлюз жана стрим түйүндөрүнүн ортосунда.
DoS-коргоо: L4 боюнча SYN-кукилер, ачык WS саны боюнча чектер/keep-alive аралыгы.
Anti-replay: 'timestamp' кошумча кол пайдалуу жүк (өнөктөштөр үчүн) жол терезе менен 5 мүнөт.
Ижарачылардын изоляциясы: физикалык/логикалык тактоо, ачкычтар/per-tenant токендери.
9) Транспорт архитектурасы
Шлюз (edge): TLS терминалы, authN/Z, квота, партияга багыттоо.
Stream түйүндөр: sticky-routing 'hash (user_id)% N' менен stateless workers.
Иш-чара брокери: Kafka/NATS/Redis Streams - чындыктын булагы жана реплика-буфер.
State-service: snapshots сактайт (балансы, турнирде орду).
Мультирегион: актив-актив; GSLB жакынкы аймак боюнча; home-region логин менен бекитилет; фейловерде - башка аймактан келген "муздак" резюм.
10) Тартип, шайкештик, демпотенттүүлүк
Партиялык тартипке кепилдик берилет (user/room), глобалдуу эмес.
Консистенция: окуя REST жооп чейин келиши мүмкүн; UX аралык абалы менен жашай билиши керек (optimistic UI + reconciliation).
Демпотенттик: 'event _ id' кайра иштетүү кардардын абалын өзгөртпөйт.
11) каталар, reconnect жана "бороон"
Жабуу коддору: '1000' (кадимки), '1008' (policy), '1011' (internal), '1013' (server overload).
Кардар экспоненциалдык backoff + jitter: 1s, 2s, 4s... макс 30s.
Массалык реконнектилер учурунда ("thundering herd") - Server берет 'retry _ after' жана "боз" жооптор менен колдонгон SSE fallback үчүн read-only.
12) Кэш жана снапшот
Ар бир жазылуу учурдагы абалдын снапшотунан башталышы мүмкүн, андан кийин - дифф-окуялардын агымы.
'data _ version' схемасын жана шайкештикти версиялоо (талааларды кеңейтүү кардарларды бузбайт).
13) Байкоо жана SLO
Метрикасы:- Байланыштар: активдүү, орнотулган/сек, ижарачылар/региондор боюнча бөлүштүрүү.
- Жеткирүү: p50/p95 кардарга брокерден кечигүү, drop-rate, resend-rate.
- Ишенимдүүлүк: snapshot, gap-detector жок ийгиликтүү жыйынтык үлүшү.
- Каталар: Хендшейкте 4xx/5xx, жабуу коддору, лимит-хиттер.
- Жүктөө: RPS буйрук 'subscribe', кезек өлчөмү, CPU/NET.
- Орнотуу WS p95 ≤ 500 ms (региондун ичинде).
- End-to-end latency окуялар p95 ≤ 300 ms (user-partition).
- Resume success ≥ 99%, message loss = 0 (по at-least-once).
- Uptime стрим-эндпоинт ≥ 99. 95%.
14) Схемаларды жана версияларды башкаруу
ээлери, мисалдар жана семантика менен окуялар сөздүгү.
"Жумшак" эволюция: кошумча талааларды кошуу гана; алып салуу - '@deprecated' мезгилден кийин.
кардар SDK каршы келишим тесттер, JSON схемасы/Protobuf боюнча линтерлер.
15) Playbook окуялар (сиздин жалпы playbook камтылган)
Latency өсүшү: запастык түйүндөргө партияларды которуу, брокердин батч көлөмүн көбөйтүү, маанилүү окуяларга артыкчылык берүү.
Бороон реконнектилер: активдештирүү 'retry _ after', убактылуу handshake чектерин көтөрүү, SSE-фоллбекти күйгүзүү.
Токендердин агып чыгышы: JWKSтин айлануусу, жабыр тарткан токендерди кайра чакыртып алуу, кайра чакыртып алуу менен мажбурлоо.
Брокердин партиясын жоготуу: калыбына келтирилгенден кийин снапшот, реплика режимине которуу.
16) Mini 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" }
Server жооптор:
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 Detector → автоматтык 'snapshot' жана тегиздөө.
- Квота жана backpressure: жүктөлгөн кардар policy-disconnect алат.
- Multiregion: offset сактоо менен региондун failover.
- Коопсуздук: токен-рокер, мөөнөтү JWT, ACL тышкары жазылуу аракети.
- RG/балансы окуя мурда/кийин REST келет - туура "тигет".
18) Көп каталар
Жок 'seq/offset' жана жаңыртуу - биз окуяларды жана ишенимди жоготуп жатабыз.
WS-мутацияларда критикалык төлөм буйруктарын аралаштыруу - REST колдонуңуз.
Backpressure/квота жок - "илинген" байланыштар жана эс көчкү.
Глобалдык тартип - кымбат жана кереги жок; партияда тартип жетиштүү.
окуяларда PII Логин - купуялык жана PCI/GDPR бузуу.
Окуялардын жана версиялардын сөздүгүнүн жоктугу - кардарлар бузулат.
Резюме
WebSocket агымдары реактивдүү UX жана оперативдүү сигналдарды берет, эгерде алар жалпылануучу, корголгон жана чектелген канал катары курулса: WSS + mTLS/JWT, топиктер боюнча ACL, seq/offset + resume, ат-least-once менен дедуп, backpressure/квота, чындык булагы катары брокер, байкоо жана SLO. Ошентип, стримдер колдонуучу үчүн тез жана платформа үчүн башкарылуучу бойдон калууда - коопсуздук жана акча боюнча компромисссиз.