在线精品91青草国产在线观看_久久久亚洲精品蜜桃臀_欧美日韩高清不卡免费观看_国产欧美日韩精品第一区_青青青爽视频在线观看_中文字幕在线免费视频_亚洲视频一区在线播放_亚洲国产精品综合久久网络_日本一区二区三区欧美在线观看

從0到1:微信后臺(tái)系統(tǒng)的演進(jìn)之路

發(fā)布時(shí)間:

2022-11-08

訪問(wèn)量:

0

2個(gè)月的開(kāi)發(fā)時(shí)間,微信后臺(tái)系統(tǒng)經(jīng)歷了從0到1的過(guò)程。從小步慢跑到快速成長(zhǎng),經(jīng)歷了平臺(tái)化到走出國(guó)門(mén),微信交出的這份優(yōu)異答卷,解題思路是怎樣的?本文由張文瑞,微信后臺(tái)團(tuán)隊(duì)出品。

從無(wú)到有

2011.1.21 微信正式發(fā)布。這一天距離微信項(xiàng)目啟動(dòng)日約為2個(gè)月。就在這2個(gè)月里,微信從無(wú)到有,大家可能會(huì)好奇這期間微信后臺(tái)做的最重要的事情是什么?

我想應(yīng)該是以下三件事:

1

確定了微信的消息模型

微信起初定位是一個(gè)通訊工具,作為通訊工具最核心的功能是收發(fā)消息。微信團(tuán)隊(duì)源于廣硏團(tuán)隊(duì),消息模型跟郵箱的郵件模型也很有淵源,都是存儲(chǔ)轉(zhuǎn)發(fā)。

圖 1 微信消息模型

圖1展示了這一消息模型,消息被發(fā)出后,會(huì)先在后臺(tái)臨時(shí)存儲(chǔ);為使接收者能更快接收到消息,會(huì)推送消息通知給接收者;最后客戶(hù)端主動(dòng)到服務(wù)器收取消息。

2

制定了數(shù)據(jù)同步協(xié)議

由于用戶(hù)的帳戶(hù)、聯(lián)系人和消息等數(shù)據(jù)都在服務(wù)器存儲(chǔ),如何將數(shù)據(jù)同步到客戶(hù)端就成了很關(guān)鍵的問(wèn)題。為簡(jiǎn)化協(xié)議,我們決定通過(guò)一個(gè)統(tǒng)一的數(shù)據(jù)同步協(xié)議來(lái)同步用戶(hù)所有的基礎(chǔ)數(shù)據(jù)。

最初的方案是客戶(hù)端記錄一個(gè)本地?cái)?shù)據(jù)的快照(Snapshot),需要同步數(shù)據(jù)時(shí),將Snapshot帶到服務(wù)器,服務(wù)器通過(guò)計(jì)算Snapshot與服務(wù)器數(shù)據(jù)的差異,將差異數(shù)據(jù)發(fā)給客戶(hù)端,客戶(hù)端再保存差異數(shù)據(jù)完成同步。不過(guò)這個(gè)方案有兩個(gè)問(wèn)題:一是Snapshot會(huì)隨著客戶(hù)端數(shù)據(jù)的增多變得越來(lái)越大,同步時(shí)流量開(kāi)銷(xiāo)大;二是客戶(hù)端每次同步都要計(jì)算Snapshot,會(huì)帶來(lái)額外的性能開(kāi)銷(xiāo)和實(shí)現(xiàn)復(fù)雜度。

幾經(jīng)討論后,方案改為由服務(wù)計(jì)算Snapshot,在客戶(hù)端同步數(shù)據(jù)時(shí)跟隨數(shù)據(jù)一起下發(fā)給客戶(hù)端,客戶(hù)端無(wú)需理解Snapshot,只需存儲(chǔ)起來(lái),在下次數(shù)據(jù)同步數(shù)據(jù)時(shí)帶上即可。同時(shí),Snapshot被設(shè)計(jì)得非常精簡(jiǎn),是若干個(gè)Key-Value的組合,Key代表數(shù)據(jù)的類(lèi)型,Value代表給到客戶(hù)端的數(shù)據(jù)的最新版本號(hào)。Key有三個(gè),分別代表:帳戶(hù)數(shù)據(jù)、聯(lián)系人和消息。這個(gè)同步協(xié)議的一個(gè)額外好處是客戶(hù)端同步完數(shù)據(jù)后,不需要額外的ACK協(xié)議來(lái)確認(rèn)數(shù)據(jù)收取成功,同樣可以保證不會(huì)丟數(shù)據(jù):只要客戶(hù)端拿最新的Snapshot到服務(wù)器做數(shù)據(jù)同步,服務(wù)器即可確認(rèn)上次數(shù)據(jù)已經(jīng)成功同步完成,可以執(zhí)行后續(xù)操作,例如清除暫存在服務(wù)的消息等等。

此后,精簡(jiǎn)方案、減少流量開(kāi)銷(xiāo)、盡量由服務(wù)器完成較復(fù)雜的業(yè)務(wù)邏輯、降低客戶(hù)端實(shí)現(xiàn)的復(fù)雜度就作為重要的指導(dǎo)原則,持續(xù)影響著后續(xù)的微信設(shè)計(jì)開(kāi)發(fā)。記得有個(gè)比較經(jīng)典的案例是:我們?cè)谖⑿?.2版實(shí)現(xiàn)了群聊功能,但為了保證新舊版客戶(hù)端間的群聊體驗(yàn),我們通過(guò)服務(wù)器適配,讓1.0版客戶(hù)端也能參與群聊。

3

定型了后臺(tái)架構(gòu)

圖 2 微信后臺(tái)系統(tǒng)架構(gòu)

