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