日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

IM推送保障及网络优化详解(二):如何做长连接加推送组合方案

發(fā)布時間:2025/3/8 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 IM推送保障及网络优化详解(二):如何做长连接加推送组合方案 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

對于移動APP來說,IM功能正變得越來越重要,它能夠創(chuàng)建起人與人之間的連接。社交類產(chǎn)品中,用戶與用戶之間的溝通可以產(chǎn)生出更好的用戶粘性。

在復(fù)雜的 Android 生態(tài)環(huán)境下,多種因素都會造成消息推送不能及時達(dá)到客戶端。另外,不穩(wěn)定的移動網(wǎng)絡(luò)也給數(shù)據(jù)傳輸?shù)乃俾屎涂煽啃栽黾恿苏系K。

本文詳解了網(wǎng)易云信IM SDK在應(yīng)對弱網(wǎng)環(huán)境、移動端硬件限制以及Android復(fù)雜的生態(tài)現(xiàn)狀時的探索與心得.如何實現(xiàn)不影響用戶體驗的后臺保活,改善的長連接加推送組合方案,以及在弱網(wǎng)環(huán)境大數(shù)據(jù)傳輸?shù)膬?yōu)化實踐。

相關(guān)閱讀推薦:
網(wǎng)易云信即時通訊推送保障及網(wǎng)絡(luò)優(yōu)化詳解(一)如何做長連接加推送組合方案

網(wǎng)易云信即時通訊推送保障及網(wǎng)絡(luò)優(yōu)化詳解(三)如何在弱網(wǎng)環(huán)境下優(yōu)化大數(shù)據(jù)傳輸

如何做長連接

對于?IM?來說,及時的消息推送和較低的電量消耗也并非不可兼得。在傳統(tǒng)上,每個IM客戶端都會各自維護(hù)一條與服務(wù)器的長連接,自己的消息和信令都在這條長連接上傳遞,每個APP也獨自去心跳,斷線重連等事情。

這種模式比較簡單,不同的APP也是完全隔離的,不會互相影響。但他的缺點也非常明顯,首先是做了很多重復(fù)的事情,造成了流量和電量的無謂消耗;第二是要保證所有的進(jìn)程都能在后臺運行很難。優(yōu)化的方向也就非常明顯了,那就是共享連接,現(xiàn)在絕大部分推送SDK也是這么做的。從這些APP里面選出一個當(dāng)前正在運行的,或者是被殺概率最低的APP作為總代理,只由這個代理和服務(wù)器建立連接,一個手機(jī)上的所有其他APP都通過這個代理中轉(zhuǎn)與服務(wù)器通信。但是,IM有一個很基本的要求在這種模式下無法得到滿足:安全。所有APP的消息都經(jīng)過代理中轉(zhuǎn),代理到服務(wù)器的連接是加密的,安全的,但到了代理這里,消息都被解開了,因此代理理論上可以看到其他所有APP的來往消息。因此,這種共享長連接的方式并不適用于IM。

雖然共享長連接方式不合適,但仍然提供了一個優(yōu)化的思路。在此基礎(chǔ)上,有另一個可以脫敏共享連接的方式:安全長連接加推送連接模式。

每個APP在使用和真正傳遞數(shù)據(jù)時,仍然獨立使用自己的安全長連接。而當(dāng)APP退到后臺一段時間之后,則斷開長連接,然后每個APP開啟一個推送代理,并選擇其中一個和網(wǎng)易云信的推送服務(wù)器建立連接,之后當(dāng)APP有新消息時,就通過這個推送連接傳遞。APP可以自己控制發(fā)出的推送消息的安全級別,可以是包含說話人和消息內(nèi)容,可以只包含說話人,或者只是一條簡單的有新消息到達(dá)的提醒文案。推送到達(dá)后,如果是代理APP自己的消息,直接傳遞給代理APP即可。如果是其他APP消息,前面說到過,直接喚醒可能會失敗,而且會導(dǎo)致無謂的電量消耗,所以這里并不直接將提醒傳遞給目標(biāo)APP,而是由帶來發(fā)出一條通知欄提醒。等用戶去點擊通知欄提醒后,才會把目標(biāo)APP喚醒。

現(xiàn)在國內(nèi)的ROM中,華為和小米的系統(tǒng)本來是帶有推送系統(tǒng),且開放給了第三方APP的。在這兩個系統(tǒng)上,使用系統(tǒng)的推送通道明顯會更加穩(wěn)定,也更加節(jié)省資源。因此在MIUI上,從長連接到推送通道的切換流程仍然和前面的一樣,只是不再使用自己的推送連接,而是將消息轉(zhuǎn)發(fā)到MIUI的推送服務(wù)器,然后轉(zhuǎn)給MIUI系統(tǒng)的推送代理,然后傳遞給網(wǎng)易云信的APP。華為的推送系統(tǒng)流程也是一樣。不過現(xiàn)在華為和MIUI在推送實現(xiàn)上有一些區(qū)別,例如MIUI的通知欄提醒是在自己的推送代理里完成的,而華為卻是將提醒通知交給APP自己去完成的,另外,他們的通知欄提醒的管理接口也有很多區(qū)別。在APP沒有被禁用的情況下,兩者都可以收到推送,而如果APP已經(jīng)被禁用了,MIUI的通知欄提醒方式還可以將推送送達(dá),而其他的推送方式則不能送達(dá)了。

以上就是在保障消息推送方面所能夠做的所有事情了。如果以后有更多的系統(tǒng)開放自己的推送系統(tǒng)也可以選擇逐步接入,以提高推送到達(dá)即時性,減少資源消耗。不過相應(yīng)的,也要承受不斷加入各種系統(tǒng)的推送SDK,增大發(fā)布包體積的缺點。?

