IM (一):基本介紹

By 紫韻: 最近對(duì) IM 系統(tǒng)產(chǎn)生了興趣,就看了些博客,現(xiàn)希望通過(guò)一個(gè)系列的文章對(duì)其稍作總結(jié)與記錄,如有不對(duì),還望指正。

IM 簡(jiǎn)介

IM:Instant Messaging,即時(shí)通訊,是一個(gè)允許兩人或多人通過(guò)網(wǎng)絡(luò)實(shí)時(shí)傳輸文字、語(yǔ)音、視頻等的終端服務(wù),如現(xiàn)在常用的 QQ、微信、百度 Hi 等。IM 完全基于 TCP/IP 網(wǎng)絡(luò)協(xié)議族實(shí)現(xiàn),而 TCP/IP 協(xié)議族則是整個(gè)互聯(lián)網(wǎng)得以實(shí)現(xiàn)的技術(shù)基礎(chǔ)。

通訊方式

典型的 IM 通訊方式有如下四種:

  • 在線直連通訊:即 P2P(Peer To Peer)對(duì)等通訊方式,也就是通信雙方直接建立通信連接進(jìn)行點(diǎn)對(duì)點(diǎn)的通信;
  • 在線中轉(zhuǎn)通訊: 通信雙方不是通過(guò)點(diǎn)對(duì)點(diǎn)直連方式進(jìn)行通信,而是通過(guò)一個(gè)服務(wù)端作為代理來(lái)進(jìn)行通信,即消息發(fā)送方將消息發(fā)送給服務(wù)器,然后服務(wù)器再將消息轉(zhuǎn)發(fā)給消息接收方;
  • 離線中轉(zhuǎn)通訊:以上兩種方式都是基于通信雙方均在線的前提之下,但是有時(shí)消息接收方并不一定剛好在線。當(dāng)消息接收方處于離線狀態(tài)時(shí),也需要采用服務(wù)端中轉(zhuǎn)方式進(jìn)行消息投遞。消息發(fā)送方現(xiàn)將消息發(fā)送到服務(wù)端,然后服務(wù)端轉(zhuǎn)儲(chǔ)消息,待消息接收方上線時(shí)再將消息轉(zhuǎn)發(fā)給接收方;
  • 擴(kuò)展通訊:擴(kuò)展通訊即調(diào)用其他通訊方式來(lái)完成通訊過(guò)程,如通過(guò)短信、Email、傳真等方式將消息從發(fā)送方投遞到接收方。

P2P && 服務(wù)器中轉(zhuǎn)
一般常用的 IM 通訊方式就是 P2P 和服務(wù)器中轉(zhuǎn)這兩種,下面簡(jiǎn)要對(duì)比分析這兩者的區(qū)別。

P2P:
P2P 多見(jiàn)于局域網(wǎng)內(nèi)聊天工具,典型的應(yīng)用有:飛鴿傳書、天網(wǎng) Maze 等。這類軟件在啟動(dòng)后一般做兩件事情:
進(jìn)行 UDP 廣播:發(fā)送自己信息和接受同局域網(wǎng)內(nèi)其他端信息;
開啟 TCP 監(jiān)聽(tīng):等待其他端進(jìn)行連接。

限制和不便:
只適合 ** 在線 ** 的 ** 點(diǎn)對(duì)點(diǎn) ** 消息傳輸,對(duì)離線、群組等業(yè)務(wù)支持不夠;
由于 NAT 的存在,使得不同局域網(wǎng)內(nèi)機(jī)器互聯(lián)難度大大上升,在某些網(wǎng)絡(luò)類型(對(duì)稱 NAT)下無(wú)法建立連接。

