IM之架構與細節

特性

保證消息可達、消息不重複,高可用。常用功能

  • 發送成功、已讀未讀,以及未讀數量
  • 好友、分組、黑名單
  • 羣聊
  • 網絡問題,友好提示,重試機制
  • 用戶狀態維護,心跳機制,是否在線,丟失消息存儲。

協議涉及

  • 傳輸層: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:

  1. single message communication
  2. 任何端到端的消息傳遞協議都必將引入消息丟失或消息重複
  3. 工程啓示:不可能構建既不丟失消息也不造成消息重複的即時通訊系統,可行的是通過各種手段降低這件事出現的可能性。唯一messgeid 去重。

自己yy:目前java技術棧大多都是用netty+websocket,在tcp層上進行連接,所謂的百萬級連接,還依賴linux的連接數

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章