IM序列7:移動(dòng)端IM登錄時(shí)拉取數(shù)據(jù)如何作到省流量?

1、前言
移動(dòng)網(wǎng)絡(luò)時(shí)代,手機(jī)的流量是個(gè)很昂貴的資源(至少暫時(shí)是這樣)。一個(gè)典型的移動(dòng)端IM在登錄后,往往要向服務(wù)器同步非常多的數(shù)據(jù),如果處理的不好是很費(fèi)流量的,那么從技術(shù)上來講,有沒有節(jié)省流量的方法呢?這就是本文要討論的話題。

2、IM開發(fā)干貨系列文章
《IM消息送達(dá)保證機(jī)制實(shí)現(xiàn)(一):保證在線實(shí)時(shí)消息的可靠投遞》

《IM消息送達(dá)保證機(jī)制實(shí)現(xiàn)(二):保證離線消息的可靠投遞》

《如何保證IM實(shí)時(shí)消息的“時(shí)序性”與“一致性”?》

《IM單聊和群聊中的在線狀態(tài)同步應(yīng)該用“推”還是“拉”?》

《IM群聊消息如此復(fù)雜,如何保證不丟不重?》

《一種Android端IM智能心跳算法的設(shè)計(jì)與實(shí)現(xiàn)探討(含樣例代碼)》

《移動(dòng)端IM登錄時(shí)拉取數(shù)據(jù)如何作到省流量?》(本文)

《通俗易懂:基于集群的移動(dòng)端IM接入層負(fù)載均衡方案分享》

《淺談移動(dòng)端IM的多點(diǎn)登陸和消息漫游原理》
本系列由公號(hào)“編碼前線”整理。

3、移動(dòng)端IM登錄時(shí)需要拉取什么數(shù)據(jù)?

移動(dòng)端IM登陸時(shí),一般要拉取兩類數(shù)據(jù),一類是“id列表型數(shù)據(jù)”,一類是“信息詳情型數(shù)據(jù)”。

以微信為例,需要拉?。?br> 1)好友列表List<user-id>,即所有好友的id(id+name);

2)群組列表List<group-id>,即所有加入群的id(id+name);

3)群友列表Map<group-id, List<group-user-id>>,所有群友的id(id+name);

4)好友詳情Map<user-id, User>,所有好友的詳情(昵稱,備注,標(biāo)簽,地區(qū),相冊等);

5)群組詳情Map<group-id, Group>,所有群組的詳情(二維碼,公告,是否免打擾等);

6)群友詳情Map<group-id, Map<user-id, User>>,所有群友的詳情(昵稱,備注,標(biāo)簽,地區(qū),相冊等);

7)其他,例如離線消息…
4、能不能在登錄的過程中不拉取這些數(shù)據(jù),而在登錄后拉?。?/p>

如果登錄時(shí)不拉取,登陸后刷好友列表,刷群列表,群成員會(huì)很慢。

如果登錄時(shí)拉取,登陸過程可能會(huì)很慢(微信的“大月亮背景”要等多長時(shí)間?QQ登錄要等30s?)。

通常,為了保證登錄后的體驗(yàn),一般是在登錄過程中拉取。

5、能不能直接復(fù)用客戶端本地的數(shù)據(jù)?
原則上,不能直接復(fù)用客戶端本地的數(shù)據(jù),因?yàn)椴荒艽_保本地的數(shù)據(jù)是最新的。

但是每次登錄都需要拉取,太費(fèi)流量了,有沒有優(yōu)化方法?

常用優(yōu)化方法有兩種:

1)延遲拉取,按需拉??;

2)時(shí)間戳。

6、延遲拉取,按需拉取為什么有效?為什么能夠減少拉取流量?

用戶在使用移動(dòng)端IM的過程中,有些數(shù)據(jù)是一定會(huì)使用到的,有些數(shù)據(jù)是不一定會(huì)使用到的。對(duì)于一定會(huì)使用到的數(shù)據(jù),登錄時(shí)拉取可以提升后續(xù)用戶體驗(yàn)。對(duì)于不一定會(huì)使用到的數(shù)據(jù),登錄時(shí)拉取可能浪費(fèi)流量,這些數(shù)據(jù)如果進(jìn)行“延遲拉取”,可以節(jié)省流量。
7、哪些數(shù)據(jù)不登錄后不一定會(huì)使用,可以延遲拉?。?/p>

