騰訊微信技術(shù)總監(jiān)周顥:一億用戶增長(zhǎng)背后的架構(gòu)秘密

0 評(píng)論 2951 瀏覽 8 收藏 25 分鐘

微信——騰訊戰(zhàn)略級(jí)產(chǎn)品,創(chuàng)造移動(dòng)互聯(lián)網(wǎng)增速記錄,10個(gè)月5000萬(wàn)手機(jī)用戶,433天之內(nèi)完成用戶數(shù)從零到一億的增長(zhǎng)過(guò)程,千萬(wàn)級(jí)用戶同時(shí)在線,搖一搖每天次數(shù)過(guò)億…在技術(shù)架構(gòu)上,微信是如何做到的?日前,在騰訊大講堂在中山大學(xué)校園宣講活動(dòng)上,騰訊廣研助理總經(jīng)理、微信技術(shù)總監(jiān)周顥在兩小時(shí)的演講中揭開(kāi)了微信背后的秘密。周顥,2001年畢業(yè)于華南理工大學(xué),計(jì)算機(jī)專業(yè)碩士。2005年加入騰訊廣州研發(fā)部,歷任QQ郵箱架構(gòu)師,廣研技術(shù)總監(jiān),T4技術(shù)專家,微信中心助理總經(jīng)理。(注:演講PPT下載)

周顥把微信的成功歸結(jié)于騰訊式的“三位一體”策略:即產(chǎn)品精準(zhǔn)、項(xiàng)目敏捷、技術(shù)支撐。微信的成功是在三個(gè)方面的結(jié)合比較好,能夠超出絕大多數(shù)同行或?qū)κ郑沟梦⑿抛叩奖容^前的位置。所謂產(chǎn)品精準(zhǔn),通俗的講就是在恰當(dāng)?shù)臅r(shí)機(jī)做了恰當(dāng)?shù)氖拢瞥隽酥亓考?jí)功能,在合適的時(shí)間以最符合大家需求的方式推出去。他認(rèn)為在整個(gè)微信的成功中,產(chǎn)品精準(zhǔn)占了很大一部分權(quán)重。

敏捷是一種態(tài)度 敏捷就是試錯(cuò)

微信研發(fā)團(tuán)隊(duì)里鼓勵(lì)一種試錯(cuò)的信仰他們堅(jiān)信,在互聯(lián)網(wǎng)開(kāi)發(fā)里,如果能夠有一個(gè)團(tuán)隊(duì)在更短的時(shí)間內(nèi)嘗試了更多機(jī)會(huì)(并能改進(jìn)過(guò)來(lái)),就能有(更多的)機(jī)會(huì)勝出。敏捷是一種態(tài)度,在軟件開(kāi)發(fā)過(guò)程中,項(xiàng)目管理者都會(huì)非常忌諱“變更”這個(gè)詞,但是在微信的項(xiàng)目運(yùn)作中是不可以的。因?yàn)槲⑿疟仨氁萑陶f(shuō)哪怕在發(fā)布前的十分鐘,也要允許他變更。這是非常大的挑戰(zhàn),因?yàn)榇蚱屏怂袀鹘y(tǒng)項(xiàng)目開(kāi)發(fā)的常識(shí)。所有人都說(shuō)不可能做到的,但微信做到了。研發(fā)團(tuán)隊(duì)所做的一切都是要給產(chǎn)品決策者有最大的自由度,而這個(gè)決策正是微信能夠勝出的關(guān)鍵。

海量系統(tǒng)上的敏捷 無(wú)異于懸崖邊的跳舞

