本文由百度技術團隊分享刑赶,引用自百度Geek說,原題“百度Android IM SDK組件能力建設及應用”酥郭,本文進行了排版和內(nèi)容優(yōu)化华坦。
1、引言
移動互聯(lián)網(wǎng)時代不从,隨著社交媒體惜姐、移動支付、線上購物等行業(yè)的快速發(fā)展,對即時通訊功能的需求不斷增加歹袁。對于各APP而言坷衍,接入IM SDK(即時通訊軟件開發(fā)工具包)能夠大大降低開發(fā)成本、提高開發(fā)效率条舔,快速構(gòu)建自己的IM系統(tǒng)枫耳。
本文主要介紹了百度公共IM系統(tǒng)的Andriod端IM SDK的建設背景、IM SDK主要結(jié)構(gòu)和工作流程以及建設過程遇到的問題和解決方案孟抗。
* 推薦閱讀:百度技術團隊分享的另一篇關于IM能力的文章《揭秘百度IM消息中臺的全量用戶消息推送技術改造實踐》迁杨。
2、認識IM系統(tǒng)
2.1IM系統(tǒng)發(fā)展背景
近年來夸浅,隨著互聯(lián)網(wǎng)的普及和移動通信技術技術的快速發(fā)展仑最,智能手機、平板電腦等移動設備的普及讓越來越多的人享受到便捷的網(wǎng)絡服務帆喇。這為即時通訊系統(tǒng)的發(fā)展提供了廣泛的用戶基礎。
傳統(tǒng)的通訊工具如電話亿胸、短信等在滿足用戶需求方面存在一定的局限性坯钦,無法實現(xiàn)高效、便捷地溝通侈玄。即時通訊系統(tǒng)應運而生婉刀,以其強大的功能和便捷的體驗滿足了用戶的便捷潘悼、高效通訊的需求棒动。
2.2IM系統(tǒng)簡介
即時通訊系統(tǒng)(Instant Messaging船惨,簡稱IM系統(tǒng))是一種允許用戶通過互聯(lián)網(wǎng)實時交換信息的通信技術。核心功能包括消息的發(fā)送與接收缕陕、用戶狀態(tài)的管理扛邑、消息锦爵、會話的存儲與檢索等。為了更好地滿足用戶更多場景訴求,IM系統(tǒng)還提供了如群組聊天伟恶、文件傳輸、語音和視頻通話等功能。
PS:更多知識可以深入閱讀《零基礎IM開發(fā)入門(一):什么是IM系統(tǒng)?》、《知識科普:IM聊天應用是如何將消息發(fā)送給對方的抓督?(非技術篇)》燃少。
2.3IM系統(tǒng)應用場景
即時通訊系統(tǒng)的發(fā)展經(jīng)歷了從早期的在線聊天室铃在、ICQ阵具、MSN等個人即時通訊軟件,到如今功能豐富的聊天社交軟件(如QQ定铜、微信)怔昨、企業(yè)級即時通訊系統(tǒng)(如釘釘、企業(yè)微信宿稀、飛書、如流)赖捌、應用內(nèi)必備的IM能力(如百度祝沸、微博、小紅書越庇、抖音等APP中消息模塊)等應用場景罩锐。
IM系統(tǒng)因其實時性、便捷性和功能多樣性卤唉,已經(jīng)成為現(xiàn)代社會溝通不可或缺的工具涩惑,并且隨著技術的發(fā)展,其應用場景還在不斷擴展桑驱。
PS:移動互聯(lián)網(wǎng)時代的IM產(chǎn)品進化史可詳讀《盤點移動互聯(lián)網(wǎng)時代的社交產(chǎn)品進化史(上篇):誰主沉浮》竭恬、《盤點移動互聯(lián)網(wǎng)時代的社交產(chǎn)品進化史(下篇):大浪淘沙》。
3熬的、百度公共IM系統(tǒng)背景
在百度公司內(nèi)部痊硕,存在如百度APP、文心一言APP押框、百度貼吧APP岔绸、好看視頻APP等各類APP,各業(yè)務各自搭建一套完整的IM系統(tǒng)存在開發(fā)、維護成本高盒揉,系統(tǒng)重復等問題晋被。
因此,搭建一套公共的能夠滿足各產(chǎn)品線訴求的完整IM系統(tǒng)勢在必行刚盈。各業(yè)務只需獨立接入公共IM系統(tǒng)即可實現(xiàn)業(yè)務自己的IM相關功能羡洛,大大降低了開發(fā)、維護成本和IM系統(tǒng)使用門檻扁掸,提高了業(yè)務IM功能開發(fā)翘县、迭代效率。
4谴分、公共IM系統(tǒng)整體結(jié)構(gòu)
對于公司內(nèi)業(yè)務而言锈麸,對于IM能力訴求各有差異:
1)有的業(yè)務希望最小成本構(gòu)建自己的IM服務,希望提供一套從消息收發(fā)到上層聊天交互的完整服務牺蹄;
2)有的業(yè)務希望使用自己的UI套件忘伞;
3)有的業(yè)務只想使用粉絲群能力;
4)也有業(yè)務有自己的UI和業(yè)務邏輯沙兰,只想使用基礎氓奈、實時、穩(wěn)定的消息通道鼎天。
為了滿足各業(yè)務/產(chǎn)品線各類訴求舀奶,需要將IM系統(tǒng)能力進行拆分、封裝斋射,提供不同能力粒度的IM組件育勺。
百度公共IM系統(tǒng)由客戶端IM 套件(IM SDK、長連接SDK罗岖、IM插件涧至、群聊組件)和服務端IM服務組成。
公共IM系統(tǒng)服務各業(yè)務方案結(jié)構(gòu)如下:
基礎服務層主要由公共IM系統(tǒng)中客戶端IM套件桑包、服務端IM服務南蓬,以及業(yè)務自己服務端組成。
業(yè)務客戶端通過接入IM SDK哑了、長連接SDK實現(xiàn)業(yè)務客戶端內(nèi)IM相關能力赘方,業(yè)務服務端通過接入公共IM系統(tǒng)中的服務端對外接口層,實現(xiàn)業(yè)務服務端消息發(fā)送和接收垒手。通過業(yè)務客戶端和服務單接入IM客戶端套件和服務端蒜焊,實現(xiàn)從業(yè)務端到業(yè)務服務端的雙向觸達。
其中:
1)?業(yè)務服務端:業(yè)務自己的服務端主要負責業(yè)務相關的業(yè)務邏輯處理科贬,通過調(diào)用IM 服務端提供的公共接口進行消息發(fā)送泳梆,接收IM 服務端推送的消息鳖悠,進行業(yè)務自有邏輯處理,根據(jù)業(yè)務自身情況決定是否自己持有數(shù)據(jù)优妙。
2)IM 服務端:提供實時乘综、安全、穩(wěn)定的登錄服務套硼、消息收發(fā)卡辰,消息會話同步、通知邪意,消息九妈、會話管理,用戶信息管理雾鬼、設置管理等服務萌朱。提供各服務對端接口,暴露對業(yè)務公共接口策菜,方便業(yè)務快速接入晶疼。
3)??長連接SDK主要職責:長連接SDK主要通過約定數(shù)據(jù)協(xié)議、數(shù)據(jù)加解密又憨、訪問控制翠霍、數(shù)據(jù)壓縮、創(chuàng)建蠢莺、維護連接寒匙,處理異常等機制保證數(shù)據(jù)實時、安全躏将、高效傳輸蒋情。
4)?IM SDK主要職責:IM SDK主要負責IM相關端業(yè)務邏輯處理,包括登錄服務耸携、消息、會話管理辕翰、未讀數(shù)管理夺衍、用戶、設置管理等能力喜命。用戶使用手機進行消息發(fā)送沟沙,使用IM 服務端對端接口協(xié)議,通過長連接SDK數(shù)據(jù)通道將消息發(fā)送到IM 服務端壁榕;通過長連接通道接收IM 服務端推送消息矛紫,經(jīng)過業(yè)務邏輯處理后,觸達到用戶牌里。
5)?IM插件主要職責:通過長連接SDK構(gòu)建消息通道颊咬,使用IM SDK提供的IM邏輯服務層务甥,增加聊天頁、設置頁等相關UI能力喳篇,打包構(gòu)建出能夠直接集成使用的聊天組件敞临。
6)?群聊組件主要職責:通過長連接SDK構(gòu)建消息通道,使用IM SDK提供的IM邏輯服務層麸澜,將群聊相關UI頁面組合打包挺尿,輸出包含完整群聊能力可直接集成的群聊組件。
5炊邦、Android端IM SDK的整體架構(gòu)
Android IM SDK整體由公共接口層编矾、業(yè)務層和數(shù)據(jù)層組成,其中:
1)接口層:根據(jù)業(yè)務需要馁害,對外統(tǒng)一提供消息窄俏、會話、設置項等相關操作接口以及未讀數(shù)蜗细、成員等相關查詢接口裆操;
2)業(yè)務層:在原始數(shù)據(jù)基礎上增加業(yè)務相關邏輯,通過接口層返回給SDK使用方炉媒。
3)數(shù)據(jù)層:數(shù)據(jù)層主要包含業(yè)務產(chǎn)生的原始數(shù)據(jù)的存儲以及對原始數(shù)據(jù)的最原始操作踪区。
業(yè)務層包括但不限于以下主要模塊:
1)登錄管理:負責在IM SDK初始化后長連接建連、重連吊骤,百度賬號體系登錄缎岗、退登、重登等情況下白粉,IM 系統(tǒng)的登錄传泊、退登,登錄信息鸭巴、事件管理以及異常處理機制等眷细;
2)同步管理:負責在IM登錄后同步單聊、群聊會話鹃祖,消息溪椎、通知消息等賬號內(nèi)相關數(shù)據(jù);
3)配置管理:登錄后負責管理用戶在IM系統(tǒng)中相關全部配置項恬口;
4)通知管理:負責用戶處于在線/離線狀態(tài)時系統(tǒng)通知處理校读,包括但不限于通知監(jiān)聽、解析祖能、指令調(diào)度分發(fā)等操作歉秫;
5)消息管理:基于原始消息數(shù)據(jù),提供消息發(fā)送养铸、刪除雁芙、更新轧膘、撤回、查詢等操作却特;
6)會話管理:負責基礎會話數(shù)據(jù)管理以及會話創(chuàng)建扶供、更新、刪除裂明、查詢以及會話監(jiān)聽管理椿浓、變更分發(fā)等機制;
7)群成員/好友管理:管理登錄后會話中的一些聯(lián)系人數(shù)據(jù)以及群成員信息闽晦;
8)群管理:負責管理群消息扳碍、群操作(如拉人、 踢人仙蛉、退群笋敞、解散、禁言荠瘪、增加管理員等操作)夯巷;
6、Android端IM SDK的核心流程概覽
登錄同步主要流程:
消息上下行主要流程:
在IM SDK整個工作流程中哀墓,核心流程主要包括:
1)登錄管理:初始化趁餐、長連接連接管理、IM登錄篮绰、退登等后雷;
2)數(shù)據(jù)同步:消息、會話用戶信息等數(shù)據(jù)同步吠各;
3)通知管理:離線臀突、在線通知處理;
4)消息上下行等核心流程贾漏。
IM SDK組件要在保證消息安全候学、可靠、實時觸達到用戶的同時纵散,還要避免消息丟失盒齿、重復、用戶離線狀態(tài)消息丟失困食、在線或離線狀態(tài)多端數(shù)據(jù)不一致、以及未讀數(shù)不一致等問題翎承。
PS:相關文章可以詳讀以下幾篇:
《零基礎IM開發(fā)入門(三):什么是IM系統(tǒng)的可靠性硕盹?》
《零基礎IM開發(fā)入門(四):什么是IM系統(tǒng)的消息時序一致性?》
《IM消息送達保證機制實現(xiàn)(一):保證在線實時消息的可靠投遞》
《IM消息送達保證機制實現(xiàn)(二):保證離線消息的可靠投遞》
《談談移動端 IM 開發(fā)中登錄請求的優(yōu)化》
《移動端IM登錄時拉取數(shù)據(jù)如何作到省流量瘩例?》
下面的章節(jié)是關于IM SDK核心流程詳細介紹啊胶。
7、核心流程1:登錄管理
IM系統(tǒng)登錄成功是使用IM服務的前提垛贤,準備使用IM服務時焰坪,要對IM SDK依賴的基礎環(huán)境、功能能力進行初始化配置聘惦,達到環(huán)境可用后才能登錄系統(tǒng)某饰,IM系統(tǒng)登錄成功后能庆,才能完整使用IM SDK提供能力浦马。
挑戰(zhàn):依賴的運行環(huán)境變更時,如何快速恢復民效?
問題描述:完整的IM工作環(huán)境需要有正常的網(wǎng)絡禀酱,百度賬號登錄且狀態(tài)正常炬守,長連接穩(wěn)定可用等,如果其中一個必要依賴異常時剂跟,IM系統(tǒng)便處于異常狀態(tài)减途,無法繼續(xù)完整使用IM SDK能力,出現(xiàn)SDK接口調(diào)用結(jié)果不符合預期的情況曹洽。比如網(wǎng)絡斷開或不可用時鳍置,長連接處于斷連狀態(tài),對IM SDK如何感知衣洁?網(wǎng)絡再次可用時墓捻,IM 服務如何恢復?IM服務不可用時坊夫,無法接收到新消息砖第,IM服務恢復后,如何系統(tǒng)性地恢復环凿?
問題解決(異澄嗉妫恢復機制):此類問題發(fā)生后,為了避免IM服務長期不可使用智听,需要增加異秤鸾埽恢復機制,使得某些環(huán)境條件恢復正常時到推,IM系統(tǒng)服務能夠快速恢復到最新狀態(tài)考赛。
主要工作包含:
1)異常捕捉:增加網(wǎng)絡環(huán)境、賬號登錄狀態(tài)莉测、長連接連接狀態(tài)等環(huán)境監(jiān)聽感知颜骤;
2)異常反饋:捕獲異常后,需要在調(diào)用SDK接口時將用戶相關環(huán)境異常信息返回,反饋給調(diào)用方捣卤;
3)服務快速恢復:感知依賴環(huán)境恢復后忍抽,自動對流程中依賴重新配置八孝,重新登錄IM服務,恢復服務不可用期間用戶數(shù)據(jù)鸠项;
其中其核心流程如下:
具體是:
1)正常流程下:百度賬號登錄后初始化IM SDK干跛,IM SDK針對賬號、長連接等增加狀態(tài)監(jiān)聽(還包含IM相關消息祟绊、會話楼入、用戶信息等變更等業(yè)務相關監(jiān)聽),登錄長連接會登錄IM系統(tǒng)久免,IM系統(tǒng)登錄成功后同步用戶消息數(shù)據(jù)浅辙;
2)長連接狀態(tài)異常:長連接由于客戶端網(wǎng)絡或服務異常導致連接斷開時,根據(jù)IM SDK服務不可用阎姥,長連接重新連接后重新登錄IM系統(tǒng)记舆,登錄成功后增量同步用戶服務不可用之后的數(shù)據(jù);
3)賬號狀態(tài)異常:當用戶退出賬號登錄時呼巴,會先退出原賬號登錄泽腮,切換為游客用戶登錄;當用戶切換為其他賬號時衣赶,會先退出原賬號登錄诊赊,切換為新賬號登錄;增量同步用戶服務賬號時刻之后的數(shù)據(jù)府瞄。
通過以上流程碧磅,可以很好地避免因為網(wǎng)絡、長連接狀態(tài)遵馆、賬號狀態(tài)變更時鲸郊,IM服務能夠快速重試,重置登錄配置货邓,重新登錄IM秆撮,快速恢復用戶數(shù)據(jù),保持狀態(tài)異常前后换况,消息及時觸達职辨。
8、 核心流程2:數(shù)據(jù)同步
IM登錄成功后戈二,需要通過長連接SDK從服務端全量或增量同步當前用戶離線階段產(chǎn)生的單聊舒裤、群聊會話、消息觉吭、聯(lián)系人/群成員信息等數(shù)據(jù)腾供,更新未讀數(shù)、會話中l(wèi)astMsg等操作,保持用戶本地和服務端遠程數(shù)據(jù)一致台腥。
8.1挑戰(zhàn)一:如何提升客戶端和服務端性能的
問題描述:IM SDK在賬號登錄后,會登錄IM系統(tǒng)绒北,由于賬號登錄狀態(tài)時效較長黎侈,絕大部分情況下賬號均處于登錄狀態(tài),每次啟動APP時都會請求IM登錄闷游,IM登錄后再同步用戶會話和消息峻汉。百度APP擁有上億用戶,在用戶集中使用APP的時間區(qū)間內(nèi)脐往,qps量級非常大休吠,在服務端資源有限的情況下,大qps量級對IM服務端是一個不小的挑戰(zhàn)业簿。為了保持服務的穩(wěn)定性瘤礁,在資源有限的情況下,需要在業(yè)務邏輯上對請求做優(yōu)化梅尤,降低服務qps柜思,保持服務穩(wěn)定可用。
問題解決:(會話拉取versionCode機制+消息拉取隊列):針對以上背景巷燥,優(yōu)化的核心主要是在業(yè)務邏輯上減少IM登錄到IM同步期間的服務端請求赡盘。
主要優(yōu)化點如下:
1)客戶端登錄后減少非必須請求,總未讀數(shù)獲取由從服務端獲取缰揪,改為先使用客戶端本地計算陨享,同步數(shù)據(jù)后再更新;
2)客戶端每次同步會話時钝腺,將所有新會話放入同步隊列中抛姑,防止每個會話開一個線程,增加客戶端線程池飽和風險拍屑,減少服務端并發(fā)請求途戒。
3)服務端對會話同步請求增加versionCode機制:每次客戶端請求獲取會話后,服務端返回一個versionCode(如果后續(xù)有新會話僵驰,才會更新versionCode)喷斋,客戶端下次登錄再請求拉會話時如果傳參的versionCode和服務端最新的versionCode一致,表示沒有新會話蒜茴,不需要查庫等操作星爪,直接返回空結(jié)果。
主要流程如下:
8.2挑戰(zhàn)二:如何避免同步失敗時消息丟失問題
問題描述:為了降低服務端qps粉私,在拉取會話時增加了versionCode機制顽腾,如果第一次拉取會話后沒有新會話產(chǎn)生,后續(xù)拉會話時服務端根據(jù)versionCode判斷服務端和客戶端傳參versionCode一致,表示端上會話列表和服務端一致抄肖,直接返回結(jié)果久信,表示沒有新會話返回。如果在拉取完會話后漓摩,每條會話消息還未拉去完畢裙士,此時斷網(wǎng)或長連接中斷,導致部分會話的消息沒有拉取或沒有拉取完畢管毙,狀態(tài)恢復再次重試拉取時由于已經(jīng)獲取到了最新的versionCode腿椎,再次從server拉取會話時無法拉取到會話,導致部分會話消息丟失夭咬。
如果拉取某條會話的消息時啃炸,拉取請求服務異常,如果拋棄當前任務執(zhí)行之后的任務卓舵,依然請求異常南用,導致隊列中后續(xù)部分或剩余所有任務請求失敗,消息拉取失敗边器,導致無法拉取到部分會話消息训枢,導致消息丟失。
問題解決(versionCode延遲記錄+重試機制):
1)根據(jù)以上問題描述忘巧,對于問題1恒界,需要保持versionCode的有效性,對于問題一發(fā)生時砚嘴,客戶端當次獲取的versionCode其實已經(jīng)是失效狀態(tài)十酣,需要在會話、消息都拉取完畢時記錄versionCode际长,保持客戶端本地和服務端均有效耸采。
2)對于問題2,隊列中的任務要根據(jù)具體異常執(zhí)行跳過策略工育,如果是因為服務端內(nèi)部錯誤導致的同步失敗虾宇,可以跳過,對于網(wǎng)絡或長連接狀態(tài)異常如绸,可以增加重試機制嘱朽,超過重試次數(shù)才停止任務,從而增加消息拉取成功率怔接。
主要流程如下:
9搪泳、核心流程3:通知管理
9.1概述
通知下行:用戶在線階段,如過有新消息或者消息已讀扼脐、刪除岸军、會話刪除、置頂、免打擾狀態(tài)變更等多端同步情況時艰赞,服務端會下行對應通知消息佣谐,通知當前登錄設備處理新操作。
以新消息通知為例:如果有其他用戶給當前用戶發(fā)送消息方妖,消息到達服務端后台谍,服務端根據(jù)用戶在線狀態(tài),通過長連接通道下發(fā)新消息通知吁断;端根據(jù)約定解析對應通知消息,識別新消息通知坞生,開始拉取新消息操作仔役,拉取新消息后更新會話lastMsg、未讀數(shù)相關信息是己,轉(zhuǎn)發(fā)變更到業(yè)務層又兵,更新UI交互。
9.2挑戰(zhàn)一:如何實現(xiàn)同一賬號在線設備操作后卒废,其他離線設備在線時用戶數(shù)據(jù)一致性
問題概述:如果同一用戶有多臺手機沛厨,用戶部分設備處于離線狀態(tài)(設備斷網(wǎng)或未打開APP),如果用戶使用在線狀態(tài)的手機執(zhí)行了已讀會話摔认、刪除會話逆皮、刪除消息等操作,操作完畢后参袱,再打開離線的設備电谣,使其保持在線狀態(tài),此時剛保持在線狀態(tài)的設備會話抹蚀、消息剿牺、未讀數(shù)狀態(tài)仍未改變,出現(xiàn)兩臺設備消息/會話等狀態(tài)不一致問題环壤。
以已讀操作為例:如果當前用戶兩臺設備(設備A和設備B)都收到了用戶小明發(fā)來的5條消息晒来,設備B斷網(wǎng)或APP進程關閉。用戶使用一臺設備A已讀了和用戶小明的聊天信息郑现,設備A中和用戶小明的聊天會話中未讀數(shù)變?yōu)?湃崩;打開設備B,使其處于在線狀態(tài)懂酱,設備B和用戶小明的會話仍顯示有5條未讀數(shù)竹习。
問題解決(指令機制):對于此類用戶多設備的在線狀態(tài)不一致的情況,操作APP內(nèi)消息或會話后列牺,出現(xiàn)用戶多臺設備在線時設備數(shù)據(jù)不一致問題整陌,問題根源在于設備B重新在線后無法感知到設備A的操作,如果設備B重新在線后能獲取到設備A的操作,并執(zhí)行設備A的操作泌辫,就能保持兩臺(或多臺)設備數(shù)據(jù)一致随夸。
需要把用戶操作數(shù)據(jù)化,將用戶操作構(gòu)造為一條“指令”消息保存到服務端震放,等設備再次在線后宾毒,拉取到離線期間未接收到的消息后,拉取設備離線期間的操作指令消息殿遂,解析指令消息后诈铛,執(zhí)行對應的操作。
以設備在線后消息已讀指令消息為例墨礁,相關執(zhí)行流程如下:
9.3挑戰(zhàn)二:如何實現(xiàn)同一賬號多臺在線設備數(shù)據(jù)一致性
問題概述:IM系統(tǒng)中幢竹,數(shù)據(jù)一致性是指在多設備環(huán)境中,用戶如果有多臺設備或終端恩静,各個設備登錄同一賬號焕毫,各個設備下顯示的用戶消息數(shù)量、消息未讀狀態(tài)驶乾、會話未讀數(shù)邑飒、會話最近一條消息等要保持一致。
實際生活場景下级乐,一個用戶存在多臺設備疙咸,可能存在如下情case,即設備全部處于在線狀態(tài)风科。
如果當前用戶使用一臺設備(例如設備A)向用戶“小明”發(fā)送一條內(nèi)容為“你好啊”的消息罕扎,當前用戶的另一臺設備(例如設備B)也需要在和用戶小明的聊天也中顯示自己發(fā)送了一條內(nèi)容為“你好啊”的消息內(nèi)容。
問題解決(多端同步機制):對于同一賬號登錄多個設備的情況丐重,設備均在線時腔召,如果其中一臺設備發(fā)送一條消息(或者進行已讀、刪除消息扮惦、刪除會話臀蛛、修改會話置頂、免打擾狀態(tài)等操作)崖蜜,服務端會將新發(fā)送的消息通知推送到登錄同一賬號的其他設備上浊仆,其他設備接收到新消息通知后,再去拉取當前賬號在其他設備發(fā)送的消息豫领,更新會話抡柿,從而達到登錄同一賬號的多臺設備數(shù)據(jù)同步,保持數(shù)據(jù)一致性等恐。
每個操作對應于一條通知消息洲劣,登錄后同步當前設備離線期間產(chǎn)生的通知消息后备蚓,根據(jù)通知消息里攜帶的操作信息,再次執(zhí)行對應的操作囱稽,實現(xiàn)多端同步效果郊尝。
10、核心流程4:消息收發(fā)
10.1挑戰(zhàn)一:以什么樣的方式獲取新消息
問題描述:當有其他用戶給當前設備發(fā)消息時战惊,要實時展現(xiàn)其他用戶發(fā)送的消息流昏,就要及時地獲取到對應消息。
大概存在幾種方案:
解決方案(推拉結(jié)合):綜合以上方案吞获,保證服務穩(wěn)定性是系統(tǒng)的關鍵况凉,想要消息不丟失,并且能穩(wěn)定觸達的同時還要保證客戶端和服務端系統(tǒng)的穩(wěn)定性各拷,推拉結(jié)合的方案更適合茎刚。
方案描述:用戶發(fā)送新消息時,服務端揀選新消息關鍵信息字段撤逢,構(gòu)造一條通知消息推送給接收人。接收人收到通知消息后粮坞,解析通知消息內(nèi)容蚊荣,理解對用通知操作后,從服務端拉取新消息莫杈。
10.2挑戰(zhàn)二:如何保證消息可靠投遞
問題描述:系統(tǒng)需要保證消息的可靠傳輸互例,不會丟失或重復,確保消息的順序和完整性筝闹。
IM系統(tǒng)的消息“可靠性”媳叨,通常就是指聊天消息可靠投遞。即對于消息發(fā)送方發(fā)出消息关顷,要保證消息接收方及時糊秆、順序接收到,并在UI中正常展示(不丟失议双、不重復)痘番。(PS:相關文章可閱讀《零基礎IM開發(fā)入門(三):什么是IM系統(tǒng)的可靠性?》)
在現(xiàn)實的使用場景中平痰,從發(fā)送方點擊「發(fā)送」按鈕到接收方接收到消息汞舱,發(fā)送接收消息的整條鏈路中包含:
1)消息協(xié)議組裝;
2)長連接通道發(fā)消息宗雇;
3)服務端接收到消息昂芜;
4)服務端保存消息;
5)服務端通過長連接下行通知消息赔蒲;
6)接收方根據(jù)通知拉取消息泌神。
如果發(fā)送消息時接收方處理離線狀態(tài)良漱,或者發(fā)送消息時長連接因為網(wǎng)絡或異常中斷、服務端服務異常腻扇、消息下行時長連接異常等情況下债热,鏈路中任意一環(huán)異常導致鏈路中斷均會導致消息無法到達接收方,即消息丟失幼苛。
大致分為:
1)消息上行階段消息丟失窒篱;
2)消息下行階段消息丟失。
解決方案(失敗重試與重連拉取機制):想要保證實時&離線消息的可靠投遞舶沿,需要對收發(fā)消息的整條鏈路各階段增加從產(chǎn)品交互到技術方案上增加兜底和容錯處理墙杯。
消息上行服務異常處理增加失敗重試機制:
IM SDK發(fā)送上行請求,長連接因為網(wǎng)絡或其他原因?qū)е麻L連接服務不可用括荡、服務端服務異常時高镐,消息發(fā)送失敗,需要對發(fā)送失敗的消息做標記畸冲,UI上提供視覺展示嫉髓,增加重新發(fā)送機制,在交互上避免用戶發(fā)消息失敗時出現(xiàn)消息已發(fā)送對方收不到的錯誤預期邑闲,提高服務恢復時功能可用性算行。
消息下行重新拉取機制流程如下:
具體是:
1)對于服務端推送到客戶端的消息,服務端需要將消息存儲苫耸,如果用戶處于在線狀態(tài)州邢,則推送新消息通知給接收用戶;
2)如果服務端推送下行通知消息時褪子,接收方長連接服務處于不可用/不穩(wěn)定的情況量淌,端需要增加長連接連接狀態(tài)監(jiān)測,重連拉取機制嫌褪;監(jiān)測到長連接重新連接后呀枢,主動重新拉取服務不可用時刻之后的消息,保障用戶能夠及時看到離線期間漏掉的消息笼痛。
11硫狞、本文小結(jié)
根據(jù)各類APP對于IM系統(tǒng)不同構(gòu)建方案訴求,百度公共IM系統(tǒng)提供了包含IM各類能力粒度晃痴、高內(nèi)聚残吩、可擴展的長連接 SDK、IM SDK倘核、IM聊天插件泣侮、群聊組件;提供了中臺NA容器紧唱、HN容器活尊、公共Web容器下IM聊天頁接入方案隶校;依托IM 服務端,提供了一套實時蛹锰、可靠深胳、穩(wěn)定的IM服務。滿足了各業(yè)務方快速铜犬、高效構(gòu)建各自產(chǎn)品線IM能力的愿望舞终,大大提高了開發(fā)效率、降低了開發(fā)成本癣猾。
實時敛劝、可靠、安全是對IM系統(tǒng)的基礎要求纷宇,系統(tǒng)地收發(fā)消息機制提供了最小粒度的IM服務夸盟,實時通知、離線獲取能夠更好地保障IM功能完整性像捶,實時上陕、離線多端同步能力提升了同一賬號多臺設備的產(chǎn)品體驗。以功能拓春、交互體驗需求為出發(fā)點而進行方案設計的同時也要考慮產(chǎn)品性能以及端释簿、服務端、業(yè)務的實現(xiàn)成本痘儡。
隨著用戶需求和市場變化,我們需要不斷迭代優(yōu)化枢步,升級系統(tǒng)功能和性能沉删,更細致、高效地滿足業(yè)務訴求醉途,為用戶提供更加優(yōu)質(zhì)矾瑰、高效的即時通訊服務。
12隘擎、參考資料
[1]?零基礎IM開發(fā)入門(一):什么是IM系統(tǒng)殴穴?
[2]?知識科普:IM聊天應用是如何將消息發(fā)送給對方的?(非技術篇)
[4]?從客戶端的角度來談談移動端IM的消息可靠性和送達機制
[5]?從游擊隊到正規(guī)軍(二):馬蜂窩旅游網(wǎng)的IM客戶端架構(gòu)演進和實踐總結(jié)
[6]?談談移動端 IM 開發(fā)中登錄請求的優(yōu)化
[7]?IM開發(fā)干貨分享:如何優(yōu)雅的實現(xiàn)大量離線消息的可靠投遞
[8]?IM開發(fā)干貨分享:有贊移動端IM的組件化SDK架構(gòu)設計實踐
[9]?IM開發(fā)干貨分享:我是如何解決大量離線消息導致客戶端卡頓的
[10]?阿里技術分享:閑魚IM基于Flutter的移動端跨端改造實踐
[11]?IM開發(fā)干貨分享:IM客戶端不同版本兼容運行的技術思路和實踐總結(jié)
[12]?抖音技術分享:飛鴿IM桌面端基于Rust語言進行重構(gòu)的技術選型和實踐總結(jié)
[13]?大型IM工程重構(gòu)實踐:企業(yè)微信Android端的重構(gòu)之路
[14]?探探的IM長連接技術實踐:技術選型货葬、架構(gòu)設計采幌、性能優(yōu)化
[15]?攜程技術分享:億級流量的辦公IM及開放平臺技術實踐
[16]?微信團隊分享:來看看微信十年前的IM消息收發(fā)架構(gòu),你做到了嗎
[17]?一套億級用戶的IM架構(gòu)技術干貨(上篇):整體架構(gòu)震桶、服務拆分等
[18]?從新手到專家:如何設計一套億級消息量的分布式IM系統(tǒng)
[19]?企業(yè)微信的IM架構(gòu)設計揭秘:消息模型休傍、萬人群、已讀回執(zhí)蹲姐、消息撤回等
[20]?一套分布式IM即時通訊系統(tǒng)的技術選型和架構(gòu)設計
13磨取、百度的其它技術分享
百度APP移動端網(wǎng)絡深度優(yōu)化實踐分享(一):DNS優(yōu)化篇
百度APP移動端網(wǎng)絡深度優(yōu)化實踐分享(二):網(wǎng)絡連接優(yōu)化篇
百度APP移動端網(wǎng)絡深度優(yōu)化實踐分享(三):移動端弱網(wǎng)優(yōu)化篇
全面了解移動端DNS域名劫持等雜癥:原理人柿、根源、HttpDNS解決方案等
直播系統(tǒng)聊天技術(四):百度直播的海量用戶實時消息系統(tǒng)架構(gòu)演進實踐
IM消息ID技術專題(五):開源分布式ID生成器UidGenerator的技術實現(xiàn)
百度統(tǒng)一socket長連接組件從0到1的技術實踐
百度網(wǎng)盤千萬節(jié)點的P2P架構(gòu)設計(PPT) [附件下載]
即時通訊音視頻開發(fā)(二十):一文讀懂視頻的顏色模型轉(zhuǎn)換和色域轉(zhuǎn)換
百度基于金融場景構(gòu)建高實時忙厌、高可用的分布式數(shù)據(jù)傳輸系統(tǒng)的技術實踐