一、系統整體架構流程圖(簡明版)
復制代碼
+---------------+ +------------------+ +----------------+
| 客戶端 (Client) |--------->| GateServer |----------| StatusServer |<--+
+---------------+ +------------------+ +----------------+ || | |連接狀態、用戶登錄、客戶端請求 | 管理所有chatserver的連接數| |+----------------+ | || chatserver1 |-----| |+----------------+ | || 連接用戶數管理 |<-------------------------------------+| grpc端點處理 |+------------------+| | TCP服務監聽 | | grpc通信 (端對端聊天、好友請求...)| | +--------+ +---------+| chatserver2 | | chatserverN |(未來可擴展多臺)+--------------+ +--------------+
- 客戶端(用戶手機/網頁)發起請求(登錄、聊天消息等)
- GateServer:作為“門面”,收發客戶端請求。它負責:
- 用戶登錄轉發到特定的chatserver
- 獲取聊天內容
- 獲取負載最小的chatserver進行分配(通過StatusServer)
- StatusServer:監控所有chatserver的連接數,做負載均衡決策
- 多個ChatServer:實際處理用戶的聊天邏輯
- Grpc端點通信:ChatServer之間通過grpc實現端對端通信
- 連接池(ChatConPool):優化grpc連接管理,避免頻繁建立連接
二、詳細逐步講解(用比喻輔助)
1. 系統的基本目標
- 分布式部署:多個ChatServer共享壓力
- 負載平衡:避免某臺ChatServer超載
- 端對端通信:確保不同ChatServer可以直接互傳消息
- 狀態監控:動態獲取每臺Server的連接數,確保由負載最小的Server處理用戶請求
2. 核心技術點及其作用
a. 多個ChatServer
- 就像超市里有多收銀臺,用戶隨機排隊,但我們想讓“服務快”的收銀臺快點幫用戶結賬。
- 每個ChatServer都有自己的連接數(“排隊人數”)
b. GateServer(門面)
- 就像路口柜臺,負責迎接客戶(用戶)
- 核心職責:
- 讓用戶登錄后,告知它們“去哪臺聊天服務器”
- 通過調用StatusServer查找連接最少的ChatServer
- 轉發后續聊天請求到對應的ChatServer
c. StatusServer(負載調度)
- 管理所有ChatServer的連接數(“排隊人數”)
- 動態統計,做負載最小的Server的選擇
- 作用類似:超市每個收銀臺可以實時看到等待人數,然后引導客戶去排隊少的柜臺
d. grpc通信
- grpc:一種高效的遠程通信協議,像快遞包裹一樣,快速、可靠地傳遞信息
- 通過grpc,ChatServer之間端對端可以直接調用,相當于兩個超市的收銀員可以直接交換信息,不需要經過中轉站
e. 連接池(ChatConPool)
- 連接grpc的“橋梁”,如超市里備用的快速通道
- 避免每次通信都重新建連接,節省資源,提高效率
3. 工作流程(用戶請求全流程)
假設用戶要登錄,系統是如何實現的?
- 用戶發起登錄請求(輸入賬號密碼)
- GateServer收到請求
- 通過調用StatusServer查詢負載信息, 發現“ChatServer A”連接數最少
- GateServer把用戶登錄請求(ID、Token等信息)轉發到“ChatServer A”
- ChatServer A確認用戶信息后,返回登錄成功
- GateServer將用戶ID綁定到會話中,存入Redis(或者內存)
- 用戶正式登錄成功(連接完畢)
之后用戶發消息:
- 用戶消息發到GateServer
- GateServer識別到用戶已登錄
- 直接將消息轉發到對應的ChatServer
- 聊天內容由目標ChatServer處理
負載均衡(動態匹配)
- 每次用戶登錄或請求,GateServer會實時調用StatusServer,#找到連接數最少的ChatServer
- 這樣確保每個服務都不會過載,從而保證系統平穩運行
4. 跨Server通信(端對端grpc)
- 由于多個ChatServer都通過grpc連接,彼此可以調用服務
- 這樣可以實現:
- 跨Server轉發消息(比如:A和B兩個Server的用戶聊天)
- 其他交互(好友關系校驗、同步消息等)
5. 用戶連接數管理
- 每個ChatServer:啟動后,向Redis設置自己的連接數(初始為0)
- 每當用戶連接/斷開:更新連接數
- 連接:增加
- 斷開:減少
- StatusServer:實時讀取所有Server的連接數,做出負載匹配
三、各個組件詳細作用介紹
組件 | 作用 | 作用比喻 |
---|---|---|
GateServer | 客戶端入口,負責請求轉發、負載均衡 | 超市門口的工作人員,迎接客戶 |
StatusServer | 監控每個ChatServer連接數,提供負載分配依據 | 超市中監控排隊人數的管理員 |
ChatServer | 具體處理聊天邏輯,存儲好友關系、聊天歷史等 | 超市的收銀臺,客戶排隊等候 |
grpc通信 | 各Service端點間可靠、快速的網絡通訊 | 快遞車,直接送貨到不同超市的貨架 |
連接池(ChatConPool) | 管理grpc連接,避免頻繁創建,提升效率 | 超市備用通道,快速通達收銀臺 |
Redis | 存儲用戶狀態、連接數信息,快速查詢 | 超市排隊系統,實時統計等待人數 |
四、總結和思路重點
- 多服務器部署:將系統分別部署多個ChatServer,避免單點失效,提升性能
- 動態負載均衡:請求到達GateServer,實時通過StatusServer匹配負載最小的Server,確保公平分配
- grpc端對端通信:多Server可以直接交互,保證消息轉發效率
- 連接數管理:實時監控每個Server的連接情況,依據連接數來做負載調度
- 高效通信:利用grpc連接池,減少連接創建/銷毀的開銷
五、建議理解路徑
- 把整體流程圖記住:用戶-門面-負載調度-聊天處理(跨Server)
- 重點理解