敏捷有很多困境,如果做一個(gè)單機(jī)版程序,是可以做到很敏捷的,但是騰訊正在運(yùn)作的是一個(gè)海量系統(tǒng),有千萬(wàn)級(jí)用戶同時(shí)在線,在一個(gè)單獨(dú)的功能上每天有百億級(jí)的訪問(wèn),同時(shí)還要保證99.95%的可用性。在海量系統(tǒng)上應(yīng)對(duì)項(xiàng)目開(kāi)發(fā)會(huì)有很嚴(yán)謹(jǐn)?shù)囊?guī)范,都說(shuō)要盡可能少的變化,因?yàn)?0%-95%的錯(cuò)誤都是在變更中產(chǎn)生的,如果系統(tǒng)一直不變更會(huì)獲得非常高的穩(wěn)定度,但是微信就是要在懸崖邊跳舞。微信的研發(fā)團(tuán)隊(duì)要做一些事情,讓敏捷開(kāi)發(fā)變得更簡(jiǎn)單。

如何做到這一切?周顥認(rèn)為,首先,必須建立起一種狂熱的技術(shù)信念,就是一定是可以做到的。然后,需要用一些穩(wěn)固的技術(shù)(理念)來(lái)支撐,例如大系統(tǒng)小做、讓一切可擴(kuò)展必須有基礎(chǔ)組件、輕松上線(灰度、灰度、再灰度;精細(xì)監(jiān)控;迅速響應(yīng))…等等來(lái)支撐。

四大法器大系統(tǒng)小做、讓一切可擴(kuò)展、要有基礎(chǔ)組件、輕松上線

  • 大系統(tǒng)小做:當(dāng)設(shè)計(jì)龐大系統(tǒng)的時(shí)候,應(yīng)該盡量分割成更小的顆粒,使得項(xiàng)目之間的影響是最小的。
  • 一切可擴(kuò)展:在高穩(wěn)定度、高性能的系統(tǒng)中間,為了穩(wěn)定性能把它設(shè)計(jì)成不變化的系統(tǒng),但為了支持敏捷需要讓一切的東西都要變得可以擴(kuò)展。
  • 必須建立基礎(chǔ)組件:要解決復(fù)雜問(wèn)題的時(shí)候,需要將已有的經(jīng)驗(yàn)固化下來(lái),固化下來(lái)的東西會(huì)成為系統(tǒng)中的一部分。
  • 輕松上線:當(dāng)做了變化并把它從開(kāi)發(fā)環(huán)境中部署到現(xiàn)有的運(yùn)營(yíng)環(huán)境中去,在這個(gè)過(guò)程中,“灰度”這個(gè)詞非常關(guān)鍵,就是在黑和白之間的選擇,必須要變成一種小規(guī)模嘗試,再逐步擴(kuò)展到海量過(guò)程中的一個(gè)問(wèn)題。

大系統(tǒng)小做——僅僅把模塊變得更為清晰,這在海量系統(tǒng)設(shè)計(jì)開(kāi)發(fā)中是不夠的,還需要在物理環(huán)境上進(jìn)行分離部署,出現(xiàn)問(wèn)題的時(shí)候可以快速發(fā)現(xiàn),并且在最快的情況下解決掉。

大系統(tǒng)小做 混搭模式

將不同的應(yīng)用邏輯物理分割獨(dú)立出來(lái),用戶注冊(cè)登錄、LBS邏輯、搖一搖邏輯、漂流瓶邏輯、消息邏輯獨(dú)立開(kāi)來(lái)。把關(guān)鍵的邏輯混搭在一起,當(dāng)所有的邏輯部署在同一個(gè)服務(wù)器上,確實(shí)也會(huì)帶來(lái)很大敏捷上的好處,因?yàn)椴恍枰~外的考慮部署和監(jiān)控的問(wèn)題。在整個(gè)微信的邏輯中,可能現(xiàn)在已經(jīng)有上百種不同的邏輯,因?yàn)闀?huì)在邏輯的分割上拆分成8-10種做分離部署。

一切可擴(kuò)展——網(wǎng)絡(luò)協(xié)議可擴(kuò)展、數(shù)據(jù)存儲(chǔ)可擴(kuò)展