微信后臺(tái)使用三層架構(gòu):接入層、邏輯層和存儲(chǔ)層。

  1. 接入層提供接入服務(wù),包括長(zhǎng)連接入服務(wù)和短連接入服務(wù)。長(zhǎng)連接入服務(wù)同時(shí)支持客戶(hù)端主動(dòng)發(fā)起請(qǐng)求和服務(wù)器主動(dòng)發(fā)起推送;短連接入服務(wù)則只支持客戶(hù)端主動(dòng)發(fā)起請(qǐng)求。
  2. 邏輯層包括業(yè)務(wù)邏輯服務(wù)和基礎(chǔ)邏輯服務(wù)。業(yè)務(wù)邏輯服務(wù)封裝了業(yè)務(wù)邏輯,是后臺(tái)提供給微信客戶(hù)端調(diào)用的API?;A(chǔ)邏輯服務(wù)則抽象了更底層和通用的業(yè)務(wù)邏輯,提供給業(yè)務(wù)邏輯服務(wù)訪問(wèn)。
  3. 存儲(chǔ)層包括數(shù)據(jù)訪問(wèn)服務(wù)和數(shù)據(jù)存儲(chǔ)服務(wù)。數(shù)據(jù)存儲(chǔ)服務(wù)通過(guò)MySQL和SDB(廣硏早期后臺(tái)中廣泛使用的Key-Table數(shù)據(jù)存儲(chǔ)系統(tǒng))等底層存儲(chǔ)系統(tǒng)來(lái)持久化用戶(hù)數(shù)據(jù)。數(shù)據(jù)訪問(wèn)服務(wù)適配并路由數(shù)據(jù)訪問(wèn)請(qǐng)求到不同的底層數(shù)據(jù)存儲(chǔ)服務(wù),面向邏輯層提供結(jié)構(gòu)化的數(shù)據(jù)服務(wù)。比較特別的是,微信后臺(tái)每一種不同類(lèi)型的數(shù)據(jù)都使用單獨(dú)的數(shù)據(jù)訪問(wèn)服務(wù)和數(shù)據(jù)存儲(chǔ)服務(wù),例如帳戶(hù)、消息和聯(lián)系人等等都是獨(dú)立的。

微信后臺(tái)主要使用C++。后臺(tái)服務(wù)使用Svrkit框架搭建,服務(wù)之間通過(guò)同步RPC進(jìn)行通訊。

圖 3 Svrkit 框架

Svrkit是另一個(gè)廣硏后臺(tái)就已經(jīng)存在的高性能RPC框架,當(dāng)時(shí)尚未廣泛使用,但在微信后臺(tái)卻大放異彩。作為微信后臺(tái)基礎(chǔ)設(shè)施中最重要的一部分,Svrkit這幾年一直不斷在進(jìn)化。我們使用Svrkit構(gòu)建了數(shù)以千計(jì)的服務(wù)模塊,提供數(shù)萬(wàn)個(gè)服務(wù)接口,每天RPC調(diào)用次數(shù)達(dá)幾十萬(wàn)億次。

這三件事影響深遠(yuǎn),乃至于5年后的今天,我們?nèi)岳^續(xù)沿用最初的架構(gòu)和協(xié)議,甚至還可以支持當(dāng)初1.0版的微信客戶(hù)端。

這里有一個(gè)經(jīng)驗(yàn)教訓(xùn)——運(yùn)營(yíng)支撐系統(tǒng)真的很重要。第一個(gè)版本的微信后臺(tái)是倉(cāng)促完成的,當(dāng)時(shí)只是完成了基礎(chǔ)業(yè)務(wù)功能,并沒(méi)有配套的業(yè)務(wù)數(shù)據(jù)統(tǒng)計(jì)等等。我們?cè)陂_(kāi)放注冊(cè)后,一時(shí)間竟沒(méi)有業(yè)務(wù)監(jiān)控頁(yè)面和數(shù)據(jù)曲線可以看,注冊(cè)用戶(hù)數(shù)是臨時(shí)從數(shù)據(jù)庫(kù)統(tǒng)計(jì)的,在線數(shù)是從日志里提取出來(lái)的,這些數(shù)據(jù)通過(guò)每個(gè)小時(shí)運(yùn)行一次的腳本(這個(gè)腳本也是當(dāng)天臨時(shí)加的)統(tǒng)計(jì)出來(lái),然后自動(dòng)發(fā)郵件到郵件組。還有其他各種業(yè)務(wù)數(shù)據(jù)也通過(guò)郵件進(jìn)行發(fā)布,可以說(shuō)郵件是微信初期最重要的數(shù)據(jù)門(mén)戶(hù)。

2011.1.21 當(dāng)天最高并發(fā)在線數(shù)是 491,而今天這個(gè)數(shù)字是4億。

小步慢跑

在微信發(fā)布后的4個(gè)多月里,我們經(jīng)歷了發(fā)布后火爆注冊(cè)的驚喜,也經(jīng)歷了隨后一直不溫不火的困惑。

這一時(shí)期,微信做了很多旨在增加用戶(hù)好友量,讓用戶(hù)聊得起來(lái)的功能。打通騰訊微博私信、群聊、工作郵箱、QQ/郵箱好友推薦等等。對(duì)于后臺(tái)而言,比較重要的變化就是這些功能催生了對(duì)異步隊(duì)列的需求。例如,微博私信需要跟外部門(mén)對(duì)接,不同系統(tǒng)間的處理耗時(shí)和速度不一樣,可以通過(guò)隊(duì)列進(jìn)行緩沖;群聊是耗時(shí)操作,消息發(fā)到群后,可以通過(guò)異步隊(duì)列來(lái)異步完成消息的擴(kuò)散寫(xiě)等等。