** 服務(wù)器中轉(zhuǎn) **
幾乎所有互聯(lián)網(wǎng) IM 產(chǎn)品都采用服務(wù)器中轉(zhuǎn)這種方式進(jìn)行消息傳輸,相比于 P2P 的方式,它的優(yōu)劣如下:

  • 優(yōu)點(diǎn):
    能夠支持更多P2P無(wú)法支持或支持不好的業(yè)務(wù),如離線消息,群組,聊天室服務(wù);
    方便業(yè)務(wù)邏輯的拓展和新舊版本的兼容。

  • 缺點(diǎn):服務(wù)器架構(gòu)復(fù)雜,并發(fā)要求高。

工作方式

** 典型的 IM 工作方式如下:**
客戶端登陸 IM 通訊中心(IM 通訊服務(wù)器),獲取好友列表,獲取離線消息,將自身標(biāo)志為在線狀態(tài),與聊天對(duì)象建立聊天通道,進(jìn)行文字、語(yǔ)音等通信。

  1. 用戶 A 通過(guò)用戶名和密碼登錄 IM 服務(wù)器,服務(wù)器通過(guò)讀取數(shù)據(jù)庫(kù)中用戶信息進(jìn)行校驗(yàn),校驗(yàn)通過(guò)后,登記用戶 A 的 ip 地址、IM 客戶端版本號(hào)、使用的 TCP/UDP 端口號(hào)等并標(biāo)記用戶 A 的狀態(tài)為在線,返回用戶 A 登錄成功標(biāo)志;
  2. 用戶 A 獲取好有列表信息(包括:在線狀態(tài)、IP 地址、TCP/UDP 端口號(hào)等)、離線消息;
  3. 服務(wù)器將用戶 A 的在線相關(guān)信息通知到其在線好友 ,包括:在線狀態(tài)、IP 地址、TCP/UDP 端口號(hào)等;
  4. 接下來(lái)用戶 A 就可以通過(guò)直連/服務(wù)器中轉(zhuǎn)方式與其它用戶進(jìn)行消息通信了。

IM 系統(tǒng)選型

一個(gè)典型的 IM 系統(tǒng)的選型過(guò)程大致包含如下幾個(gè)部分:

  • 服務(wù)方式:P2P or 服務(wù)器中轉(zhuǎn);
  • 網(wǎng)絡(luò)通訊協(xié)議:TCP or UDP;
  • 數(shù)據(jù)通信協(xié)議:XMPP、SIP、MQTT、Protobuf、私有協(xié)議;
  • 協(xié)議加密:加密流程的設(shè)計(jì)、加密算法的選擇;
  • 服務(wù)器:開源的 IM 服務(wù)器,如 OpenFire,Tigase,Prosody,Mosquitto,ejabberd等、自己的服務(wù)器。

