微信Mars:客戶端跨平臺(tái)組件的開發(fā)經(jīng)驗(yàn)
12月9日,由InfoQ主辦的中國(guó)技術(shù)開放日廣州站將在廣州四季酒店舉行(歡迎廣州的同學(xué)免費(fèi)報(bào)名參加,報(bào)名地址見文末閱讀原文)。我們邀請(qǐng)了來(lái)自騰訊、阿里、百度、唯品會(huì)的技術(shù)專家前來(lái)分享一線移動(dòng)開發(fā)實(shí)踐。本次開放日上,來(lái)自微信的高級(jí)工程師周志杰將分享《微信Mars:移動(dòng)互聯(lián)網(wǎng)下的高質(zhì)量網(wǎng)絡(luò)連接探索》,對(duì)于這個(gè)話題,我采訪了周志杰,了解微信Mars是什么,以及微信在跨平臺(tái)組件開發(fā)上的一些經(jīng)驗(yàn)總結(jié)。
Mars 是微信官方的終端基礎(chǔ)組件,是一個(gè)使用 C++ 編寫的業(yè)務(wù)性無(wú)關(guān),平臺(tái)性無(wú)關(guān)的基礎(chǔ)組件。目前已接入微信 Android、iOS、Mac、Windows、WP 等客戶端。現(xiàn)正在籌備開源中,它主要包括以下幾個(gè)部分:
- COMM:基礎(chǔ)庫(kù),包括socket、線程、消息隊(duì)列、協(xié)程等基礎(chǔ)工具;
- XLOG:通用日志模塊,充分考慮移動(dòng)終端的特點(diǎn),提供高性能、高可用、安全性、容錯(cuò)性的日志功能;
- SDT:網(wǎng)絡(luò)診斷模塊;
- STN:信令傳輸網(wǎng)絡(luò)模塊,負(fù)責(zé)終端與服務(wù)器的小數(shù)據(jù)信令通道。包含了微信終端在移動(dòng)網(wǎng)絡(luò)上的大量?jī)?yōu)化經(jīng)驗(yàn)與成果,經(jīng)歷了微信海量用戶的考驗(yàn)。
其中STN(信令傳輸網(wǎng)絡(luò))為核心模塊。
Mars最早起源于微信的實(shí)際發(fā)展需要。由于微信多平臺(tái)、億級(jí)用戶,微信基礎(chǔ)功能的修改影響重大。但不同平臺(tái)不同的實(shí)現(xiàn)導(dǎo)致眾多平臺(tái)上很難統(tǒng)一,一方面不利于質(zhì)量把關(guān),可能存在重大隱患,一方面也不利于微信對(duì)基礎(chǔ)研究的深入。因此,微信開始了跨平臺(tái)基礎(chǔ)組件的開發(fā),并且在微信中沉淀多年。隨著基礎(chǔ)組件的發(fā)展與穩(wěn)定,他們希望通過(guò)開源的力量進(jìn)一步的提升微信的基礎(chǔ),并且也期待行業(yè)的互相交流與促進(jìn),因此啟動(dòng)了Mars項(xiàng)目。
微信的網(wǎng)絡(luò)層設(shè)計(jì)到很多不同的業(yè)務(wù),在微信中使用到的絕大部分功能,都是基于Mars提供的網(wǎng)絡(luò)組件,包括文本消息、語(yǔ)音消息、朋友圈等核心功能。只有少部分業(yè)務(wù)不在范圍內(nèi),例如VOIP、Webview等。微信中使用到的網(wǎng)絡(luò)服務(wù),大體分為兩種類型:信令網(wǎng)絡(luò)、數(shù)據(jù)網(wǎng)絡(luò)。其中STN負(fù)責(zé)信令網(wǎng)絡(luò),CDN組件則負(fù)責(zé)數(shù)據(jù)網(wǎng)絡(luò)。但由于CDN涉及到騰訊內(nèi)部的CDN服務(wù),因此在Mars的開源列表中并沒(méi)有包含CDN部分。
SDT網(wǎng)絡(luò)診斷模塊提供了最基礎(chǔ)的檢測(cè)能力,需要由使用者自己組合使用。各個(gè)平臺(tái)的Reachability API能反映的情況有局限,無(wú)法應(yīng)對(duì)復(fù)雜的網(wǎng)絡(luò)診斷,事實(shí)上有一些開源項(xiàng)目就是為了替換系統(tǒng)API。微信由于自身特點(diǎn)對(duì)網(wǎng)絡(luò)診斷要求很高,因此將它作為基礎(chǔ)的跨平臺(tái)組件進(jìn)行開發(fā)維護(hù)。
STN是微信的信令傳輸網(wǎng)絡(luò),也可以認(rèn)為是小數(shù)據(jù)傳輸網(wǎng)絡(luò),是微信日常中使用最頻繁的網(wǎng)絡(luò)通道。在開源設(shè)計(jì)上,STN抽象了微信的使用模型,使得STN成為業(yè)務(wù)無(wú)關(guān)的網(wǎng)絡(luò)通道,并且應(yīng)用到了包括微信在內(nèi)的多個(gè)騰訊內(nèi)部應(yīng)用中。與AFNetworking、Retrofit、Okhttp等框架不同,STN不僅是跨平臺(tái)的網(wǎng)絡(luò)解決框架,更是著重了“移動(dòng)互聯(lián)網(wǎng)“這一特點(diǎn),結(jié)合移動(dòng)互聯(lián)網(wǎng)的不穩(wěn)定特性,做了大量的優(yōu)化工作,并且這些優(yōu)化都是經(jīng)過(guò)了微信長(zhǎng)時(shí)間的驗(yàn)證和使用的。除此之外,STN中還包含了很多其他方面的實(shí)用設(shè)計(jì),包括自定義DNS、容災(zāi)設(shè)計(jì)、負(fù)載考量、APP的前后臺(tái)考量、休眠機(jī)制考量、省電機(jī)制等等。
在實(shí)際的使用上,STN也提供了比其它網(wǎng)絡(luò)框架更多的空間:
- 數(shù)據(jù)監(jiān)控:STN提供了許多數(shù)據(jù)回調(diào)接口,使得應(yīng)用可以基于這些網(wǎng)絡(luò)數(shù)據(jù),建立統(tǒng)計(jì)分析、監(jiān)控等工具來(lái)管理應(yīng)用的實(shí)際網(wǎng)絡(luò)情況;
- 問(wèn)題定位:STN中含有很多關(guān)鍵日志,并且日志的設(shè)計(jì)已經(jīng)幫助微信定位了很多的網(wǎng)絡(luò)層問(wèn)題。結(jié)合Mars提供的XLOG日志機(jī)制,應(yīng)用可以運(yùn)行時(shí)也打開日志,非常方便定位;
- 參數(shù)配置:STN中將很多參數(shù)抽離為配置,使得應(yīng)用可以根據(jù)自己的情況進(jìn)行修改。
網(wǎng)絡(luò)通道上,目前STN提供了長(zhǎng)連、短連兩種類型的通道,用于滿足不同的需求。使用STN后,應(yīng)用開發(fā)者只需關(guān)注業(yè)務(wù)開發(fā)。移動(dòng)互聯(lián)網(wǎng)的各種“坑”則可以交由STN幫你處理。
微信Mars跨平臺(tái)組件開發(fā)經(jīng)驗(yàn)
客戶端的跨平臺(tái)組件一般是指由C++等編寫的代碼,編譯為各個(gè)平臺(tái)的二進(jìn)制鏈接庫(kù),然后通過(guò)平臺(tái)提供的SDK調(diào)用和打包進(jìn)App內(nèi)。跨平臺(tái)組件一般都是底層功能,特點(diǎn)是與平臺(tái)無(wú)關(guān)、與UI界面無(wú)關(guān),像第三方的游戲引擎、數(shù)據(jù)庫(kù)等一般都以跨平臺(tái)形式出現(xiàn)。
跨平臺(tái)組件可以實(shí)現(xiàn)一份代碼到處運(yùn)行,減少開發(fā)和維護(hù)的精力,因此,當(dāng)移動(dòng)開發(fā)團(tuán)隊(duì)擴(kuò)大、業(yè)務(wù)規(guī)模膨脹的時(shí)候,將一些通用的、易出問(wèn)題的底層功能提取出來(lái)做成跨平臺(tái)組件很有必要。
網(wǎng)絡(luò)層其實(shí)和系統(tǒng)以及UI界面的耦合很小,除了硬件設(shè)備相關(guān)、WebView等需要依賴系統(tǒng)的部分外,網(wǎng)絡(luò)層幾乎都可以實(shí)現(xiàn)跨平臺(tái),一份代碼。但微信會(huì)將能抽象成通用模型、通用能力的部分考慮以組件的形式跨平臺(tái)。
跨平臺(tái)組件在開發(fā)過(guò)程中需要注意的地方,也和一般的移動(dòng)開發(fā)有所不同。微信在Mars的開發(fā)中,會(huì)以高可用、高性能、低負(fù)載、容災(zāi)性等目標(biāo)來(lái)要求。
跨平臺(tái)組件開發(fā)的難點(diǎn)在于,跨平臺(tái)方案需要考慮各種平臺(tái)上的API兼容性問(wèn)題,在技術(shù)選型上需要付出更多的努力;需要考慮不同平臺(tái)的特性,例如休眠機(jī)制等,根據(jù)不同的特性進(jìn)行設(shè)計(jì);跨平臺(tái)的基礎(chǔ)組件需要將問(wèn)題進(jìn)行更加本質(zhì)的思考,避免復(fù)雜方案,避免方案的頻繁變更等。
另外,跨平臺(tái)組件由于對(duì)應(yīng)用的影響很大,對(duì)它的穩(wěn)定性和測(cè)試都要求更高。不過(guò),只要設(shè)計(jì)良好,跨平臺(tái)組件并不會(huì)對(duì)應(yīng)用的穩(wěn)定性造成威脅。從目前微信的使用情況來(lái)看,跨平臺(tái)組件帶來(lái)的Crash在總體中占比較小。測(cè)試方面,微信在各平臺(tái)上有相應(yīng)的測(cè)試工具,同時(shí)也有較多的自動(dòng)化測(cè)試,能保障組件的穩(wěn)健性。同時(shí)針對(duì)組件的某些特性,他們也有設(shè)計(jì)專門的測(cè)試場(chǎng)景。
Mars將在不久的將來(lái)進(jìn)行開源,并且微信會(huì)持續(xù)的維護(hù)Mars開源項(xiàng)目。