微信Mars:客戶端跨平臺組件的開發經驗

to880109 8年前發布 | 14K 次閱讀 移動開發

12月9日,由InfoQ主辦的 中國技術開放日廣州站 將在廣州四季酒店舉行。我們邀請了來自騰訊、阿里、百度、唯品會的技術專家前來分享一線開發實踐。本次開放日上,來自微信的高級工程師周志杰將分享《微信Mars:移動互聯網下的高質量網絡連接探索》,對于這個話題,InfoQ采訪了周志杰,了解微信Mars是什么,以及微信在跨平臺組件開發上的一些經驗總結。

Mars 是微信官方的終端基礎組件,是一個使用 C++ 編寫的業務性無關,平臺性無關的基礎組件。目前已接入微信 Android、iOS、Mac、Windows、WP 等客戶端。現正在籌備開源中,它主要包括以下幾個部分:

  • COMM:基礎庫,包括socket、線程、消息隊列、協程等基礎工具;
  • XLOG:通用日志模塊,充分考慮移動終端的特點,提供高性能、高可用、安全性、容錯性的日志功能;
  • SDT:網絡診斷模塊;
  • STN:信令傳輸網絡模塊,負責終端與服務器的小數據信令通道。包含了微信終端在移動網絡上的大量優化經驗與成果,經歷了微信海量用戶的考驗。

其中STN(信令傳輸網絡)為核心模塊。

Mars最早起源于微信的實際發展需要。由于微信多平臺、億級用戶,微信基礎功能的修改影響重大。但不同平臺不同的實現導致眾多平臺上很難統一,一方面不利于質量把關,可能存在重大隱患,一方面也不利于微信對基礎研究的深入。因此,微信開始了跨平臺基礎組件的開發,并且在微信中沉淀多年。隨著基礎組件的發展與穩定,他們希望通過開源的力量進一步的提升微信的基礎,并且也期待行業的互相交流與促進,因此啟動了Mars項目。

微信的網絡層設計到很多不同的業務,在微信中使用到的絕大部分功能,都是基于Mars提供的網絡組件,包括文本消息、語音消息、朋友圈等核心功能。只有少部分業務不在范圍內,例如VOIP、Webview等。微信中使用到的網絡服務,大體分為兩種類型:信令網絡、數據網絡。其中STN負責信令網絡,CDN組件則負責數據網絡。但由于CDN涉及到騰訊內部的CDN服務,因此在Mars的開源列表中并沒有包含CDN部分。

SDT網絡診斷模塊提供了最基礎的檢測能力,需要由使用者自己組合使用。各個平臺的Reachability API能反映的情況有局限,無法應對復雜的網絡診斷,事實上有一些開源項目就是為了替換系統API。微信由于自身特點對網絡診斷要求很高,因此將它作為基礎的跨平臺組件進行開發維護。

STN是微信的信令傳輸網絡,也可以認為是小數據傳輸網絡,是微信日常中使用最頻繁的網絡通道。在開源設計上,STN抽象了微信的使用模型,使得STN成為業務無關的網絡通道,并且應用到了包括微信在內的多個騰訊內部應用中。與AFNetworking、Retrofit、Okhttp等框架不同,STN不僅是跨平臺的網絡解決框架,更是著重了“移動互聯網“這一特點,結合移動互聯網的不穩定特性,做了大量的優化工作,并且這些優化都是經過了微信長時間的驗證和使用的。除此之外,STN中還包含了很多其他方面的實用設計,包括自定義DNS、容災設計、負載考量、APP的前后臺考量、休眠機制考量、省電機制等等。

在實際的使用上,STN也提供了比其它網絡框架更多的空間:

  1. 數據監控:STN提供了許多數據回調接口,使得應用可以基于這些網絡數據,建立統計分析、監控等工具來管理應用的實際網絡情況;
  2. 問題定位:STN中含有很多關鍵日志,并且日志的設計已經幫助微信定位了很多的網絡層問題。結合Mars提供的XLOG日志機制,應用可以運行時也打開日志,非常方便定位;
  3. 參數配置:STN中將很多參數抽離為配置,使得應用可以根據自己的情況進行修改。

網絡通道上,目前STN提供了長連、短連兩種類型的通道,用于滿足不同的需求。使用STN后,應用開發者只需關注業務開發。移動互聯網的各種“坑”則可以交由STN幫你處理。

微信Mars跨平臺組件開發經驗

客戶端的跨平臺組件一般是指由C++等編寫的代碼,編譯為各個平臺的二進制鏈接庫,然后通過平臺提供的SDK調用和打包進App內。跨平臺組件一般都是底層功能,特點是與平臺無關、與UI界面無關,像第三方的游戲引擎、數據庫等一般都以跨平臺形式出現。

跨平臺組件可以實現一份代碼到處運行,減少開發和維護的精力,因此,當移動開發團隊擴大、業務規模膨脹的時候,將一些通用的、易出問題的底層功能提取出來做成跨平臺組件很有必要。

網絡層其實和系統以及UI界面的耦合很小,除了硬件設備相關、WebView等需要依賴系統的部分外,網絡層幾乎都可以實現跨平臺,一份代碼。但微信會將能抽象成通用模型、通用能力的部分考慮以組件的形式跨平臺。

跨平臺組件在開發過程中需要注意的地方,也和一般的移動開發有所不同。微信在Mars的開發中,會以高可用、高性能、低負載、容災性等目標來要求。

跨平臺組件開發的難點在于,跨平臺方案需要考慮各種平臺上的API兼容性問題,在技術選型上需要付出更多的努力;需要考慮不同平臺的特性,例如休眠機制等,根據不同的特性進行設計;跨平臺的基礎組件需要將問題進行更加本質的思考,避免復雜方案,避免方案的頻繁變更等。

另外,跨平臺組件由于對應用的影響很大,對它的穩定性和測試都要求更高。不過,只要設計良好,跨平臺組件并不會對應用的穩定性造成威脅。從目前微信的使用情況來看,跨平臺組件帶來的Crash在總體中占比較小。測試方面,微信在各平臺上有相應的測試工具,同時也有較多的自動化測試,能保障組件的穩健性。同時針對組件的某些特性,他們也有設計專門的測試場景。

Mars將在不久的將來進行開源,并且微信會持續的維護Mars開源項目。

 

 

來自:http://www.infoq.com/cn/news/2016/11/weixin-mars

 

 本文由用戶 to880109 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!