?

2011.1.21 微信正式發(fā)布??焖龠@一天距離微信項目啟動(dòng)日約為2個(gè)月。裂變就在這2個(gè)月里,見(jiàn)證架構進(jìn)歷微信從無(wú)到有,微信大家可能會(huì )好奇這期間微信后臺做的后臺最重要的事情是什么?(′?ω?`)
微信起初定位是一個(gè)通訊工具,作為通訊工具最核心的從到程功能是收發(fā)消息。微信團隊源于廣硏團隊快速裂變??,快速ヽ(′ー`)ノ消息模型跟郵箱的裂變郵件模型也很??有淵源,??都是見(jiàn)證架構進(jìn)歷存儲轉發(fā)。
圖 1 微信消息模型
上圖展示了這一消息模型,微信消息被發(fā)出后,后臺會(huì )先在后臺臨時(shí)存儲;為使接收者能更快接收到消息,從到程會(huì )推送消息通知給接收者;最后客戶(hù)端主動(dòng)到服務(wù)器收(╯°□°)╯︵ ┻━┻取消息??焖?/p>
由于用戶(hù)的裂???變帳戶(hù)、聯(lián)系人和消息等數據都在服務(wù)器存儲,見(jiàn)證架構進(jìn)歷如何將數( ?▽?)據同步到客戶(hù)端就成了很關(guān)鍵的問(wèn)題。為簡(jiǎn)化協(xié)議,我們決定通過(guò)一個(gè)統一的數據同步協(xié)議來(lái)同步用戶(hù)所有的基礎數據。
最初的方案是客戶(hù)端記錄一個(gè)本地數據(ju)的快照(Snapsho(′▽?zhuān)?t),需要同步數據時(shí),將Snapshot帶到服ヽ(′ー`)ノ務(wù)器,服務(wù)器通過(guò)計算Snapshot與服務(wù)器數據的差異,將差異數據發(fā)給客戶(hù)端,客戶(hù)端再保存差異數據完成同步。不過(guò)這個(gè)方案有兩個(gè)問(wèn)題:一是Snapshot會(huì )隨著(zhù)客戶(hù)端數據的增多變得越來(lái)越大,同步時(shí)ヽ(′?`)ノ流量開(kāi)銷(xiāo)大;二是客戶(hù)端每次同步都要計算Snapshot,會(huì )帶來(lái)??額外的性能開(kāi)銷(xiāo)和實(shí)現復雜度。
幾經(jīng)討論后,方案改為由服務(wù)計算Snapshot,在客戶(hù)端同步數據時(shí)跟隨??數據一起下發(fā)給客戶(hù)端,客戶(hù)端無(wú)需理解Snapshot,只需存儲起來(lái)(′▽?zhuān)?,在下次數據同步數據時(shí)帶上即可。同時(shí),Snap??shot被設計得非常精簡(jiǎn)??,是若干個(gè)Key-Value的組合,Key代表數據的類(lèi)型,Value代表給到客戶(hù)端的數據的最新版本號。Key有三個(gè),分別代表:帳戶(hù)數據、聯(lián)系人和消息。這個(gè)同步協(xié)議的一個(gè)額外好處是客戶(hù)端同步完數??據后,不需要額外的ACK協(xié)議來(lái)確認數據收取成功,同樣可以保證不會(huì )丟數據:只要(yao)客戶(hù)端拿最新的Snapshot到服務(wù)器做數據同步,服務(wù)器即可(ke)確認上次數據已經(jīng)成功同步完成,可以執行后續操作,例如清??除暫存在服務(wù)的消息等等。
此后,精簡(jiǎn)方案、減少流量開(kāi)銷(xiāo)、盡量由服務(wù)器完成較復雜的業(yè)務(wù)邏輯、降低客戶(hù)端實(shí)現的復雜度就作為重要的指導原則,持續影響著(zhù)后續的(de)微信設計開(kāi)(╯‵□′)╯發(fā)??。記得有個(gè)比較經(jīng)典的案例是:我們在微信1.2版實(shí)現了群聊功能,但為了保證新舊版客戶(hù)端間的群聊體驗ヽ(′?`)ノ,我(wo)們通過(guò)服務(wù)器??適配,讓1.0版客戶(hù)端也能參與群聊。
圖 2 微信后臺系統架構
微信后臺使用三層架構:接入層、邏輯層和存儲層
微信后臺主要使用ヽ(′ー`)ノC++。后臺服務(wù)使用Svrkit框架搭建,服務(wù)之間通過(guò)同步RPC進(jìn)行通訊。
圖 3 Svrkit 框架
Svrkit是另一個(gè)廣硏后臺就已經(jīng)存在的高性能RPC框架,當時(shí)尚未廣泛使用,但在微信后臺卻大放異彩。作為微信后臺基礎設施中最重要的一部分,Svrkit這幾年一直不斷在進(jìn)化。我們使用Svrkit構建了數?????以千計的服務(wù)模塊,提供數萬(wàn)個(gè)服務(wù)接口,每天RPC調(diao)用次數達幾十萬(wàn)億次。
這三件事影響深遠,乃至于5年后的今天,我們仍繼續沿用最初的架構和協(xié)議,甚至還可??以支持當初1.0版的微信客戶(hù)端。
這里有一個(gè)經(jīng)驗教訓——運營(yíng)支撐系統真的(de)很重要。第一個(gè)版本的微信后臺是倉促完成的,當時(shí)只是完成了基礎業(yè)務(wù)功能,并沒(méi)有配套的業(yè)務(wù)數據統計等等。我們在開(kāi)放注冊后,一時(shí)間竟沒(méi)有業(yè)務(wù)監控頁(yè)面和數據曲線(xiàn)可以看,注冊用戶(hù)數是臨時(shí)從數據庫統計的,在線(xiàn)數是從日志里提??取出來(lái)的,這些數據通過(guò)每個(gè)小時(shí)運行一次??的腳本(這個(gè)腳本也是當天臨時(shí)加ヽ(′?`)ノ的)統計出來(lái),然后自動(dòng)??發(fā)(fa)郵件到郵件組。還有其他各種業(yè)務(wù)數據也通過(guò)郵件進(jìn)行發(fā)布,可以說(shuō)郵件是微信初期最重要的數據門(mén)戶(hù)。
2011.1.21 當天(′?ω?`)最高并發(fā)在線(xiàn)數是 49ヽ(′▽?zhuān)?ノ1,而今天這個(gè)數字是4億。
對于后臺而言,比較重要的變化就是這些功能催生了對異步隊列的需求。例如,微博私信需要跟外部門(mén)對接,不同系統(tong)間的處理耗時(shí)和速度不一樣,可以通過(guò)隊列進(jìn)行緩沖;群聊是耗時(shí)操作,消息發(fā)到群后,可以通過(guò)異步隊列來(lái)異步完成消息的擴散寫(xiě)等等。
圖 4 單聊和群聊消息發(fā)送過(guò)程
異步隊列作為后臺數據交互的一種重要模式,成為了同步RPC服??務(wù)調用之外的??有力補充,在微信后臺被大量使用。
微信的飛速發(fā)展是從2.0版開(kāi)始的,這個(gè)版本發(fā)布了語(yǔ)音聊天功能。之后微信用戶(hù)量急速增長(cháng),2??011??.5用戶(hù)量破100萬(wàn)、2011.7 用戶(hù)量破??100(′▽?zhuān)?)0萬(wàn)、2012.3 注冊用戶(hù)數突破1億。
伴隨著(zhù)喜人成績(jì)而來(lái)的,還有一堆幸福的煩惱:
后臺穩定性的要求:
用戶(hù)多了,功能也多了,后臺模塊數和機器量在不斷翻番,緊跟著(zhù)的還有各種故障。
幫助我們順利度過(guò)這個(gè)階段的,是以下幾個(gè)舉措:
雖然各種需求撲面而來(lái),但我們每個(gè)實(shí)現方案都是一絲不茍完成的。實(shí)現需求最大的困難不是設計出一個(gè)方案并實(shí)現出(T_T)來(lái),而是需要在若干個(gè)可能的方案中,甄選出??最簡(jiǎn)單實(shí)用的那個(gè)。
這中間往往需要經(jīng)過(guò)幾輪思考——討論——推翻的迭代過(guò)程,謀定而后動(dòng)有ヽ(′▽?zhuān)?ノ不少好處,一方面可以避免做出華而不實(shí)的過(guò)度設計,提升效率;另一方面,通過(guò)詳盡的討論出來(lái)的看似簡(jiǎn)單的方案,細節考究,往往是可靠性最好的方案。
邏輯層的業(yè)務(wù)邏輯服務(wù)最早只有一個(gè)服務(wù)模塊(我們稱(chēng)之為mmweb),囊括了所有提供給客戶(hù)端訪(fǎng)問(wèn)的API,甚至還有一個(gè)完整的微信官網(wǎng)。這個(gè)模塊架構類(lèi)似Ap??ache,由一個(gè)CGI容器(CGIHost)和(he)若干CGI組成(每個(gè)CGI即為一個(gè)API),不同之處在于每個(gè)CGI都是一個(gè)動(dòng)態(tài)庫so,由CGIHost動(dòng)態(tài)加載。
于是我們開(kāi)始嘗試使用一種新的??CGI架構——Logicsvr:
Logicsv??r基于Svrki?t框架。將Svrkit框架和CGI邏輯(′-ι_-`)通(tong)過(guò)靜態(tài)編譯生成可直接ヽ(′▽?zhuān)?ノ使用HTTP訪(fǎng)問(wèn)的Logicsvr。我們將mmweb模塊拆分為8個(gè)不ヾ(′▽?zhuān)??同服務(wù)模塊。拆(′Д` )分原則是:實(shí)現不同業(yè)務(wù)功能的CGI被拆到不同Logicsvr,同一功能(′?`*)但是重要程度不一樣的也進(jìn)行拆分。例如,作為核心功能的消息收發(fā)邏輯,就被拆為3個(gè)服務(wù)模塊:消息同步、發(fā)文本和語(yǔ)音消息、發(fā)圖片和視頻消息。
每個(gè)Logicsvr都是一個(gè)獨立的二進(jìn)制程序,可以分開(kāi)部署、ヾ(?■_■)ノ獨立上線(xiàn)。時(shí)至今日,微信后臺有數十個(gè)Logicsvr,提供了數百個(gè)CGI服務(wù),部署在數千臺服務(wù)器上,每日客戶(hù)端訪(fǎng)問(wèn)量幾千億次。
除了API??服務(wù)外,其他后臺服務(wù)模塊也遵循“大系統小做”這一實(shí)踐準則,微信后臺服務(wù)模塊數從微信發(fā)布時(shí)的約10個(gè)模塊,迅速上漲到數百個(gè)模塊。
這一時(shí)ヽ(′ー`)ノ期,后臺故障很多。比故障更麻煩的是,因為監控的缺失,經(jīng)常有些故障我們沒(méi)法第一時(shí)間發(fā)現,造成故障影響面??被放大。
監控的缺失一方面是因為(wei)在快速迭代過(guò)程中,重視功能開(kāi)發(fā),輕視了業(yè)務(wù)監控的重要性,有故障一直是兵來(lái)將擋水來(lái)土掩;另一方面是基礎設施對業(yè)務(wù)邏輯監控的支持度較弱?;A設施提供了機器資源監控和Svrkit服務(wù)運行狀態(tài)的監控。這個(gè)是每臺機器、每個(gè)服務(wù)標配的,無(wú)需額外開(kāi)發(fā),但是業(yè)務(wù)邏輯的監控就要麻煩得多了。
可以想象,這種費時(shí)費力的模式會(huì )反過(guò)來(lái)降低開(kāi)發(fā)人員對加入業(yè)務(wù)監控的積極性。于是有一天??,我們去公司內的標桿——即通后臺(QQ后臺)取經(jīng)了,發(fā)現解決方案出乎意料地簡(jiǎn)單且強大:
之前每次故障后,是由QA牽頭出一份故障報告,著(zhù)重點(diǎn)是對故障影響的評估和故??障定級。新的做??法是每個(gè)故障不分大小,開(kāi)發(fā)人員需要徹底復盤(pán)故障過(guò)程,然后商定解決方案,補充出一份詳細的技術(shù)報告。這份報告側重于:如何避免同類(lèi)型故障再次發(fā)生、提高故障主動(dòng)發(fā)現能力、縮短故障響應和處理過(guò)程。
【基于 ID-Value 的(de)業(yè)務(wù)無(wú)關(guān)的監控告警體系】
對于業(yè)務(wù)代碼來(lái)說(shuō),只需在要被監控的業(yè)務(wù)流程中調(′_`)用一下監控API,并配置好告警條件即可。這就極大地降低(╬?益?)了開(kāi)發(fā)監控報警的??成本,我們補全了各種監控項,讓我們能主動(dòng)及時(shí)地發(fā)現問(wèn)題。新開(kāi)發(fā)的功能也會(huì )預先加入相關(guān)監控項,以(╯‵□′)╯便在少量灰度階段就能直接通過(guò)監控曲線(xiàn)了解業(yè)務(wù)是否符合預ヾ(′?`)?期。
微信后臺每個(gè)存儲服務(wù)都有自己獨立的存儲模塊,是相互獨立的。每個(gè)存儲服務(wù)都有一個(gè)業(yè)務(wù)訪(fǎng)問(wèn)模??塊和一個(gè)底層存儲模塊組成。業(yè)務(wù)訪(fǎng)問(wèn)層隔離業(yè)(′?`*)務(wù)邏輯層和底層存儲,提供基于RPC的??數據訪(fǎng)問(wèn)接口;底層存儲有兩類(lèi):SDB和MySQL。
SDB適用于以用戶(hù)UIN(uin??t32_??t)為(′?`)Key的數(shu)據存儲,比方說(shuō)消息索引和聯(lián)系人。優(yōu)點(diǎn)是性ヽ(′ー`)ノ能高,在可靠性上,提供基于異步流水同步的Ma??s(′▽?zhuān)?ter-Slave模式,Master故(′?_?`)障時(shí),Slave可以提供讀數據服務(wù)快速裂變,無(wú)法寫(xiě)入新數據。
由于微信賬號為字母+數字組合,無(wú)法直接作為SDB的Key,所以微信帳號數據并非使用SDB,而是(shi)用MySQL存儲的。MySQL也使用基于異步流水復制的Master-Slave模式。
KVSvr使用基于Quorum的分布式數據強一致性算法,提供Key-Valu(′?`*)e/Ke(╯°□°)╯︵ ┻━┻y-??Table模型的存儲服務(wù)。傳統Quor??um算法的性能不高,KVSvr創(chuàng )造性(′?ω?`)地將數據的版本和數據本身做了區分,將Quorum算法應用到數據的版本的協(xié)商,再通過(guò)基于流(′▽?zhuān)?)水同步??的異步數據復制提供了數據強一致性保證和極高的數據寫(xiě)入性能,另外KVSvr天(′?`)然具備數據的Cache能力,可??以提供高效的讀取性能。
KVSvr一舉解決了我們當時(shí)迫切需要的無(wú)單點(diǎn)故障的容災能力。除了第5版的帳號服??務(wù)外,很快所有SDB底層存儲模塊和大部分MySQL底層存儲模塊都切換到KVSvr。隨著(zhù)業(yè)務(wù)的發(fā)(fa)展,KVSvr也不斷在進(jìn)化著(zhù),還配合業(yè)務(wù)需要衍??生出了各種定制版本?,F在(′▽?zhuān)?)的KVSvr仍然作為核心存儲,發(fā)揮著(zhù)舉足輕重的作用。
友情鏈接:
靈寶瑪遠網(wǎng)絡(luò )科技有限公司滄州銀啟網(wǎng)絡(luò )科技有限公司衡陽(yáng)豪暉網(wǎng)絡(luò )科技有限公司本溪事財網(wǎng)絡(luò )科技有限公司鳳城愛(ài)網(wǎng)網(wǎng)絡(luò )科技有限公司
© 2013-2025.Company name All rights reserved.網(wǎng)站地圖 天津九安特機電工程有限公司-More Templates