特性
保證消息可達、消息不重複,高可用。常用功能
- 發送成功、已讀未讀,以及未讀數量
- 好友、分組、黑名單
- 羣聊
- 網絡問題,友好提示,重試機制
- 用戶狀態維護,心跳機制,是否在線,丟失消息存儲。
協議涉及
- 傳輸層:TCP
- 安全層:一人一密 一次一密。斷定網絡上的數據包都能被截取,祕鑰在客戶側生成。動態祕鑰。
- 應用層:定長包頭,變長包體
// 包頭
struct header
{
magic_num ;// 魔數,分包斷包
cmd //命令號
key // 異步key,請求id
log_id // 日誌id
body // 二進制 protobuf or json
}
// 包體,即body中的數據
message Request{
cmd;
version;
uid;
seq;
content;
}
// content 內容
message CMsgContent{
from_uid;
to_uid;
time;
msg_id;
msg_data;
}
核心模塊
- 接入層netry 連接整流,安全信道,初步攻防
- 邏輯層 原子業務邏輯
- 內存存儲router 內存存儲 消息路由
固話存儲
原子數據訪問,cache與存儲引擎,對上層提供接口,調用方不用關注落庫是MongoDB或者MySQL
核心架構
- 多機房:分組,同連
- 水平擴展:分號段,無狀態
- 高可用:冗餘,多加集羣,可用區
- 負載均衡:隨機與平均
核心流程
登錄:
在router登記狀態,記錄entry的ip
聊天:
應用層ACK,上下半場,6個請求,
等待ACK隊列;被調用方方去重
SMC:
- single message communication
- 任何端到端的消息傳遞協議都必將引入消息丟失或消息重複
- 工程啓示:不可能構建既不丟失消息也不造成消息重複的即時通訊系統,可行的是通過各種手段降低這件事出現的可能性。唯一messgeid 去重。
自己yy:目前java技術棧大多都是用netty+websocket,在tcp層上進行連接,所謂的百萬級連接,還依賴linux的連接數