擴(kuò)展的關(guān)鍵點(diǎn)有兩塊。一個(gè)是網(wǎng)絡(luò)協(xié)議需要擴(kuò)展,當(dāng)要升級(jí)一個(gè)新功能的時(shí)候,會(huì)有一些比較大的困難,所以所有協(xié)議設(shè)計(jì)都比較向前兼容,但是向前兼容還是不夠的,因?yàn)榫W(wǎng)絡(luò)協(xié)議設(shè)計(jì)本身有非常多的功能也會(huì)有比較大的字段,相關(guān)的代碼可能會(huì)有數(shù)千行,這一塊不能通過(guò)手寫(xiě)方式完成??梢酝ㄟ^(guò)XML描述,再通過(guò)工具自動(dòng)生成所有的代碼,這是微信獲得快速開(kāi)發(fā)的一個(gè)重要的點(diǎn)。

另外一塊就是在數(shù)據(jù)存儲(chǔ)方面是必須可擴(kuò)展的。在2005年絕大多數(shù)海量系統(tǒng)的設(shè)計(jì)都是采用固定字段的存儲(chǔ),但是在現(xiàn)代系統(tǒng)中會(huì)意識(shí)到這個(gè)問(wèn)題,會(huì)采用KV或者TLV的方式,微信也做了不同的設(shè)計(jì)。

把復(fù)雜邏輯都固化下來(lái),成為基礎(chǔ)軟件。在微信后臺(tái)會(huì)有幾種不同的基礎(chǔ)組件。大致包括:

  • Svrkit——Client/Server自動(dòng)代碼生成框架:10分鐘搭建內(nèi)部服務(wù)器
  • LogicServer——邏輯容器:隨時(shí)添加新邏輯
  • OssAgent——監(jiān)控/統(tǒng)計(jì)框架:所見(jiàn)即所得的監(jiān)控報(bào)表
  • 存儲(chǔ)組件——屏蔽容災(zāi)/擴(kuò)容等復(fù)雜問(wèn)題

灰度、灰度、再灰度

在變更后的部署方式上,微信在一些規(guī)則會(huì)限定不能一次把所有的邏輯變更上去,每一次變更一小點(diǎn)觀察到每一個(gè)環(huán)節(jié)沒(méi)有問(wèn)題的時(shí)候,才能布局到全網(wǎng)上去。微信后臺(tái)每一天可以支撐超過(guò)20個(gè)后臺(tái)變更,在業(yè)界來(lái)說(shuō),通常做到5個(gè)已經(jīng)是比較快了,但是微信可以做到快4倍。

騰訊內(nèi)部的上線系統(tǒng)

而所謂灰度發(fā)布,是指在黑與白之間,能夠平滑過(guò)渡的一種發(fā)布方式。AB test就是一種灰度發(fā)布方式,讓一部用戶繼續(xù)用A,一部分用戶開(kāi)始用B,如果用戶對(duì)B沒(méi)有什么反對(duì)意見(jiàn),那么逐步擴(kuò)大范圍,把所有用戶都遷移到B上面 來(lái)。灰度發(fā)布可以保證整體系統(tǒng)的穩(wěn)定,在初始灰度的時(shí)候就可以發(fā)現(xiàn)、調(diào)整問(wèn)題,以保證其影響度。(在騰訊,灰度發(fā)布是最常采用的發(fā)布方式之一)

孫子兵法:古之所謂善戰(zhàn)者,勝于易勝者也

常識(shí)上,解決一個(gè)復(fù)雜問(wèn)題的時(shí)候,會(huì)用高明的技巧解決復(fù)雜的問(wèn)題,這個(gè)不是微信團(tuán)隊(duì)的目標(biāo),他們追求的要做到讓所有問(wèn)題很自然和簡(jiǎn)單的方式解決掉。在周顥看來(lái),微信架構(gòu)的技術(shù)復(fù)雜點(diǎn)在四個(gè)要點(diǎn):協(xié)議、容災(zāi)、輕重、監(jiān)控。

