GH GambleHub

웹 소켓 스트림 및 이벤트

TL; DR

작업 스트림 = 신뢰할 수있는 채널 (WSS) + 요약 된 오프셋 + dem 등원 이벤트 + 엄격한 한계 및 역압. Do: JWT 인증, 주제 인증, 하트 비트, seq/offset + 이력서 토큰, 최소 한 번 + 데드 업. 규모-사용자/테넌트 샤딩, 끈적 끈적한 라우팅 및 큐 (Kafka/NATS/Redis Streams) 는 진실의 원천입니다.

1) iGaming 비즈니스 사례 (실제로 스트리밍하는 것)

균형/제한: 균형의 즉각적인 변화, RG 제한, 잠금.
베팅/라운드/결과: 확인, 상태, 상금 계산.
토너먼트/리더 보드: 위치, 타이머, 상금 이벤트.
지불: 지불/환불 상태, KYC/AML 플래그-알림 (및 비판은 REST + 웹 후크에 남아 있음).
서비스 이벤트: 채팅 메시지, 푸시 배너, 세션 상태, 유지 보수.

2) 프로토콜 및 연결

WSS 전용 (SL 1. 2+/1. 3). 기본 장치/세션 당 최대 1 개의 활성 연결

Ping/Pong: 클라이언트는 20-30 초마다 'ping' 을 보내고 응답 타임 아웃은 10 초입니다. 서버는 연속 3 회 연속으로 연결을 끊습니다.

압축: '퍼 메시지 디플레이트', 프레임 크기 제한 (예:
  • 페이로드 형식: 외부 용 JSON, 내부/모바일 용 Proto/MsgPack.

3) 인증 및 인증

쿼리/헤더 ('Sec-WebSocket-Protocol '/' Authorization') 의 JWT 핸드 셰이크, TTL 토큰 쇼트 (λ15 분), 대역 외 (REST) 로 새로 고침.
세입자 범위 주장: 'sub', 'tenit', 'scopes', 'risk _ flags'.
주제/채널에 대한 ACL: 허용 된 '주제' 만 구독 (예: '사용자: {id}', '토너먼트: {id}', '게임: {table}').

토큰이 만료되면 연결 재생성: "소프트 창" 60 초

4) 구독 모델

클라이언트는 연결 후 명령을 보냅니다

json
{ "op":"subscribe", "topics":["user:123", "tournament:456"], "resume_from":"1748852201:987654" }
{ "op":"unsubscribe", "topics":["tournament:456"] }

클라이언트가 다시 연결되면 'reasy _ from' -오프셋 (§ 5 참조).
서버는 ack/nack으로 응답하고 실패한 ACL은 'reason' 으로 'nack' 에 있습니다.

5) 배송 보증 및 요약

목적: 클라이언트에서 채널 당 최소 한 번 + dempotency.

각 이벤트에는 "부분" (일반적으로 사용자/방) 내에 단조로운 'seq' 와 중복 제거를위한 글로벌 '이벤트 _ id' 가 있습니다.
다시 연결하면 클라이언트는 마지막으로 확인 된 'seq' (또는 브로커의 '오프셋') '이력서를 보냅니다. 서버는 "진실의 원천" (Kafka/NATS/Redis Streams) 에서 누락 된 이벤트를로드합니다.
지연이 보존을 초과하면 (예: 24 시간) 서버는 상태의 '스냅 샷' 과 새로운 'seq' 을 보냅니다.

클라이언트 시맨틱:
  • 내구성 스토리지 (IndexedDB/Keychain) 의 'last _ seq '/' 이벤트 _ id'
  • '이벤트 _ id' 로 디업하고 'seq 소 마지막 _ seq' 로 이벤트를 건너 뛰고 구멍 (갭) → 자동- 'resync' 스냅 샷 요청을 감지하십시오.

6) 메시지 체계 (봉투)

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) "고가의" 고객에 대한 역압, 할당량 및 보호

서버 → 클라이언트: 슬라이딩 창이있는 연결 당 전송 대기열. 전체 - "잡음" 주제에 대한 구독을 재설정하거나 코드 '1013 '/' 정책 _ 위반' 으로 연결을 끊으십시오.
클라이언트 → 서버: '구독/구독 취소' 제한 (예: 자동 구독/구독 취소), 주제 목록 제한 (계정 50), 최소 재구독 간격.
IP/테넌트/키에 의한 요율 제한. Anomalies → 임시 차단.
우선 순위: 중요한 이벤트 (밸런스, RG 제한) -우선 순위 대기열.

8) 보호 및 안전

핸드 셰이크 엔드 포인트의 WAF/봇 프로필, Origin 허용 목록.
에지 게이트웨이와 스트림 노드 사이의 mTLS.
DoS 보호: L4의 SYN 쿠키는 열린 WS/유지 간격의 수를 제한합니다.
재생 방지: 유효한 창이 5 분 인 선택적 페이로드 서명 (파트너 용) 의 '타임 스탬프'.
세입자 격리: 물리적/논리적 샤딩, 세입자 당 키/토큰.

9) 운송 아키텍처

게이트웨이 (가장자리): 리터미널 터미널, 작성/Z, 할당량, 당사자 당 라우팅.
스트림 노드: 'hash (user _ id)% N' 으로 끈적 끈적한 라우팅을 한 무국적 작업자.
이벤트 브로커: Kafka/NATS/Redis Streams-진실의 원천과 재생 버퍼.
국가 서비스: 스냅 샷 (균형, 토너먼트 포지션) 을 저장합니다.
다 지역: 자산 자산; 가장 가까운 지역별 GSLB; 홈 영역은 로그인시 수정됩니다. 다른 지역의 "차가운" 요약과 함께.