** IM 系統(tǒng)架構(gòu)分層:**

  • ** 接入層(ENTRY):** 作為客戶端和服務(wù)端的接口子系統(tǒng),此層直接面對(duì) PC 桌面客戶端、WEB 網(wǎng)頁(yè)客戶端、移動(dòng) APPS 客戶端的海量長(zhǎng)連接請(qǐng)求,負(fù)責(zé)建立與客戶端通信的加密通道,整合成內(nèi)部少量有限的長(zhǎng)連接,對(duì)通信數(shù)據(jù)進(jìn)行壓縮與解壓,并將相應(yīng)請(qǐng)求轉(zhuǎn)發(fā)至邏輯層。除此之外,接入層實(shí)施初步的攻防策略,用來(lái)抵御非邏輯層面的攻擊,監(jiān)控某些數(shù)據(jù)(連接頻率、發(fā)包頻率、發(fā)包速率等),對(duì) IP/UID 等指標(biāo)實(shí)施封禁,IM 在某些緊急情況下,必須能夠迅速實(shí)施封禁,所以需要實(shí)時(shí)授權(quán) IP/UID 等黑白名單,使得白名單動(dòng)態(tài)生效、黑名單自動(dòng)解封。
  • ** 邏輯層(LOGIC):** 邏輯子系統(tǒng)主要是負(fù)責(zé)整個(gè) IM 系統(tǒng)的邏輯處理,包括用戶相關(guān)(用戶登錄登出、用戶信息設(shè)置查詢)、好友相關(guān)(添加好友、獲取好友、刪除好友、修改好友信息等)、消息相關(guān)(收發(fā)好友消息、收發(fā)陌生人消息、消息確認(rèn)、通用消息處理、離線消息等)等復(fù)雜邏輯處理。
  • ** 路由層(ROUTER):** 路由子系統(tǒng)主要處理和用戶一次登錄 session 相關(guān)的數(shù)據(jù)(比如:用戶在線狀態(tài)[在線、離開、隱身],登錄IP等),這部分涉及的數(shù)據(jù)變化非常快,沒(méi)必要固化,直接存儲(chǔ)在內(nèi)存中。并記錄用戶登錄接入層的路由信息,支持向指定 UIDS 通信的功能。
  • ** 數(shù)據(jù)層(DATA ACCESS):** 統(tǒng)一數(shù)據(jù)訪問(wèn)子系統(tǒng)屏蔽了底層的存儲(chǔ)引擎,上層無(wú)需關(guān)心實(shí)際的存儲(chǔ)是 RDBMS 或者 NoSQL 或者其他的 KV 存儲(chǔ)引擎,對(duì)上層提供友好、統(tǒng)一的訪問(wèn)接口,封裝原子邏輯。并通過(guò) CURD 接口的抽象封裝,增加新的數(shù)據(jù)操作只需要增加配置,不用變動(dòng)數(shù)據(jù)層代碼,較容易完成關(guān)鍵數(shù)據(jù)的存儲(chǔ)。
  • ** 數(shù)據(jù)存儲(chǔ)層(DATA STORAGE):** 數(shù)據(jù)存儲(chǔ)層是 IM 的固化存儲(chǔ)系統(tǒng),根據(jù)業(yè)務(wù)數(shù)據(jù)特點(diǎn)決定使用何種持久化存儲(chǔ)方式(RDBMS(MySQL)、NoSQL(MongoDB)等),并通過(guò)分布式緩存(Memcached、Redis等)加速查詢。

一個(gè)典型的 IM 系統(tǒng)可能由如下及部分組成:

  • 客戶端:用于讓用戶接入系統(tǒng);
  • 注冊(cè)服務(wù)器:用戶接入系統(tǒng)時(shí)使用,提供鑒權(quán)等相應(yīng)處理;
  • 連接服務(wù)器:用于保持與所有用戶的連接,狀態(tài)消息的通知以及客戶會(huì)話請(qǐng)求時(shí)通信服務(wù)器相關(guān)信息的返回;
  • 通信服務(wù)器:用于通信渠道的建立以及離線信息的保存。包括離線文件傳輸。根據(jù)實(shí)際情況可以考慮增加一臺(tái)文件服務(wù)器,供通信服務(wù)器使用;
  • 數(shù)據(jù)庫(kù)服務(wù)器:提供對(duì)于數(shù)據(jù)庫(kù)所有的操作接口。所有關(guān)于數(shù)據(jù)庫(kù)的操作均歸必須通過(guò)該臺(tái)位;
  • 鑒權(quán)服務(wù)器:可有可無(wú),供注冊(cè)服務(wù)器使用,主要用于鑒權(quán)。

IM 系統(tǒng)功能點(diǎn)/技術(shù)點(diǎn)分析

*** 功能點(diǎn)分析:***

  • 注冊(cè)登錄:注冊(cè)方式(手機(jī)、郵箱、昵稱)、登錄驗(yàn)證(注冊(cè)信息、三方、手機(jī)動(dòng)態(tài)驗(yàn)證登錄)等;
  • 聊天:文字、語(yǔ)音、圖片、視頻、表情;單聊、群聊;
  • 傳輸服務(wù):文本傳輸、文件傳輸;
  • 好友 / 群組管理:添加、刪除、查找好友 / 群;
  • 多端服務(wù):PC 端、Android 端、IOS 端等;
  • 用戶信息管理。