這個(gè)問題的答案和業(yè)務(wù)緊密相關(guān),以微信為例:
一定會(huì)使用到的數(shù)據(jù):好友列表(主頁面要展示user-name),群組列表(主界面要展示group-name)。
不一定會(huì)使用到的數(shù)據(jù):好友詳情,群組詳情,群友列表,群友詳情。
故,對(duì)于微信,登錄時(shí)只需要拉取好友列表(id+name)與群組列表(id+name)即可,而其他數(shù)據(jù),等用戶真正點(diǎn)擊和使用時(shí)再拉取即可,這樣就可以大大減少拉取流量。
8、時(shí)間戳為什么有效?為什么能夠減少拉取流量?
本地?cái)?shù)據(jù)不能直接使用的原因是,不確定數(shù)據(jù)是否最新,拉取服務(wù)器時(shí)間戳與本地時(shí)間戳進(jìn)行比對(duì),如果本地是最新的數(shù)據(jù),就能避免重新拉取。id列表數(shù)據(jù)的變化頻度是比較低的(增加id,減少id),時(shí)間戳機(jī)制非常的有效。

9、加入時(shí)間戳機(jī)制后,數(shù)據(jù)拉取流程有什么變化?
假設(shè)有100個(gè)好友,以好友詳情數(shù)據(jù)的拉取為例,沒有時(shí)間戳之前,直接向服務(wù)器拉取這100個(gè)好友的詳情數(shù)據(jù)。
在有了時(shí)間戳之后,數(shù)據(jù)拉取流程變?yōu)椋?br> 1)先拉取100個(gè)好友的時(shí)間戳;

2)客戶端將100個(gè)好友的時(shí)間戳與本地時(shí)間戳對(duì)比,找出差異,假設(shè)有10個(gè)好友的信息發(fā)生了變化,時(shí)間戳改變了;

3)拉取有變化的10個(gè)好友的信息。
優(yōu)點(diǎn)是:大大減少了數(shù)據(jù)傳輸量(由拉取100個(gè)好友,降低到拉取10個(gè)好友);

缺點(diǎn)是:增加了一次網(wǎng)絡(luò)交互(原來直接拉取,現(xiàn)在需要分別拉取時(shí)間戳與差異數(shù)據(jù))。

10、使用時(shí)間戳的同時(shí),能否降低網(wǎng)絡(luò)交互次數(shù)呢?

答案是:可以!

客戶端對(duì)時(shí)間戳的使用,往往采取“客戶端拉取時(shí)間戳”+“客戶端比對(duì)時(shí)間戳”+“客戶端再次拉取差異數(shù)據(jù)”的方式進(jìn)行,“時(shí)間戳比對(duì)”的的CPU計(jì)算發(fā)生在客戶端,其實(shí),這個(gè)計(jì)算可以轉(zhuǎn)嫁到服務(wù)器。
具體步驟為:
1)客戶端上傳100個(gè)好友的時(shí)間戳;
2)“服務(wù)端”收到客戶端上傳的時(shí)間戳,與最新時(shí)間戳對(duì)比,找出差異,假設(shè)有10個(gè)好友的信息發(fā)生了變化,服務(wù)端可以直接將有差異的10個(gè)好友的數(shù)據(jù)返回。
優(yōu)點(diǎn)是:客戶端減少了一次網(wǎng)絡(luò)請(qǐng)求;
缺點(diǎn)是:比對(duì)時(shí)間戳差異的CPU計(jì)算由“端”轉(zhuǎ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),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 點(diǎn)擊查看原文 Web SDK 開發(fā)手冊 SDK 概述 網(wǎng)易云信 SDK 為 Web 應(yīng)用提供一個(gè)完善的 IM 系統(tǒng)...
    layjoy閱讀 14,311評(píng)論 0 15
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,034評(píng)論 25 709
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,554評(píng)論 19 139
  • 十里長亭飄黃葉,那時(shí)語,傷離別。 依坐窗邊悲涼夜,這時(shí)嘆,緣起緣滅。
    孤鴻羽士閱讀 201評(píng)論 2 4
  • 踏三千輪回路 戰(zhàn)百世孤獨(dú)苦 苦海里泛舟 獨(dú)行黃泉路 只為有一天 能與你共赴紅塵 一顆心不再荒蕪
    墨染嵐城閱讀 312評(píng)論 0 0

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