場景需求
多台客戶端連接中心服務器,服務器需實時向所有在線客戶端廣播當前在線列表。
關鍵設計
- 服務端維護連接映射:使用
ConcurrentHashMap 存儲 clientId -> Channel,支持高併發增刪查。
- 心跳檢測:客戶端定期(如每 30 秒)發送心跳包;服務端記錄最後收到時間,超過閾值(如 90 秒)判定離線並移除。
- 廣播機制:列表變更時,序列化在線 ID 列表(JSON/Protobuf),遍歷映射逐個發送;或使用 Netty 的
ChannelGroup 一鍵廣播。
- 斷線重連:客戶端實現指數退避重連邏輯,重連後重新註冊 ID。
技術選型建議
- Java 原生 NIO (
Selector) 學習成本高,生產環境推薦 Netty 簡化開發。
- 輕量級項目可考慮 WebSocket(Spring WebSocket / Socket.IO)利用 HTTP 基礎設施穿透防火牆。