1、前言
有過移動端開發經歷的開發者都深有體會:移動端IM的開發,與傳統PC端IM有很大的不同,尤其無線網絡的不可靠性、移動端硬件設備資源的有限性等問題,導致一個完整的移動端IM架構設計和實現都充滿着大量的挑戰。本文將簡述移動端IM最重要的架構設計和通信協議選擇方面的坑點,希望爲IM開發者同行帶來些許啓發。(本文同步發佈於:http://www.52im.net/thread-289-1-1.html)
2、學習交流
- 即時通訊開發交流羣: 215891622 [推薦]
- 移動端IM開發推薦文章:《新手入門一篇就夠:從零開發移動端IM》
3、概述
移動互聯網時代的來臨促使我們所有的開發者都要從用戶視角出發,基於某一特定場景來創建應用,滿足用戶需求。通常,在這些應用中,溝通環節都是必不可少的。這就要求創業者不僅要花時間和精力來琢磨用戶在某一特定場景下有何痛點需求,琢磨如何解決這一需求,並且可能還要花費更多的精力和時間來解決產品中“溝通”這一技術節點。
而要解決溝通問題,就需要一套IM系統(而且肯定要支持移動端)。做爲IM開發者或即將成爲IM開發者的技術人員,IM的價值和重要性不言自明。但從技術實現來說,這並不容易。當然,假設你有100個用戶,什麼都是容易的,但是假設你有了100萬、1000萬甚至1億的用戶,再簡單的技術節點解決不好,都會成爲災難,何況IM系統(尤其是移動端的IM系統)還是存在許多技術難點和坑點的。
4、有關移動端IM通信協議的坑
其次,我們再看一下IM 協議如何選型。通常IM採取的協議有xmpp、mqtt、protobuf等數據通信私有協議,我們來逐一分析他們的優缺點。
1. XMPP協議:
- 優點:基於xml協議,容易理解,使用廣泛,易於擴展。
- 缺點:流量大,在移動終端也耗電。交互過程複雜。多被pc時代的產品使用,不適合移動時代的IM產品,即使我們基於xmpp進行改進,簡化握手過程,改進文件傳輸機制,但是它的基因決定了如何改進,他都不適合移動互聯網時代的IM產品。就像鳳姐無論怎麼整容,也變成不了高圓圓一樣。
2. MQTT協議:
- 優點:適配多平臺。
- 缺點:協議簡單,但是需要自己擴展好友,羣組等功能。
3. 私有協議:
- 優點:隨心所欲,自己定義,流量小。
- 缺點:工作量巨大,擴展性差,需要考慮全面。
4. Protobuf協議:
- 優點:非常小、非常快、非常簡單,一條消息數據用Protobuf序列化後的大小是JSON的1/10、XML格式的1/20、是二進制序列化的1/10。
- 缺點:不能表示複雜的數據結構,但是對於IM來講,已經足夠。強烈推薦此協議。
補充1:強列建議使用Protobuf,理由如下
- 靈活、高效:靈活(方便接口更新)、高效(效率經過google的優化,傳輸效率比普通的XML等高很多);
- 易於使用:開發人員通過按照一定的語法定義結構化的消息格式,然後送給命令行工具,工具將自動生成相關的類,可以支持java、c++、python等語言環境。通過將這些類包含在項目中,可以很輕鬆的調用相關方法來完成業務消息的序列化與反序列化工作。
- 語言支持:原生支持c++、java、python等多達10餘種語言。
補充2:Protobuf主要適用於
- 需要和其它系統做消息交換的,對消息大小很敏感的。那麼protobuf適合了,它語言無關,消息空間相對xml和json等節省很多。
- 小數據的場合。如果你是大數據,用它並不適合。
- 項目語言是c++、java、python等,因爲它們可以使用google的源生類庫,序列化和反序列化的效率非常高。其它的語言需要第三方或者自己寫,序列化和反序列化的效率不保證。
總體而言,Protobuf還是非常好用的,被很多開源系統用於數據通信的工具,在google也是核心的基礎庫。
(更多文章:《強列建議將Protobuf作爲你的即時通訊應用數據傳輸格式》、《如何選擇即時通訊應用的數據傳輸格式》、《理論聯繫實際:一套典型的IM通信協議設計詳解》)
5、移動端IM客戶端的坑
最後,我們再來了解一下移動端有哪些難點需要解決。
1. 流量:
採取哪種協議、圖片縮略圖、附件的壓縮三點決定了流量的大小。
2. 耗電:
(1)流量越小,耗電越低。(2)心跳策略,減少心跳次數,耗電量就會降低。
3. 心跳時長:
wifi,2G,3G,4G,移動、電信、聯通,不同網絡,不同運行商,NAT失效時間不一樣,因此心跳的時間也就不一樣。
4. 網絡連接:
cmnet和cmwap下連接處理機制。
5. 網絡不穩定:
移動端最大的特點就是網絡不穩定,在不穩定的網絡狀態下,如何保證消息以最快的速度到達?如何避免重聯風暴?這些既需要從整體架構考慮,也需要在移動端採取巧妙的策略加以避免。
(更多文章:移動端IM開發需要面對的技術問題)
6、移動端IM架構設計的坑
首先,來看移動端IM架構設計需要考慮的問題。
1. 連接器的設計:
連接器主要用來管理客戶端的長連接。目前最好的連接器單臺8G8核的服務器可以做到70萬—100萬的連接,而某些開發者只能做到4000左右的連接,相差好幾個數量級。這裏的奧妙在哪裏呢?
2. 中間件的設計:
是否採用通訊中間件?通訊中間件的好處有哪些?如果不採用中間件,連接器和邏輯服務器的連接關係如何管理呢?
3. 邏輯服務器:
邏輯服務器通常簡單一點,主要是根據業務邏輯進行最小粒度的劃分即可。但是即便如此,還是有很多的開發者把看似相關實則不相關的邏輯放在一起,如把鑑權和message服務器放在一起。
4. 狀態服務器:
狀態服務器主要管理用戶在線、離線的相關狀態,需要採取中心節點的方案,否則狀態就會不同步。這裏主要需要考慮狀態服務器所對應的數據存儲機制,如何進行寫操作,如何進行讀操作?以便最大的提高狀態服務器的處理能力和響應速度。
5. 數據庫的設計:
數據庫的設計是最難的,也是做大的瓶頸。因爲無論對於sql(關係型)數據庫還是nosql(非關係型)數據庫,都有讀寫處理的極限,那就需要考慮數據庫如何分區(根據什麼原則、什麼操作、哪些用戶訪問哪個節點上的數據庫)。同時又需要考慮每個原子操作(如登陸)需要讀哪些庫,寫哪些庫。只有這些指標明確了,你才能在假設有100萬併發用戶,100萬條併發消息的情況下,準確評估服務端需要多少臺服務器,如何部署。
6. 其他:
還有設備推送的處理,何種機制能夠保證不丟消息,離線消息如何處理,等等。這些都是必備而又非常複雜的功能點和技術要求,都需要採取正確的架構和策略才能實現。
(更多文章:http://www.52im.net/forum.php?mod=collection&action=view&ctid=7)
7、結語
以上難點和坑點草草記錄下來也不過千把字,但是真正要解決這些問題並達到生產應用標準,卻要不知道花費多少日日夜夜、敲下多少行代碼,恐怕也只有真正做過IM的開發者纔有比較深刻的體會。(本文同步發佈於:http://www.52im.net/thread-289-1-1.html)
附錄:更多IM技術文章
[1] 網絡編程基礎資料:
《TCP/IP詳解 - 第11章·UDP:用戶數據報協議》
《TCP/IP詳解 - 第17章·TCP:傳輸控制協議》
《TCP/IP詳解 - 第18章·TCP連接的建立與終止》
《TCP/IP詳解 - 第21章·TCP的超時與重傳》
《理論經典:TCP協議的3次握手與4次揮手過程詳解》
《理論聯繫實際:Wireshark抓包分析TCP 3次握手、4次揮手過程》
《計算機網絡通訊協議關係圖(中文珍藏版)》
《NAT詳解:基本原理、穿越技術(P2P打洞)、端口老化等》
《UDP中一個包的大小最大能多大?》
《Java新一代網絡編程模型AIO原理及Linux系統AIO介紹》
《NIO框架入門(三):iOS與MINA2、Netty4的跨平臺UDP雙向通信實戰》
《NIO框架入門(四):Android與MINA2、Netty4的跨平臺UDP雙向通信實戰》
>> 更多同類文章 ……
[2] 有關IM/推送的通信格式、協議的選擇:
《爲什麼QQ用的是UDP協議而不是TCP協議?》
《移動端即時通訊協議選擇:UDP還是TCP?》
《如何選擇即時通訊應用的數據傳輸格式》
《強列建議將Protobuf作爲你的即時通訊應用數據傳輸格式》
《移動端IM開發需要面對的技術問題(含通信協議選擇)》
《簡述移動端IM開發的那些坑:架構設計、通信協議和客戶端》
《理論聯繫實際:一套典型的IM通信協議設計詳解》
《58到家實時消息系統的協議設計等技術實踐分享》
>> 更多同類文章 ……
[3] 有關IM/推送的心跳保活處理:
《Android進程保活詳解:一篇文章解決你的所有疑問》
《Android端消息推送總結:實現原理、心跳保活、遇到的問題等》
《爲何基於TCP協議的移動端IM仍然需要心跳保活機制?》
《微信團隊原創分享:Android版微信後臺保活實戰分享(進程保活篇)》
《微信團隊原創分享:Android版微信後臺保活實戰分享(網絡保活篇)》
《移動端IM實踐:實現Android版微信的智能心跳機制》
《移動端IM實踐:WhatsApp、Line、微信的心跳策略分析》
>> 更多同類文章 ……
[4] 有關WEB端即時通訊開發:
《新手入門貼:史上最全Web端即時通訊技術原理詳解》
《Web端即時通訊技術盤點:短輪詢、Comet、Websocket、SSE》
《SSE技術詳解:一種全新的HTML5服務器推送事件技術》
《Comet技術詳解:基於HTTP長連接的Web端實時通信技術》
《WebSocket詳解(一):初步認識WebSocket技術》
《socket.io實現消息推送的一點實踐及思路》
>> 更多同類文章 ……
[5] 有關IM架構設計:
《淺談IM系統的架構設計》
《簡述移動端IM開發的那些坑:架構設計、通信協議和客戶端》
《一套原創分佈式即時通訊(IM)系統理論架構方案》
《從零到卓越:京東客服即時通訊系統的技術架構演進歷程》
《蘑菇街即時通訊/IM服務器開發之架構選擇》
《騰訊QQ1.4億在線用戶的技術挑戰和架構演進之路PPT》
《微信技術總監談架構:微信之道——大道至簡(演講全文)》
《如何解讀《微信技術總監談架構:微信之道——大道至簡》》
《快速裂變:見證微信強大後臺架構從0到1的演進歷程(一)》
《17年的實踐:騰訊海量產品的技術方法論》
>> 更多同類文章 ……
[6] 有關IM安全的文章:
《即時通訊安全篇(一):正確地理解和使用Android端加密算法》
《即時通訊安全篇(二):探討組合加密算法在IM中的應用》
《即時通訊安全篇(三):常用加解密算法與通訊安全講解》
《即時通訊安全篇(四):實例分析Android中密鑰硬編碼的風險》
《傳輸層安全協議SSL/TLS的Java平臺實現簡介和Demo演示》
《理論聯繫實際:一套典型的IM通信協議設計詳解(含安全層設計)》
《微信新一代通信安全解決方案:基於TLS1.3的MMTLS詳解》
《來自阿里OpenIM:打造安全可靠即時通訊服務的技術實踐分享》
>> 更多同類文章 ……
[7] 有關實時音視頻開發:
《即時通訊音視頻開發(一):視頻編解碼之理論概述》
《即時通訊音視頻開發(二):視頻編解碼之數字視頻介紹》
《即時通訊音視頻開發(三):視頻編解碼之編碼基礎》
《即時通訊音視頻開發(四):視頻編解碼之預測技術介紹》
《即時通訊音視頻開發(五):認識主流視頻編碼技術H.264》
《即時通訊音視頻開發(六):如何開始音頻編解碼技術的學習》
《即時通訊音視頻開發(七):音頻基礎及編碼原理入門》
《即時通訊音視頻開發(八):常見的實時語音通訊編碼標準》
《即時通訊音視頻開發(九):實時語音通訊的迴音及迴音消除概述》
《即時通訊音視頻開發(十):實時語音通訊的迴音消除技術詳解》
《即時通訊音視頻開發(十一):實時語音通訊丟包補償技術詳解》
《即時通訊音視頻開發(十二):多人實時音視頻聊天架構探討》
《即時通訊音視頻開發(十三):實時視頻編碼H.264的特點與優勢》
《即時通訊音視頻開發(十四):實時音視頻數據傳輸協議介紹》
《即時通訊音視頻開發(十五):聊聊P2P與實時音視頻的應用情況》
《即時通訊音視頻開發(十六):移動端實時音視頻開發的幾個建議》
《即時通訊音視頻開發(十七):視頻編碼H.264、V8的前世今生》
《簡述開源實時音視頻技術WebRTC的優缺點》
《良心分享:WebRTC 零基礎開發者教程(中文)》
>> 更多同類文章 ……
[8] IM開發綜合文章:
《移動端IM開發需要面對的技術問題》
《開發IM是自己設計協議用字節流好還是字符流好?》
《請問有人知道語音留言聊天的主流實現方式嗎?》
《IM系統中如何保證消息的可靠投遞(即QoS機制)》
《談談移動端 IM 開發中登錄請求的優化》
《完全自已開發的IM該如何設計“失敗重試”機制?》
《微信對網絡影響的技術試驗及分析(論文全文)》
《即時通訊系統的原理、技術和應用(技術論文)》
《開源IM工程“蘑菇街TeamTalk”的現狀:一場有始無終的開源秀》
>> 更多同類文章 ……
[9] 開源移動端IM技術框架資料:
《開源移動端IM技術框架MobileIMSDK:快速入門》
《開源移動端IM技術框架MobileIMSDK:常見問題解答》
《開源移動端IM技術框架MobileIMSDK:壓力測試報告》
>> 更多同類文章 ……
[10] 有關推送技術的文章:
《iOS的推送服務APNs詳解:設計思路、技術原理及缺陷等》
《Android端消息推送總結:實現原理、心跳保活、遇到的問題等》
《掃盲貼:認識MQTT通信協議》
《一個基於MQTT通信協議的完整Android推送Demo》
《求教android消息推送:GCM、XMPP、MQTT三種方案的優劣》
《移動端實時消息推送技術淺析》
《掃盲貼:淺談iOS和Android後臺實時消息推送的原理和區別》
《絕對乾貨:基於Netty實現海量接入的推送服務技術要點》
《移動端IM實踐:谷歌消息推送服務(GCM)研究(來自微信)》
《爲何微信、QQ這樣的IM工具不使用GCM服務推送消息?》
>> 更多同類文章 ……
[11] 更多即時通訊技術好文分類:
http://www.52im.net/forum.php?mod=collection&op=all
作者:Jack Jiang (點擊作者姓名進入Github)
出處:http://www.52im.net/space-uid-1.html
交流:歡迎加入即時通訊開發交流羣 215891622
討論:http://www.52im.net/
Jack Jiang同時是【原創Java Swing外觀工程BeautyEye】和【輕量級移動端即時通訊框架MobileIMSDK】的作者,可前往下載交流。