*** 技術(shù)點(diǎn)分析:***

  • 登錄優(yōu)化:

    • 登錄方式:注冊(cè)信息、三方、手機(jī)驗(yàn)證碼動(dòng)態(tài)登錄、無(wú)需登錄等;
    • LBS 請(qǐng)求:異步化,不在登錄時(shí)進(jìn)行 LBS 請(qǐng)求,而是在網(wǎng)絡(luò)空閑和發(fā)生變化時(shí)進(jìn)行請(qǐng)求并緩存,每次登錄則直接從本地緩存獲取連接地址,以加快登錄速度;
    • DNS 優(yōu)化:移動(dòng)端 DNS 解析時(shí)間長(zhǎng)、準(zhǔn)確率較低、容易被劫持,特別需要優(yōu)化;優(yōu)化策略:
      • 使用 HTTP DNS,如開源的 HttpDNSLib;
      • 盡可能避免 DNS 解析請(qǐng)求:如 LBS 直接返回待連接的服務(wù)器的 IP 地址而非域名;本地緩存 LBS IP 地址備用,請(qǐng)求 LBS 時(shí)優(yōu)先使用 IP 而非域名;
    • 登錄認(rèn)證請(qǐng)求的優(yōu)化;
    • 數(shù)據(jù)同步策略優(yōu)化:用戶登錄 IM 系統(tǒng)后,需要在主界面呈現(xiàn)用戶的好友列表、群組列表等信息,主要包括:好友列表、好友詳情信息、群組列表、群組詳情信息、群成員列表、群成員詳情信息等。如果所有信息均在登錄過(guò)程中進(jìn)行同步的話,登錄過(guò)程會(huì)耗時(shí)很長(zhǎng),并且流量消耗很大,從而導(dǎo)致用戶體驗(yàn)很差,大致可以從如下幾個(gè)方面進(jìn)行優(yōu)化:
      • 按時(shí)間戳同步:客戶端只同步比本地緩存新的數(shù)據(jù);
      • 延遲加載和按需更新:初始頁(yè)面并不需要將所有信息均提供給用戶,而是只需要保證映入用戶眼簾的頁(yè)面信息完全即可,這些信息主要有:好友列表、群組列表、離線消息記錄;而好友詳情信息、群組詳情信息、群成員列表和群成員詳情信息等均可以在用戶進(jìn)入相應(yīng)的頁(yè)面再按需更新或等到網(wǎng)絡(luò)空閑時(shí)再加載即可;
  • 服務(wù)器負(fù)載優(yōu)化:多服務(wù)器專職化,各司其職(專門用于登錄、鑒權(quán)、狀態(tài)管理的服務(wù)器;專門用于消息通信的服務(wù)器等);服務(wù)器集群;分流(如可考慮消息直連通信 P2P);

  • 消息同步機(jī)制

  • 消息可靠性保證

  • 消息時(shí)序性和一致性

  • 消息推送機(jī)制

  • 心跳?;顧C(jī)制

移動(dòng)端 IM 技術(shù)難點(diǎn)

