Sau khi tìm hiểu về Security & WAF (Bài 1) và Microservices & Core Engine (Bài 2), Bài 3 mở ra chìa khóa đảm bảo trải nghiệm tương tác trực tiếp của người dùng trong RK88: Cụm Real-Time WebSocket Gateway.
Trong các hệ thống quy mô lớn, việc duy trì RK88 kết nối hai chiều (Full-Duplex) cho $500,000+\text{ CCU}$ (Concurrent Users) với độ trễ phản hồi theo thời gian thực ($< 10\text{ms}$) đặt ra thách thức cực kỳ lớn về quản lý bộ nhớ, tối ưu hóa I/O và đồng bộ trạng thái (State Management) trên tập hợp nhiều Nodes Gateway.
Hệ thống WebSocket của RK88 tách biệt hoàn toàn giữa việc Quản lý kết nối (Stateful Gateway) và Đồng bộ thông điệp (Stateless Pub/Sub Bus).
┌─────────────────────────────────────────────────────────────────────────────┐
│ 500,000+ CLIENT CONNECTORS (Web, iOS, Android App Clients) │
└──────────────┬──────────────────────────────────────────────────────────────┘
│ (WSS / TLS 1.3 - HTTP/2 Upgrade)
▼
┌─────────────────────────────────────────────────────────────────────────────┐
│ LOAD BALANCING & INGRESS ROUTING (Envoy Gateway) │
│ • Least-Connection Load Balancing Algorithm │
│ • TLS Termination & Rate Limiting per Socket Connection │
└──────────────┬──────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────────────────┐
│ WEBSOCKET GATEWAY CLUSTER (Go-Centrifugo / Custom Epoll Gateway) │
│ • Epoll/Kqueue Non-blocking Network I/O (Tối ưu Memory: ~4KB / Connection) │
│ • In-Memory Connection Registry & Session Key Validation │
└──────────────┬──────────────────────────────────────────────────────────────┘
│
├──────────────────────────────────────────────┐
│ (Subscribe to Channels) │ (Publish Events)
▼ ▼
┌──────────────────────────────────────────┐ ┌──────────────────────────────┐
│ PUB/SUB BROKER (Redis Cluster / NATS) │ │ KAFKA EVENT STREAM (Bài 2) │
│ • Room Broadcasting (Game Odds, Results) │ │ • User Bets & Balance Sync │
└──────────────────────────────────────────┘ └──────────────────────────────┘
Non-blocking I/O Với Epoll / Kqueue: Các thư viện WebSocket thông thường gán mỗi kết nối cho một Goroutine/Thread riêng, dẫn đến tình trạng cạn kiệt bộ nhớ RAM khi vượt $100,000\text{ CCU}$. RK88 áp dụng cơ chế Multiplexing (epoll trên Linux) để một Goroutine có thể quản lý hàng ngàn Socket, giảm bộ nhớ tiêu thụ xuống chỉ còn $\sim 4\text{ KB}$ cho mỗi Socket connection.
Tách Biệt Channel Broadcasting & Unicast Messaging:
Unicast (Gửi đích danh $1\text{--}1$): Cập nhật biến động số dư, trạng thái đơn cược được gửi trực tiếp qua Session ID lưu trữ tại Redis Registry.
Broadcast (Gửi $1\text{--}\text{N}$): Tỷ lệ kèo, kết quả trận đấu được phân tách theo Channels (Rooms) qua cụm NATS/Redis PubSub, giúp truyền dữ liệu đồng loạt tới hàng vạn người chơi trong cùng phòng mà không làm nghẽn CPU.
Heartbeat Ping/Pong & Graceful Reconnection: Để phát hiện các kết nối "chết ngầm" (Dead Sockets do mất mạng mobile/3G/4G), Gateway duy trì cơ chế Heartbeat thông minh ($15\text{s}$ interval). Khi người dùng kết nối lại (Re-connect), hệ thống sử dụng Stream Resume Token để đồng bộ lại các Event bị lỡ mà không cần tải lại toàn bộ trang.
| Tiêu Chí / Chỉ Số | Mô Hình Thread-Per-Connection (Nginx/NodeJS) | Cụm WebSocket Epoll Tối Ưu (RK88) |
| Dung Lượng RAM Cho $100,000\text{ CCU}$ | $\sim 8\text{ GB}\text{--}16\text{ GB}\text{ RAM}$ | $< 1.5\text{ GB}\text{ RAM}$ |
| Độ Trễ Phân Phối Broadcast (p99) | $150\text{ms}\text{--}300\text{ms}$ | $< 12\text{ms}$ |
| Tốc Độ Xử Lý Broadcast (Message/s) | $\sim 30,000\text{ msg/s}$ | $> 350,000\text{ msg/s}$ |
| Khả Năng Phục Hồi Khi Reconnect | Tải lại toàn bộ State (Dễ nghẽn DB) | Delta Sync qua Resume Token ($< 5\text{ms}$) |