微信架構(gòu)

  • 協(xié)議。手機(jī)終端跟后臺(tái)服務(wù)器之間的交互協(xié)議,這個(gè)協(xié)議的設(shè)計(jì)是整個(gè)系統(tǒng)的骨架,在這一點(diǎn)做好設(shè)計(jì)可以使得系統(tǒng)的復(fù)雜度大大降低。
  • 容災(zāi)。當(dāng)系統(tǒng)出現(xiàn)了若干服務(wù)器或若干支架(宕機(jī)的時(shí)候),仍然需要讓系統(tǒng)盡可能的提供正常的服務(wù)。
  • 輕重。如何在系統(tǒng)架構(gòu)中分布功能,在哪一個(gè)點(diǎn)實(shí)現(xiàn)哪一個(gè)功能,代表系統(tǒng)中間的功能配置。
  • 監(jiān)控。為系統(tǒng)提供一個(gè)智能儀表盤。

在協(xié)議設(shè)計(jì)上,移動(dòng)互聯(lián)網(wǎng)和常規(guī)互聯(lián)網(wǎng)有很大的區(qū)別。首先有CMWAP和CMNET的不同,在中國(guó)現(xiàn)在有相當(dāng)多的手機(jī)用戶使用WMWAP連接,還有就是在線和離線的概念,當(dāng)QQ下線的時(shí)候叫離線,當(dāng)你登錄的時(shí)候叫在線。但是在移動(dòng)互聯(lián)網(wǎng)這兩個(gè)概念比較模糊。從微信的設(shè)計(jì)中,不管在線還是離線系統(tǒng)表現(xiàn)都應(yīng)該是一致的。還有一個(gè)是連接不穩(wěn)定的問(wèn)題,由于手機(jī)信號(hào)強(qiáng)弱的變化,當(dāng)時(shí)信號(hào)很好,5秒鐘走到信號(hào)不好的地區(qū),連接就必須斷掉。這個(gè)中間帶來(lái)不穩(wěn)定的因素為協(xié)議設(shè)計(jì)帶來(lái)較大困難。此外就是資費(fèi)敏感的問(wèn)題,因?yàn)橐苿?dòng)互聯(lián)網(wǎng)是按照流量計(jì)費(fèi)的,這個(gè)計(jì)費(fèi)會(huì)使得在協(xié)議設(shè)計(jì)中如何最小化傳輸?shù)膯?wèn)題。最后就是高延遲的問(wèn)題。

對(duì)此,業(yè)界標(biāo)準(zhǔn)的解決方案:Messaging And Presence Protocol:1)XMPP;2)SIP/SIMPLE。它的優(yōu)點(diǎn)是簡(jiǎn)單,大量開(kāi)源實(shí)現(xiàn)。而缺點(diǎn)同樣明顯:1)流量大:狀態(tài)初始化;2)消息不可靠。

微信在系統(tǒng)中做了特殊設(shè)計(jì),叫SYNC協(xié)議,是參考Activesyec來(lái)實(shí)現(xiàn)的。特點(diǎn)首先是基于狀態(tài)同步的協(xié)議,假定說(shuō)收發(fā)消息本身是狀態(tài)同步的過(guò)程,假定終端和服務(wù)器狀態(tài)已經(jīng)被遲了,在服務(wù)器端收到最新的消息,當(dāng)客戶端、終端向服務(wù)器對(duì)接的時(shí)候,收取消息的過(guò)程實(shí)際上可以簡(jiǎn)單的歸納為狀態(tài)同步的過(guò)程,收消息以及收取你好友狀態(tài)更新都是相同的。在這樣的模式之下,我們會(huì)也許會(huì)把交互的模式統(tǒng)一化,只需要推送一個(gè)消息到達(dá)的通知就可以了,終端收到這個(gè)通知就來(lái)做消息的同步。在這樣的簡(jiǎn)化模式之下,安卓和塞班都可以得到統(tǒng)一。這樣的系統(tǒng)本身的實(shí)現(xiàn)是更為復(fù)雜的,但是獲得很多額外的好處。