10) 주문, 일관성, demopotency

주문은 전 세계가 아닌 파티 (사용자/방) 내에서 보장됩니다.
일관성: 이벤트는 REST 응답 전에 올 수 있습니다. UX는 중간 상태 (낙관적 UI + 조정) 와 함께 살 수 있어야합니다.
이데올로기: '이벤트 _ id' 재 처리는 클라이언트의 상태를 변경하지 않습니다.

11) 오류, 재 연결 및 폭풍

마감 코드: '1000' (정상), '1008' (정책), '1011' (내부), '1013' (서버 과부하).
클라이언트 지수 백오프 + 지터: 1, 2, 4... 최대 30 대.
대량 재 연결하는 동안 ("천둥 무리") - 서버는 읽기 전용으로 SSE 대체 프롬프트를 사용하라는 프롬프트와 함께 '다시 시도' 및 "회색" 응답을 제공합니다.

12) 현금 및 스냅 샷

각 구독은 현재 상태의 스냅 샷으로 시작한 다음 diff 이벤트 스트림으로 시작할 수 있습니다.

데이터 _ 버전 스키마 버전 설정 및 호환성 (필드 확장으로 인해 클라이언트가 중단되지

13) 관찰 및 SLO

메트릭:
  • 연결: 임차인/지역별 활성, 설정/초, 배포.
  • 배송: 브로커에서 클라이언트로의 p50/p95 지연, 드롭 레이트, 리 센드 레이트.
  • 신뢰성: 스냅 샷, 갭 검출기없이 성공적인 이력서를 공유합니다.
  • 오류: 악수 4xx/5xx, 코드 닫기, 적중 제한.
  • 로드: '구독' 명령, 대기열 크기, CPU/NET의 RPS.
SLO 벤치 마크:
  • WS p95 소 500 ms 설립 (지역 내).
  • 엔드 투 엔드 대기 시간 이벤트 p95 λ300 ms (사용자 파티션).
  • (PHP 3 = 3.0.6, PHP 4)
  • 가동 시간 스트림 엔드 포인트 95%.

14) 스키마 및 버전 관리

소유자, 예 및 의미론이있는 이벤트 사전.
"소프트" 진화: 선택적 필드 만 추가; 삭제 - '@ under' 기간 이후.
클라이언트 SDK에 대한 계약 테스트, JSON 스키마/프로토 타입의 라인터.

15) 사건 플레이 북 (공유 플레이 북에 포함)

대기 시간 증가: 당사자를 백업 노드로 전환하고 브로커의 배치 크기를 늘리면 중요한 이벤트의 우선 순위를 정할 수 있습니다.
폭풍을 다시 시작하십시오: '다시 시도' 를 활성화하고, 악수 한계를 일시적으로 높이고, SSE 대체를 활성화하십시오.
토큰 누출: JWKS 회전, 영향을받는 토큰의 취소, 강제 재 연결로 다시 연결됩니다.
중개인 상실: 스냅 샷 모드로 전환, 복구 후 재생.

16) API 미니 사양 (간체)

핸드 셰이크 (HTTM 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: 동일한 '이벤트 _ id' 의 재전송은 상태를 변경하지 않습니다.
  • 갭 검출기 → 자동 '스냅 샷' 및 정렬.
  • 쿼타 및 역압: 로드 된 클라이언트는 정책 연결 해제를받습니다.
  • 다중 지역: 오프셋을 유지하면서 장애 지역.
  • 보안: 토큰 로커는 JWT에 의해 만료되어 ACL 외부에 가입하려고합니다.
  • RG/이벤트 균형은 REST-UI가 올바르게 "스티치" 되기 전후에 발생합니다.

18) 빈번한 오류

'seq/offset' 및 갱신 없음-이벤트와 신뢰를 잃습니다.
WS 돌연변이에서 중요한 지불 명령을 혼합하면 REST를 사용하십시오.
역압/할당량 부족 - "정지 된" 연결 및 기억의 눈사태.
세계적인 질서는 비싸고 불필요합니다. 파티에서 충분한 질서.
이벤트의 PII 로깅-개인 정보 침해 및 PCI/GDPR.
이벤트 및 버전의 사전 부족-클라이언트가 분류됩니다.

요약

웹 소켓 스트림은 요약, 보호 및 제한된 채널로 구축 된 경우 반응성 UX 및 작동 신호를 제공합니다. 진실, 관찰 성 및 SLO. 따라서 스트림은 보안 및 비용에 타협하지 않고 사용자에게 빠르게 유지되고 플랫폼에서 관리 할 수 있습니다.

Contact

문의하기

질문이나 지원이 필요하시면 언제든지 연락하십시오.우리는 항상 도울 준비가 되어 있습니다!

통합 시작

Email — 필수. Telegram 또는 WhatsApp — 선택 사항.

이름 선택 사항
Email 선택 사항
제목 선택 사항
메시지 선택 사항
Telegram 선택 사항
@
Telegram을 입력하시면 Email과 함께 Telegram에서도 답변드립니다.
WhatsApp 선택 사항
형식: +국가 코드 + 번호 (예: +82XXXXXXXXX).

버튼을 클릭하면 데이터 처리에 동의하는 것으로 간주됩니다.