移動通信網(wǎng)絡(luò)的三個特點

第一個是慢,尤其是2G,3G網(wǎng)絡(luò),慢的令人發(fā)指。

第二個是斷,手機(jī)跟著人不停的移動,網(wǎng)絡(luò)也不停的在切換,從wifi到移動網(wǎng)絡(luò),從一個基站到另一個基站,從有信號到?jīng)]信號,都可能導(dǎo)致網(wǎng)絡(luò)中斷。有些制式的網(wǎng)絡(luò),接打電話也會導(dǎo)致數(shù)據(jù)網(wǎng)絡(luò)斷開。另外,移動基站還有NAT超時,到一個連接上長時間空閑后,基站就會默默的將連接斷開,沒有任何通知。

第三個是貴,這個就不用多說。

三種長連接類型

在網(wǎng)易云信整個通信系統(tǒng)中有3種類型的連接:TCP,UDP,HTTP。雖說這三個并不是同一層的協(xié)議,不過畢竟都在應(yīng)用的更下層,因此這么劃分也無妨。3種類型的協(xié)議對應(yīng)了不同的業(yè)務(wù)應(yīng)用。TCP主要是用戶長連接,也就是普通IM消息和信令的傳輸,UDP用于傳輸實時音視頻數(shù)據(jù)流,而HTTP則主要用在音頻,圖片等文件的上傳下載上。對于不同的業(yè)務(wù),SDK優(yōu)化的關(guān)注點會有一些不相同。

IM長連接優(yōu)化怎么做?

第一個是協(xié)議的選擇。前面說,長連接的使用量是最大,選擇一個合適的協(xié)議至關(guān)重要。如果是剛開始接觸IM開發(fā),一般會選擇一些開源的協(xié)議,比如XMPP,SIP等。這是XMPP協(xié)議的一個請求樣例,可以看到是一段XML格式的文本數(shù)據(jù)。


這是基于SIP的SIMPLE協(xié)議的一個請求樣例,可以看到是一段類似HTTP協(xié)議的文本數(shù)據(jù)。這些協(xié)議的優(yōu)勢在于開源,有成熟的解決方案可以使用,擴(kuò)展性好,甚至還可以和其他系統(tǒng)互聯(lián)互通,協(xié)議的可讀性也非常好。但是在普遍比較臃腫,冗余字段很多,在昂貴的移動網(wǎng)絡(luò)里面用起來會比較浪費。網(wǎng)易云信采用的是私有的二進(jìn)制協(xié)議,這是一個請求的數(shù)據(jù)樣例,這里是把二進(jìn)制數(shù)據(jù)轉(zhuǎn)為了16進(jìn)制顯示出來,每個字節(jié)這里顯示為兩個字符。可以看到二進(jìn)制協(xié)議的特點在于完全失去了可讀性,但是,卻帶來極高的表達(dá)效率,相對于文本協(xié)議,可以節(jié)省非常多的數(shù)據(jù)流量。

另一個例子是登錄的優(yōu)化。由于移動網(wǎng)絡(luò)經(jīng)常斷開,所以登錄常常是心跳之外交互最多的協(xié)議了。使用量越大,優(yōu)化就越有意義。一般而言,登錄會經(jīng)過這么幾步。


第一步是LBS。這里的LBS不是經(jīng)常說的基于地址位置的服務(wù),在不同的廠商可能也有不同的叫法,反正作用都是獲取服務(wù)器的IP地址。像云信這種需要提供全球服務(wù)的系統(tǒng),在世界各地都要部署服務(wù)器,用戶登錄時,肯定要選擇一臺最優(yōu)的服務(wù)器接入服務(wù)。通過lbs,客戶端可以獲取離自己最近,連通性最好的服務(wù)器連接機(jī)IP地址,服務(wù)器也可以據(jù)此做負(fù)載均衡。

拿到服務(wù)器連接機(jī)IP后,客戶端就去連接該服務(wù)器。

連接成功,需要有一次握手。這個握手不是TCP的三次握手,而是為了建立安全連接,同服務(wù)器協(xié)商加密算法和加密密鑰。

然后就發(fā)送登錄請求,這里會帶上用戶認(rèn)證信息,本機(jī)設(shè)備信息等數(shù)據(jù)。

登錄成功之后,就是同步數(shù)據(jù),包括離線消息,用戶信息,群組信息等。一般而言,這里不會去做全量同步,而是采用基于時間戳的增量同步。

在移動網(wǎng)絡(luò)上,每一次交互都需要比較長的時間,同時,每一次網(wǎng)絡(luò)請求電量消耗也是很大的。所以,優(yōu)化的方向就是盡量減少交互次數(shù),而方法則是合并請求,并行操作以及省略請求。

LBS和連接這兩個步驟是可以并行完成的。如果前面已經(jīng)獲取過LBS,這里可以有之前的緩存地址,如果沒有,可以先連一個默認(rèn)地址。

其次是握手和登錄也可以并行操作。在握手包中,就可以把加密后的登錄包直接帶上去了。如果是斷線重連,網(wǎng)易還可以簡化登錄,直接帶上上一次登錄的會話ID,一來減少服務(wù)器鑒權(quán)壓力,二則可以直接帶回在斷線期間是否有未讀消息等數(shù)據(jù),如果沒有,則能直接將同步這一步省略掉。如果有,同步也可以只做部分同步,只去拉去離線消息即可。等到APP切換到前臺,才去同步其他的信息。

通過這些優(yōu)化,登錄時間可以降為原來的1/2到1/3,登錄的流量消耗也可以節(jié)省30%左右。

總結(jié)

以上是生活随笔為你收集整理的IM推送保障及网络优化详解(二):如何做长连接加推送组合方案的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。