讓剩下系統(tǒng)實(shí)現(xiàn)的部分更加簡(jiǎn)單,簡(jiǎn)化了交互模式,狀態(tài)同步可以通過(guò)狀態(tài)同步的差值獲得最小的數(shù)據(jù)變更,通過(guò)增量的傳輸?shù)玫阶钚〉臄?shù)據(jù)傳輸量。通過(guò)這樣的協(xié)議設(shè)計(jì),微信可以確保消息是穩(wěn)定到達(dá)的,而且是按序到達(dá)。引用一句俗話:比它炫的沒(méi)它簡(jiǎn)單,比它簡(jiǎn)單的沒(méi)它快,沒(méi)誰(shuí)比他更快,哪怕在GPRS下,微信也能把進(jìn)度條輕易推到底。

追求完美設(shè)計(jì)的團(tuán)隊(duì)不能勝任海量服務(wù)

在容災(zāi)之前面向最壞的思考,如果系統(tǒng)真的掛了,需要做一些事情,首先是防止雪崩,避免蝴蝶效應(yīng)。如果關(guān)注春節(jié)訂火車票就知道了,用戶的請(qǐng)求量會(huì)因?yàn)橄到y(tǒng)服務(wù)不了而不斷的重試,意味著發(fā)生雪崩的時(shí)候,系統(tǒng)可能會(huì)承載原先3-10倍的流量,使得所有的事情更加惡化。所以微信有很多“放雪”功能的設(shè)計(jì)。第二個(gè)詞是柔性可用,在任何的系統(tǒng)中不要追求完美設(shè)計(jì),追求完美設(shè)計(jì)的是團(tuán)隊(duì)是不能勝任海量服務(wù)的。如果在一個(gè)系統(tǒng)出現(xiàn)問(wèn)題的時(shí)候,這個(gè)系統(tǒng)就掛了,那么這是一個(gè)不好的設(shè)計(jì),最好的做法是提供0-1中間的選擇。舉一個(gè)例子,當(dāng)一個(gè)用戶向另外一個(gè)用戶發(fā)消息的時(shí)候,可能會(huì)通過(guò)一個(gè)垃圾信息過(guò)濾的檢測(cè),如果垃圾信息過(guò)濾這個(gè)模塊突然掛掉了,這個(gè)消息難道就不能達(dá)到了嗎?在這樣的情況下,要忽略掉這個(gè)錯(cuò)誤,使得消息正常達(dá)到對(duì)方。要精確定位出哪一個(gè)環(huán)節(jié)是最為重要的,把不是重要的錯(cuò)誤盡可能的忽略掉。當(dāng)不能做到完美的時(shí)候,盡可能為用戶提供服務(wù)。另外一個(gè)重要方面叫做“保護(hù)點(diǎn)前置”,最前的一個(gè)點(diǎn)就是終端,在手機(jī)終端上蘊(yùn)埋更多的保護(hù)點(diǎn),這樣會(huì)為用戶系統(tǒng)贏得更大的處理空間。如果終端具備這樣的能力,會(huì)獲得更大的反應(yīng)空間。

周顥介紹了在微信上具體容災(zāi)設(shè)計(jì)的做法。在所有的容災(zāi)中存儲(chǔ)層的容災(zāi)是最難的,一個(gè)系統(tǒng)的設(shè)計(jì)分為三層:接入層、邏輯層、存儲(chǔ)層。接入層和邏輯層的容災(zāi)都有比較成熟的方案。邏輯層的容災(zāi)相對(duì)來(lái)說(shuō)比較簡(jiǎn)單,盡量不要有狀態(tài)的設(shè)計(jì),比如說(shuō)當(dāng)你做上一個(gè)請(qǐng)求的時(shí)候,會(huì)保持一些狀態(tài),要使得下一個(gè)請(qǐng)求發(fā)到下一個(gè)服務(wù)器。如果任何一個(gè)請(qǐng)求之間互相不關(guān)聯(lián)的話,這個(gè)就是無(wú)狀態(tài)的設(shè)計(jì),只要做到這一點(diǎn)邏輯層的容災(zāi)可以隨意的切換。在回到存儲(chǔ)層本身的容災(zāi)設(shè)計(jì)上,相對(duì)來(lái)說(shuō)困難一些,但是微信研發(fā)團(tuán)隊(duì)采用了一些技巧,叫分而治之,分離業(yè)務(wù)場(chǎng)景,尋求簡(jiǎn)單的設(shè)計(jì),并不會(huì)尋求大而同一的解決方案,因?yàn)檫@樣會(huì)使得系統(tǒng)的復(fù)雜度大幅度上升,而微信會(huì)盡可能把產(chǎn)品拆細(xì),尋求簡(jiǎn)化的設(shè)計(jì)。

