移動IM開發指南1 如何進行技術選型

2021-09-11 11:52:46 字數 1565 閱讀 7768

移動im開發指南2:心跳指令詳解

移動im開發指南3:如何優化登入模組

im通訊方式無非兩種選擇:裝置直連(p2p)和通過伺服器中轉

1. p2p

p2p多見於區域網內聊天工具,典型的應用有:飛鴿傳書等。這類軟體在啟動後一般做兩件事情:

2. 伺服器中轉

幾乎所有網際網路im產品都採用伺服器中轉這種方式進行訊息傳輸,相對於p2p的方式,它有如下的優點:

當然它也有自己的問題:伺服器架構複雜,併發要求高。

im主流網路連線方式有兩種:

後者常見於web im系統(當然現在很多web im都是基於websocket實現),它的優點是實現簡單,方便開發上手,問題是流量大,伺服器負載較大,訊息及時性無法很好地保證,對大規模的使用者量支援不夠,比較適合小型的im系統,如小**的客戶系統。

基於tcp長連線則能夠更好地支援大批量使用者,問題是客戶端和伺服器的實現比較複雜。當然也還有一些變種,如下行使用mqtt進行伺服器通知/訊息的下發,上行使用http短連線進行指令和訊息的上傳。這種方式能夠保證下行訊息/指令的及時性,但是在弱網路下上行慢的問題還是比較嚴重。早期的來往就是基於這種方式。

im協議選擇原則一般是:易於拓展,方便覆蓋各種業務邏輯,同時又比較節約流量。後一點的需求在移動端im上尤其重要。

常見的協議有:xmpp;sip;mqtt;私有協議。

mqtt的優點是協議簡單,流量少,但是它並不是乙個專門為im設計的協議,多使用於推送。

乙個好的協議需要滿足如下條件:高效,簡潔,可讀性好,節約流量,易於拓展,同時又能夠匹配當前團隊的技術堆疊。基於如上原則,我們可以推出: 如果團隊小,團隊技術在im上積累不夠可以考慮使用xmpp或者mqtt+http短連線的實現。反之可以考慮自己設計和實現私有協議。

移動網際網路相對於有線網路最大特點是:頻寬低,延遲高,丟包率高和穩定性差,流量費用高。所以在私有協議的序列化上一般使用二進位制協議,而不是文字協議。常見的二進位制序列化庫有protobuf和messagepack,當然你也可以自己實現自己的二進位制協議序列化和反序列的過程,比如蘑菇街的teamtalk。但是前面二者無論是可拓展性還是可讀性都完爆teamtalk(teamtalk連variant都不支援,乙個int傳輸時固定占用4個位元組),所以大部分情況下還是不推薦自己去實現二進位制協議的序列化和反序列化過程。

基於tcp的應用層協議一般都分為包頭和包體(如http),im協議也不例外。包頭一般用於表示每個請求/反饋的公共部分,如包長,請求型別,返回碼等。 而包頭則填充不同請求/反饋對應的資訊。

乙個最簡單的包頭可以定義為

以心跳包為例,假設當前的serial為1,心跳包的command為10,那麼使用messagepack做序列化時:length=4,serial=1,command=10,code=0,每個欄位各佔乙個位元組,包體為空,僅需要4個位元組。

當然這是最簡單的乙個例子,面對真正的業務邏輯時,包體裡面會需要塞入更多地資訊,這個需要開發根據自己的業務邏輯總結公共部分,如為了相容加入的協議版本號,為了負載均衡加入的模組id等。

上面就是im系統大致的選型過程,包含了通訊方式,連線方式,協議選擇,協議設計。但是實際開發過程中還有大量的問題需要處理。《移動im開發指南》系列文章第二篇將會為大家解答實際開發中的常見問題。

移動IM開發指南3 如何優化登入模組

推薦閱讀 移動im開發指南1 如何進行技術選型 移動im開發指南2 心跳指令詳解 在移動 im 模組中,最核心最複雜的模組莫過於登入模組。乙個沒有經過很好優化的登入模組往往耗時久且浪費流量 一次登入短則數十秒,長則幾分鐘,同時同步下幾百 kb 甚至幾m的資料。乙個簡單的登入步驟可以分為如下幾步 l ...

移動IM開發指南2 心跳指令詳解

網易雲信多年ios im sdk開發的經驗,深度分析實際開發中的各種常見問題。移動im開發指南1 如何進行技術選型 移動im開發指南3 如何優化登入模組 在使用 tcp 長連線的 im 服務設計中,往往都會涉及到心跳。心跳一般是指某端 絕大多數情況下是客戶端 每隔一定時間向對端傳送自定義指令,以判斷...

移動IM開發學習 1

一.通訊方式 im通訊方式有兩種選擇 裝置直連 p2p 和通過伺服器中轉。1.p2p p2p多見於區域網內聊天工具,典型的應用有 飛鴿傳書,天網maze等。這類軟體在啟動後一般做兩件事情 進行udp廣播 傳送自己資訊和接受同區域網內其他端資訊 開啟tcp監聽 等待其他端進行連線 2.伺服器中轉 幾乎...