** 移動(dòng)端 IM 客戶端難點(diǎn) **

  1. ** 流量:**移動(dòng)端流量費(fèi)較貴,所以省流量是移動(dòng)端產(chǎn)品特別需要注意的性能指標(biāo)??梢詮木W(wǎng)絡(luò)通信協(xié)議、數(shù)據(jù)通訊協(xié)議、圖片壓縮技術(shù)、附件壓縮技術(shù)等方面著手減少流量消耗;
  2. ** 耗電量 :**移動(dòng)端的電量比較少,充電比較麻煩,需要注意電量消耗。一般來(lái)說(shuō),流量越小,耗電量越少;心跳次數(shù)越少,耗電量越少,不過(guò)這需要結(jié)合具體的業(yè)務(wù)場(chǎng)景來(lái)制定恰當(dāng)?shù)男奶呗裕?/li>
  3. ** 心跳時(shí)長(zhǎng):**WIFI、2G、3G、4G、移動(dòng)、電信、聯(lián)通等不同網(wǎng)絡(luò)、不同運(yùn)行商下 NAT 失效時(shí)間是不一樣的,因此心跳的時(shí)間也應(yīng)當(dāng)區(qū)別對(duì)待;
  4. ** 掉線重連機(jī)制** ;
  5. ** 網(wǎng)絡(luò)不穩(wěn)定:**移動(dòng)端最大的特點(diǎn)就是網(wǎng)絡(luò)切換頻繁,從而導(dǎo)致網(wǎng)絡(luò)不穩(wěn)定,并且不同的網(wǎng)絡(luò)環(huán)境下需要進(jìn)行不同的處理(如 WIFI 網(wǎng)絡(luò)和移動(dòng)網(wǎng)絡(luò)需要區(qū)別對(duì)待)。在不穩(wěn)定的網(wǎng)絡(luò)狀態(tài)下,如何保證消息的到達(dá)率?如何保證消息以最快的速度到達(dá)?如何避免重聯(lián)風(fēng)暴?這些既需要從整體架構(gòu)考慮,也需要在移動(dòng)端采取巧妙的策略加以避免;
  6. ** 文件上傳優(yōu)化 **。

** 移動(dòng)端架構(gòu)設(shè)計(jì)的難點(diǎn) **

  1. ** 連接器的設(shè)計(jì):**連接器主要用來(lái)管理客戶端的長(zhǎng)連接;
  2. ** 中間件的設(shè)計(jì):**是否采用通訊中間件?各種通訊中間件的優(yōu)劣分析與選擇?如果不采用中間件,如何管理連接器和邏輯服務(wù)器的連接關(guān)系?
  3. ** 邏輯服務(wù)器:**邏輯服務(wù)器通常簡(jiǎn)單一點(diǎn),主要是根據(jù)業(yè)務(wù)邏輯進(jìn)行最小粒度的劃分即可;
  4. ** 狀態(tài)服務(wù)器:**狀態(tài)服務(wù)器主要管理用戶在線、離線的相關(guān)狀態(tài)。狀態(tài)同步機(jī)制如何實(shí)現(xiàn)?狀態(tài)存儲(chǔ)機(jī)制,如何進(jìn)行讀寫操作從而最大限度地提高狀態(tài)服務(wù)器的處理能力和響應(yīng)速度;
  5. ** 數(shù)據(jù)庫(kù)的設(shè)計(jì):**數(shù)據(jù)庫(kù)設(shè)計(jì)相對(duì)來(lái)說(shuō)比較難,當(dāng)業(yè)務(wù)增長(zhǎng)時(shí)容易成為性能瓶頸。因?yàn)闊o(wú)論是 SQL 關(guān)系型數(shù)據(jù)庫(kù),還是 NOSQL 非關(guān)系型數(shù)據(jù)庫(kù)均有讀寫處理上限。
  6. ** 其他:**如推送機(jī)制、消息的可靠投遞、消息同步機(jī)制、消息的時(shí)序性和一致性如何保證、在線消息和離線消息的區(qū)別對(duì)待等。這些都是必備而又非常復(fù)雜的功能技術(shù)點(diǎn),都需要采取正確的架構(gòu)和策略才能實(shí)現(xiàn)。

參考文章

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,716評(píng)論 25 709
  • 點(diǎn)擊查看原文 Web SDK 開發(fā)手冊(cè) SDK 概述 網(wǎng)易云信 SDK 為 Web 應(yīng)用提供一個(gè)完善的 IM 系統(tǒng)...
    layjoy閱讀 14,273評(píng)論 0 15
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,502評(píng)論 19 139
  • 都說(shuō)三十而立,我這都三十好幾的人了,怎么就越來(lái)越迷茫呢?我是誰(shuí)?我想要什么?我深在迷霧當(dāng)中,看不清,摸不到...
    Lily乜力閱讀 443評(píng)論 0 0
  • 全息網(wǎng)游之青樓
    孤鴻焚盡天意閱讀 184評(píng)論 0 1

友情鏈接更多精彩內(nèi)容