首先是主備容災(zāi),這是最常見(jiàn)的方案。在有一些業(yè)務(wù)場(chǎng)景中是可以容忍最終一致性的,比如賬號(hào)系統(tǒng)的設(shè)計(jì),每天寫(xiě)入賬號(hào)系統(tǒng)的請(qǐng)求是非常少的,但是訪問(wèn)的請(qǐng)求非常多,這個(gè)差異可能會(huì)達(dá)到數(shù)萬(wàn)倍的規(guī)模,在這樣的場(chǎng)景下,微信會(huì)在賬號(hào)系統(tǒng)中采用簡(jiǎn)化的方案,也可以獲得比較大的穩(wěn)定度。

SET模型+雙寫(xiě)

第二種容災(zāi)的模式叫雙寫(xiě),兩臺(tái)Master的機(jī)器,當(dāng)一臺(tái)機(jī)故障的時(shí)候,另外一臺(tái)機(jī)還是可以接收到寫(xiě)請(qǐng)求,當(dāng)兩臺(tái)機(jī)交錯(cuò)啟動(dòng)的時(shí)候,會(huì)得到數(shù)據(jù)的丟失。但是有一些場(chǎng)景是可以容忍輕度數(shù)據(jù)丟失的,比如說(shuō)會(huì)有一個(gè)存儲(chǔ)專門記錄用戶終端的類型,比如說(shuō)安卓還是塞班以及他們使用終端的微信版本是什么,這樣的數(shù)據(jù)是可以容忍輕度數(shù)據(jù)丟失的,因?yàn)榕紶栍幸恍﹣G失的話,下一次訪問(wèn)會(huì)把這些數(shù)據(jù)帶上來(lái),會(huì)盡快的修復(fù)所有的數(shù)據(jù)。雙寫(xiě)也是非常簡(jiǎn)單的模式。

微信的研發(fā)團(tuán)隊(duì)做了一個(gè)叫Simple Quorum的機(jī)制,在微信的后臺(tái)中,同步協(xié)議有一個(gè)很重要的基石叫序列發(fā)生器,這樣的一個(gè)序列發(fā)生器需要有極高的穩(wěn)定度。首先可以看到序列號(hào)有一個(gè)特點(diǎn)永遠(yuǎn)是遞增的,用遞增方式往前推進(jìn)的時(shí)候,最大的序列號(hào)就是最新的系列號(hào)。有一個(gè)畢業(yè)才加入廣研的畢業(yè)生想到一個(gè)絕佳的方案,按SET分布,從2G減到200K。

前輕后重 功能點(diǎn)后移

周顥還談到了輕重的概念。這個(gè)概念的提出主要是從終端本身的一些困境所帶來(lái)的。首先在終端上需要表現(xiàn)最多的一個(gè)產(chǎn)品的邏輯,邏輯非常復(fù)雜,變更的成本也非常高,當(dāng)需要修復(fù)的時(shí)候必須發(fā)布一個(gè)新版本,這個(gè)新版必須由自己下載才能完成,下載的成本非常高。在這樣的前提下,如果手機(jī)終端產(chǎn)生了任何變化的時(shí)候,如果這個(gè)變化有非常大的問(wèn)題就會(huì)有極大的困境,所以需要在每一個(gè)發(fā)布之前做一些充分的數(shù)據(jù),確保不會(huì)發(fā)生致命問(wèn)題。如果一旦出現(xiàn)致命問(wèn)題難以修復(fù),需要把關(guān)鍵的點(diǎn)從終端移到后臺(tái)實(shí)現(xiàn),把功能點(diǎn)后移,來(lái)充分發(fā)揮后臺(tái)快速變更的能力。

