從GitHub上可以看出,到目前為止,由騰訊微信團(tuán)隊發(fā)起的開源項目已經(jīng)有6個,并且這其中大部分都是在2016年開源的,領(lǐng)域涉及移動、數(shù)據(jù)庫、基礎(chǔ)類庫、框架。中國大公司的開源曾經(jīng)給社區(qū)留下不好的印象,比如有人就這么說,大公司的開源,開源也就意味著結(jié)束。也有人說,大公司的開源大部分都是KPI項目,開源與業(yè)務(wù)不能相得益彰,所以根本無法持續(xù)投入。
相比來說,F(xiàn)acebook就是互聯(lián)網(wǎng)公司里的開源大戶,目前他們的開源項目已經(jīng)有近300個。對于為什么要發(fā)布開源項目,F(xiàn)acebook開源項目負(fù)責(zé)人也曾經(jīng)解釋過,總結(jié)起來說有三點(diǎn),一是開源能夠幫助他人更快地開發(fā)軟件,促進(jìn)世界創(chuàng)新,主要是社會價值層面的考慮。二是開源能夠倒逼Facebook的工程師寫出更好的代碼。三是開源能夠更有效利用社區(qū)的力量,幫助Facebook一起解決難題。
那微信是如何理解開源這件事,以及他們未來準(zhǔn)備通過哪種機(jī)制保證開源項目的健康發(fā)展,帶著這些問題,InfoQ記者采訪了微信終端團(tuán)隊的負(fù)責(zé)人趙原。
趙原認(rèn)為開源不僅是一種態(tài)度,更是一種能力,微信希望通過開源打通內(nèi)部團(tuán)隊和外部社區(qū),一方面可以把微信的頂級技術(shù)輸出給了社區(qū),另一方面也可以把外部的優(yōu)秀的思想傳遞到內(nèi)部團(tuán)隊。對于開源的理解,趙原這樣解釋:
第一個關(guān)鍵詞價值。微信團(tuán)隊通過將內(nèi)部的研究成功優(yōu)化、整合,并輸出,以幫助更多的開發(fā)者更方便地構(gòu)建他們的軟件。工程師之間最好的交流媒介就是代碼,通過代碼,微信團(tuán)隊可以將他們的技術(shù)思想傳遞到社區(qū),并影響更多的人。
第二個關(guān)鍵詞優(yōu)勢。微信最大的優(yōu)勢是有海量的用戶,很多外界開發(fā)者根本沒有發(fā)現(xiàn)或者遇到過的復(fù)雜問題,微信團(tuán)隊都早已經(jīng)解決掉了,比如在移動開發(fā)領(lǐng)域的系統(tǒng)兼容性、用戶多樣化的網(wǎng)絡(luò)環(huán)境等問題。通過開源,微信不僅可以授之以魚,還可以授之以漁。
第三個關(guān)鍵詞活力,微信開源的項目必須來自微信,最后必須在微信落地。開源項目最怕沒人維護(hù),通過產(chǎn)品迭代,這些開源的項目持續(xù)的更新,給他們一個心跳的機(jī)制,使他們依然有活力。
第四個關(guān)鍵詞易用。一個優(yōu)秀程序員可以花上很多的時間研究微信開放的技術(shù)源碼的技術(shù)思想和設(shè)計。但對于不是很有技術(shù)實力的開發(fā)人員,是否能從微信的開源項目中依然獲益呢?答案是肯定的。他可以將微信開源的項目引入在自己的APP中,將微信很多的能力運(yùn)用在自己的APP中。
而對于項目開源之后的運(yùn)營問題,趙原也做了思考:
活力,不得不提起一個尖銳的問題,在大公司里面做開源項目,開源通常意味著這個項目的結(jié)束。優(yōu)秀的開源項目意味著開始,和大公司里的開源項目做法天生有一些沖突。
第一大公司里面做開源項目其實是有一些短期KPI導(dǎo)向的短期項目,開源項目需要持續(xù)的人力投入在其中。第二個問題,每一個團(tuán)隊里面員工開發(fā)的精力是有限的,做技術(shù)研究的時候,需要花很多時間在供應(yīng)商的開發(fā),這是從員工方面看開發(fā)精力的沖突。第三大公司內(nèi)通常有完備的開發(fā)體系,而這些開發(fā)是封閉的,很難說和外部的開源體系對接起來。
今天看這個問題,微信也想過很暴力、很簡單的想法,比如說團(tuán)隊10個人,這10個人可以做功能開發(fā),如果為了解決這個問題,再招10個員工砸在開源項目上,大公司可能最不缺的就是人力,問題是在大公司里面看上去是可以解決的,但放在微信上面卻覺得行不通,微信講究小團(tuán)隊作戰(zhàn),講究精兵策略,不浪費(fèi)一兵一卒。
為了解決這個問題,微信在開發(fā)Tinker項目的過程中,大概用了快一年的時間解決,其實解決問題的方法很簡單。簡而言之,就是將微信的開發(fā)團(tuán)隊改造成一個開源化的開發(fā)模式。
微信通過對內(nèi)部系統(tǒng)的改造,使內(nèi)部的開發(fā)和外部的開發(fā)模式基本沒什么不同。一份代碼,既可以在微信中使用,也可以在外部的開發(fā)者中使用,這科技減少額外的人力投入。
另外微信還收獲了很多價值。比如外部的開發(fā)者還可以提供一些微信團(tuán)隊沒有發(fā)現(xiàn)的問題,對于微信來說是一個很好的優(yōu)化bug的渠道。通過與外部社區(qū)的深入交流,團(tuán)隊的學(xué)習(xí)能力也能得到很大提升。
下面是InfoQ編輯整理的微信現(xiàn)有的比較活躍的開源項目列表,歡迎交流討論。
C/C++協(xié)程庫LibcoLibco是微信后臺大規(guī)模使用的C/C++協(xié)程庫,2013年至今穩(wěn)定運(yùn)行在微信后臺的數(shù)萬臺機(jī)器上。Libco提供了完善的協(xié)程編程接口、常用的Socket族函數(shù)Hook等,使得業(yè)務(wù)可用同步編程模型快速迭代開發(fā)。
早期微信后臺因為業(yè)務(wù)需求復(fù)雜多變、產(chǎn)品要求快速迭代等需求,大部分模塊都采用了半同步半異步模型。接入層為異步模型,業(yè)務(wù)邏輯層則是同步的多進(jìn)程或多線程模型,業(yè)務(wù)邏輯的并發(fā)能力只有幾十到幾百。隨著微信業(yè)務(wù)的增長,系統(tǒng)規(guī)模變得越來越龐大,每個模塊很容易受到后端服務(wù)/網(wǎng)絡(luò)抖動的影響。基于這樣的背景,微信開發(fā)了Libco,實現(xiàn)了對業(yè)務(wù)邏輯非侵入的異步化改造。
GitHub地址:https://github.com/tencent/libco
Star數(shù)量:1043
PhxPaxos是微信后臺團(tuán)隊自主研發(fā)的一套基于Paxos協(xié)議的多機(jī)狀態(tài)拷貝類庫。它以庫函數(shù)的方式嵌入到開發(fā)者的代碼當(dāng)中,使得一些單機(jī)狀態(tài)服務(wù)可以擴(kuò)展到多機(jī)器,從而獲得強(qiáng)一致性的多副本以及自動容災(zāi)的特性。PhxPaxos在微信服務(wù)里面經(jīng)過一系列的工程驗證和大量的惡劣環(huán)境下的測試,在一致性的保證上極為健壯。
PhxPaxos的特性包括使用基于消息傳遞機(jī)制的純異步工程架構(gòu)、每次寫盤使用fsync嚴(yán)格保證正確性、支持Checkpoint以及對PaxosLog的自動清理、使用點(diǎn)對點(diǎn)流式協(xié)議進(jìn)行快速學(xué)習(xí)、支持跨機(jī)器的Checkpoint自動拉取、內(nèi)置Master選舉功能、自適應(yīng)的過載保護(hù)等。
GitHub地址:https://github.com/tencent-wechat/phxpaxos
Star數(shù)量:970
PhxSQL是一個兼容MySQL、服務(wù)高可用、數(shù)據(jù)強(qiáng)一致的關(guān)系型數(shù)據(jù)庫集群。PhxSQL以單Master多Slave方式部署,在集群內(nèi)超過一半機(jī)器存活的情況下、即可提供服務(wù),并且自身實現(xiàn)自動Master切換、保證數(shù)據(jù)一致性。PhxSQL不依賴于ZooKeeper等任何第三方做存活檢測及選主。PhxSQL基于MySQL的一個分支Percona 5.6開發(fā),功能和實現(xiàn)與MySQL基本一致。
MySQL主備在主機(jī)上支持完整SQL、全局事務(wù)、以repeatable read和serializable級別的事務(wù)隔離,在金融、帳號等關(guān)鍵業(yè)務(wù)中有巨大的價值。但是MySQL傳統(tǒng)主備方案也有其缺點(diǎn)。最明顯的就是主機(jī)故障后的自動換主和新舊主數(shù)據(jù)一致性,即所謂的一致性和可用性。為了解決這個問題,并同時完全兼容MySQL,微信在MySQL的基礎(chǔ)上應(yīng)用Paxos,設(shè)計和開發(fā)了PhxSQL。
GitHub地址:https://github.com/tencent-wechat/phxsql
Star數(shù)量:1485
PhxRPC是微信后臺團(tuán)隊推出的一個簡潔小巧的RPC框架,編譯生成的庫只有450K(編譯只依賴第三方庫Protobuf)。PhxRPC的特性如下:
使用Protobuf作為IDL用于描述RPC接口以及通信數(shù)據(jù)結(jié)構(gòu)。基于Protobuf文件自動生成Client以及Server接口,用于Client的構(gòu)建,以及Server的實現(xiàn)。半同步半異步模式,采用獨(dú)立多IO線程,通過Epoll管理請求的接入以及讀寫,工作線程采用固定線程池。IO線程與工作線程通過內(nèi)存隊列進(jìn)行交互。提供完善的過載保護(hù),無需配置閾值,支持動態(tài)自適應(yīng)拒絕請求。提供簡易的Client/Server配置讀入方式。基于lambda函數(shù)實現(xiàn)并發(fā)訪問Server,可以非常方便地實現(xiàn)Google提出的 Backup Requests 模式。GitHub地址:https://github.com/tencent-wechat/phxrpc
Star數(shù)量:467
Mars是微信官方的終端基礎(chǔ)組件,是一個結(jié)合移動應(yīng)用所設(shè)計的基于Socket層的解決方案,在網(wǎng)絡(luò)調(diào)優(yōu)方面有更好的可控性,采用C++開發(fā)。目前已接入微信 Android、iOS、Mac、Windows、WP 等客戶端。
在微信中,任何網(wǎng)絡(luò)實現(xiàn)的bug都可能導(dǎo)致重大事故。例如微信的容災(zāi)實現(xiàn),如果因為版本的實現(xiàn)差異,導(dǎo)致某些版本上無法進(jìn)行容災(zāi)恢復(fù),將會嚴(yán)重的影響用戶體驗。微信研發(fā)了統(tǒng)一的跨平臺的網(wǎng)絡(luò)基礎(chǔ)庫Mars來滿足發(fā)展的需要,一方面,基礎(chǔ)組件可以提高研發(fā)效率,另外一方面,也可以提高系統(tǒng)的穩(wěn)健性。
在設(shè)計上,Mars以跨平臺、跨業(yè)務(wù)為前提,遵從高可用,高性能,負(fù)載均衡的設(shè)計原則。以網(wǎng)絡(luò)的可用性為例,移動互聯(lián)網(wǎng)有著丟包率高、帶寬受限、延遲波動、第三方影響等特點(diǎn),使得網(wǎng)絡(luò)的可用性,尤其是弱網(wǎng)絡(luò)下的可用性變得尤為關(guān)鍵。Mars 的STN組件作為基于 socket 層的網(wǎng)絡(luò)解決方案,在很多細(xì)節(jié)設(shè)計上會充分考慮弱網(wǎng)絡(luò)下的可用性。
GitHub地址:https://github.com/Tencent/mars
Star數(shù)量:5895
Tinker是微信官方的Android熱補(bǔ)丁解決方案,它支持動態(tài)下發(fā)代碼、So庫以及資源,讓應(yīng)用能夠在不需要重新安裝的情況下實現(xiàn)更新。
當(dāng)前市面的熱補(bǔ)丁方案有很多,其中比較出名的有阿里的AndFix、美團(tuán)的Robust以及QZone的超級補(bǔ)丁方案,但它們都存在無法解決的問題,所以微信研發(fā)了自己的解決方案。總的來說,AndFix作為native解決方案,首先面臨的是穩(wěn)定性與兼容性問題,更重要的是它無法實現(xiàn)類替換,它是需要大量額外的開發(fā)成本的。而Robust兼容性與成功率較高,但是它與AndFix一樣,無法新增變量與類只能用做的bugFix方案。Qzone方案可以做到發(fā)布產(chǎn)品功能,但是它主要問題是插樁帶來Dalvik的性能問題,以及為了解決Art下內(nèi)存地址問題而導(dǎo)致補(bǔ)丁包急速增大的。
Tinker的具體設(shè)計目標(biāo)如下:
開發(fā)透明:開發(fā)者無需關(guān)心是否在補(bǔ)丁版本,他可以隨意修改,不由框架限制。性能無影響:補(bǔ)丁框架不能對應(yīng)用帶來性能損耗。完整支持:支持代碼,So 庫以及資源的修復(fù),可以發(fā)布功能。補(bǔ)丁大小較小: 補(bǔ)丁大小應(yīng)該盡量的小,提高升級率。穩(wěn)定,兼容性好:保證微信的數(shù)億用戶的使用,盡量減少反射。GitHub地址:https://github.com/Tencent/tinker
Star數(shù)量:6707