《朋友圈技術之道》

這個演講主要講了朋友圈背后的技術,主要有技術棧,微信朋友圈架構,朋友圈流程舉例,部署,接入和容災機制。

技術棧

開發(fā)語言主要使用c++,使用protobuf描述接口,支持使用進程/線程/協(xié)程多種方式,支持數(shù)十萬的并發(fā)協(xié)程,方便編寫和調試"同步"的網(wǎng)絡調用和服務。

開發(fā)模式采用敏捷開發(fā)方式,一月一個小版本,一季度一個大版本。

朋友圈架構

整體架構如下(圖片均來自ppt),最上面為接入層,接入主要維護長連接,長連接主要為了安卓系統(tǒng),一方面能夠減少新建連接的性能損耗,另一方面由于谷歌的國內服務基本不可用,安卓的推送通知都是通過長連接哎完成的。

接入層后面是邏輯層,邏輯層不僅有朋友圈,也有iOS的系統(tǒng)的通知,因為iOS App進入后臺后只有15s的存活期,所以iOS上的推送通知要用API的Push完成。

接下來是存儲代理層,這一層主要負責一些關鍵數(shù)據(jù)的維護操作,比如用戶在賬號里面的動作操作和事故信息。再往下是KV存儲層,這里不存在業(yè)務邏輯,只是單純的Key-Value映射,負載均衡和容錯。

朋友圈架構.png

整體的服務架構是微服務的架構,每個請求之后可能會涉及幾百個服務,每一個服務都會有一個QoS,會對重要的服務進行優(yōu)先保證。舉例來說,在除夕晚上是平時5倍流量的情況下,優(yōu)先保證支付,優(yōu)先保證紅包的體驗。紅包體驗保證了,再保證消息,比如點對點兩人之間的消息。這兩個保證的前提下,再保證群聊。如果群聊也能保證,再保證朋友圈。在性能不夠的情況下,會將優(yōu)先級低的服務暫時停掉,整個過程不需要人工干預。

朋友圈流程舉例

這里舉例說明一下,兩個用戶小王和Mary(如下圖)。小王和Mary各自有各自的相冊,可能在同一臺服務器上,也可能在不同的服務器上。現(xiàn)在小王上傳了一張圖片到自己的朋友圈。上傳圖片不經(jīng)過微信后臺服務器,而是直接上傳到最近的騰訊CDN節(jié)點,速度非??臁D片上傳到該CDN后,小王的微信客戶端會通知微信的朋友圈CDN:這里有一個新的發(fā)布(比如叫K2),這個發(fā)布的圖片URL是什么,誰能看到這些圖片,等等此類的元數(shù)據(jù),來把這個發(fā)布寫到發(fā)布的表里。

在發(fā)布的表寫完之后,會把這個K2的發(fā)布索引到小王的相冊表里。所以相冊表其實是很小的,里面只有索引指針。相冊表寫好了之后,會觸發(fā)一個批處理的動作。這個動作就是去跟小王的每個好友說,小王有一個新的發(fā)布,請把這個發(fā)布插入到每個好友的時間線里面去。

Mary上朋友圈了,而Mary是小王的一個好友。Mary拉自己的時間線的時候,時間線會告訴到有一個新的發(fā)布K2,然后Mary的微信客戶端就會去根據(jù)K2的元數(shù)據(jù)去獲取圖片在CDN上的URL,把圖片拉到本地。在這個過程中,發(fā)布是很重的,因為一方面要寫一個自己的數(shù)據(jù)副本,然后還要把這個副本的指針插到所有好友的時間線里面去。如果一個用戶有幾百個好友的話,這個過程會比較慢一些。這是一個單數(shù)據(jù)副本寫擴散的過程。但是相對應的,讀取就很簡單了,每一個用戶只需要讀取自己的時間線表,就這一個動作就行,而不需要去遍歷所有好友的相冊表。

使用寫擴散的原因是,如果使用讀是很容易失敗的,一個用戶如果要去讀兩百個好友的相冊表,極端情況下可能要去兩百個服務器上去問,這個失敗的可能性是很大的。但是寫失敗了就沒關系,因為寫是可以等待的,寫失敗了就重新去拷貝,直到插入成功為止。

舉例.png

部署,接入和容災機制

在同一個區(qū)域的部署,微信在上海有一個IDC,該IDC是由三個獨立的園區(qū)——A、B、C三個園區(qū)構成的。每一個園區(qū)都有獨立的供電、制冷,獨立的帶寬,帶寬同時連接聯(lián)通、電信,而且每個園區(qū)的容量都有富余。三個園區(qū)直接有高速連接。所以無論任何一個區(qū),比如C區(qū)整個不可用了,那么用戶的客戶端會自動連接到另外兩個區(qū),這兩個區(qū)有足夠的容量承載所有的服務。這種切換是無損的、無感知的。

跨地域的部署,微信目前有四個數(shù)據(jù)中心,上海,深圳,香港和加拿大,上海數(shù)據(jù)中心負責服務北方用戶,深圳服務南方客戶,香港數(shù)據(jù)中心服務東南亞,南亞,中東和非洲,加拿大數(shù)據(jù)中心負責服務美洲和歐洲客戶。

關于接入,數(shù)據(jù)中心之間設計到很多同步問題,微信消息的數(shù)據(jù)同步是通過一個idcqueue組件實現(xiàn)的,是一個異步的數(shù)據(jù)同步方式。這個異步的寫操作可能會由于網(wǎng)絡阻塞或者其他原因,慢個一兩秒種、幾分鐘甚至半天,但它會一直重試,能夠保持正確性。國內到國外的網(wǎng)絡延遲很大,從大陸ping美國可能兩百個毫秒,ping阿根廷或者南非可能有四百個毫秒,另外公網(wǎng)的丟包也比較嚴重,這對于數(shù)據(jù)同步的實現(xiàn)是很有影響的。為此,微信使用了自研的一套類似TCP的協(xié)議,這種協(xié)議對高延遲和高丟包有很高的容忍度。在國外專線也不能得到完全的保障,在專線終端時,會自動切換到公網(wǎng),并使用AES加密。

在朋友圈的評論數(shù)據(jù)同步的時候,微信使用因果一致性算法來保證數(shù)據(jù)的一致。

數(shù)據(jù)中心.png
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容