接入優(yōu)化:從GSLB到IP重定向

在接入層的優(yōu)化,速度很重要的因素,是不是能夠就近接入一個(gè)最優(yōu)的節(jié)點(diǎn),比如說(shuō)移動(dòng)用戶最好接入移動(dòng)的節(jié)點(diǎn),海外的用戶可能需要尋找更佳的路由,有的時(shí)候可能無(wú)法自動(dòng)做到這一點(diǎn),一點(diǎn)是在終端上做測(cè)速,微信會(huì)通過(guò)在后臺(tái)IP逆向的能力,通過(guò)后臺(tái)指揮微信終端聯(lián)網(wǎng)的能力,尋找最優(yōu)的接入點(diǎn)。上圖就是每分鐘收到同一項(xiàng)指令曲線的報(bào)表。

如何解決“偷流量”的問(wèn)題——當(dāng)國(guó)內(nèi)類微信類產(chǎn)品發(fā)布的時(shí)候出現(xiàn)一個(gè)大的問(wèn)題就是“偷流量”,當(dāng)用戶在某一些邏輯下進(jìn)行一個(gè)死循環(huán),不斷訪問(wèn)某一些數(shù)據(jù),這樣的死循環(huán)是非??膳碌?,如果在用戶不知覺(jué)的情況之下,可能會(huì)在一個(gè)小時(shí)之內(nèi)偷到數(shù)10兆甚至數(shù)百兆的流量。有非常多業(yè)內(nèi)的同行都需要花大量的精力解決這個(gè)問(wèn)題,微信研發(fā)團(tuán)隊(duì)用了非常強(qiáng)大的方式解決它。通過(guò)在后臺(tái)建立起嚴(yán)厲的監(jiān)控系統(tǒng),對(duì)每一個(gè)用戶的行為做一個(gè)監(jiān)控,當(dāng)發(fā)現(xiàn)異常的時(shí)候,后臺(tái)會(huì)給終端發(fā)出指令,使得微信終端在一段時(shí)間無(wú)法聯(lián)網(wǎng),但是可以保證用戶流量不會(huì)白白的使用掉。

功能適配的例子——第一期微信版本發(fā)布的時(shí)候,當(dāng)時(shí)沒(méi)有群聊的功能,第二版發(fā)布的時(shí)候做了這個(gè)功能。當(dāng)時(shí)有兩個(gè)選擇,對(duì)于早期版本的用戶,因?yàn)椴恢С秩毫?,就無(wú)法享用到這個(gè)功能,但是微信希望提供更好的選擇,想讓早期不支持群聊的版本,也可以被拉到一個(gè)群里面收消息、發(fā)消息,通過(guò)后臺(tái)功能的適配也能做到這個(gè)事情。

分而治之 把監(jiān)控嵌入基礎(chǔ)框架

對(duì)于一個(gè)海量系統(tǒng)來(lái)說(shuō),一個(gè)精密的儀表盤非常重要。監(jiān)控是非常痛苦的,對(duì)于這樣一個(gè)系統(tǒng)來(lái)說(shuō),每小時(shí)會(huì)產(chǎn)生數(shù)百G的監(jiān)控日志。微信希望在1分鐘之內(nèi)監(jiān)控的數(shù)據(jù)就能夠顯示在報(bào)表上,因?yàn)橹挥羞@樣的精準(zhǔn)和實(shí)時(shí)度才能夠贏得處理故障的時(shí)間。微信會(huì)做關(guān)聯(lián)統(tǒng)計(jì),通過(guò)搖一搖加了好友,他們活躍度如何,過(guò)了一段時(shí)間他們的活躍度變化情況又是如何。這種需求是需要通過(guò)大量日志的關(guān)聯(lián)統(tǒng)計(jì)來(lái)獲得的。研發(fā)團(tuán)隊(duì)也花了一段時(shí)間來(lái)理解這個(gè)問(wèn)題,發(fā)現(xiàn)了中間一個(gè)重要的經(jīng)驗(yàn)叫做“魚(yú)和熊掌不能兼得”。

為了讓監(jiān)控?cái)?shù)值更敏感,需要把監(jiān)控細(xì)化再細(xì)化,上面數(shù)據(jù)表示每一欄子系統(tǒng)的數(shù)據(jù),下面這個(gè)是按微信版本號(hào)來(lái)劃分的,這里的數(shù)據(jù)項(xiàng)是非常多。

微信還需要采集一些異常的點(diǎn),如果有異常的話會(huì)發(fā)布緊急的版本,盡可能快的替換它。對(duì)收發(fā)消息延時(shí)做的監(jiān)控,比如說(shuō)0—1秒端到端的速度,會(huì)對(duì)不同的區(qū)段做一些統(tǒng)計(jì),當(dāng)某一個(gè)環(huán)節(jié)出現(xiàn)異常的時(shí)候,通常會(huì)在中間的延時(shí)上體現(xiàn)出來(lái)。有一個(gè)很重要的點(diǎn)叫自動(dòng)報(bào)警,現(xiàn)在有數(shù)千項(xiàng)的數(shù)據(jù),不可能每一項(xiàng)都靠人工去看的,必須要跟自動(dòng)報(bào)警相關(guān)聯(lián),微信有一些智能的算法,是不是在正常的范圍內(nèi),跟歷史的數(shù)值進(jìn)行對(duì)比,如果有異常的話,會(huì)通過(guò)短信、郵件還有微信本身來(lái)發(fā)出報(bào)警信息。

把監(jiān)控嵌入基礎(chǔ)框架

微信會(huì)把監(jiān)控嵌入到基礎(chǔ)框架里面去,因?yàn)椴⒉皇敲恳粋€(gè)人都會(huì)意識(shí)到在需要的地方嵌入一個(gè)監(jiān)控點(diǎn),所以在基礎(chǔ)框架本身內(nèi)置很重要的監(jiān)控點(diǎn),比如說(shuō)這個(gè)表上的欄目,非常多的欄目大概會(huì)有數(shù)百項(xiàng)的欄目,都不需要程序員自己去寫(xiě),當(dāng)用基礎(chǔ)組件搭建一個(gè)系統(tǒng)的時(shí)候,就可以直接觀測(cè)系統(tǒng)數(shù)據(jù)。

在談到微信未來(lái)的技術(shù)挑戰(zhàn)時(shí),周顥首先希望能夠讓微信成為可用性99.99%的系統(tǒng);設(shè)計(jì)出面向現(xiàn)在10倍容量的系統(tǒng)以及完全的IDC容災(zāi)。

網(wǎng)上盛傳的凌晨?jī)牲c(diǎn),騰訊大廈那多層大片大片的燈光和樓下那長(zhǎng)長(zhǎng)的出租車隊(duì)伍說(shuō)明了一切。引用一句話做結(jié)尾,可怕的不是微信,真正可怕的是,比你領(lǐng)先比你更有天賦的團(tuán)隊(duì)比你更努力。

附錄:騰訊微信技術(shù)總監(jiān)周顥演講PPT下載

特別鳴謝:騰訊大講堂(djt.qq.com)對(duì)本篇報(bào)道的內(nèi)容支持

來(lái)源:http://sd.csdn.net/a/20120515/2805581.html

更多精彩內(nèi)容,請(qǐng)關(guān)注人人都是產(chǎn)品經(jīng)理微信公眾號(hào)或下載App
評(píng)論
評(píng)論請(qǐng)登錄
  1. 目前還沒(méi)評(píng)論,等你發(fā)揮!