歡迎你們前往騰訊雲社區,獲取更多騰訊海量技術實踐乾貨哦~前端
做者:騰訊技術工程官方號後端
微信朋友圈包括圖片和視頻兩套業務架構組成,朋友圈圖片的特色是請求量大、消耗計算資源較多,視頻則主要消耗帶寬。朋友圈的數據是永遠存儲的,並且隨着業務的快速發展,存儲容量、帶寬和設備的消耗大量增長,而重大節日帶來的使用量增加,更加重了消耗,也給運維人員的保障帶來了巨大壓力。緩存
節日保障主要由三方面組成:軟件保障指經過程序、業務邏輯層面的優化和評估,減輕負載;硬件保障主要指帶寬、機器負載的評估和擴容;柔性措施指的是經過業務調整,下降一些不重要特性的資源,來保障重點特性的正常運行。服務器
朋友圈總體狀況:微信
朋友圈的架構,主要分爲OC和IDC兩種,IDC指的是數據中心,即數據最終落地存儲的地方,OC指的是帶外網的獨立機房,SOC指規模較大的OC。每一個IDC都有一整套接口機/邏輯設備/存儲設備用以支撐用戶的上傳下載、及文件落地存儲的需求。架構
OC點的主要做用是提供外網訪問,承載用戶的下載流量。每一個OC內的設備,一塊兒組成一個緩存池,用戶下載時,本地OC中緩存不命中,纔到IDC去回源拉取文件。每一個OC的功能都是相同的,用戶通常到就近的OC點下載,當單個OC點故障時,會經過重試或者切換讓用戶到其餘OC點下載,確保下載成功。運維
朋友圈的模塊容災主要是實現單機故障時的自動剔除,主要形式是經過master管理服務器的ip列表,經過心跳探測等方式找到異常設備,並屏蔽故障ip,不返回給前端使用,以front層的單機剔除爲例:測試
若是整個OC或IDC點碰到故障,因爲變更較大,通常依賴運維人員手工切換來恢復,或者經過模塊之間的重試機制來保障微信支付
朋友圈下載的重試:優化
不論是用戶到OC的下載過程,仍是OC到IDC的回源過程,默認都會進行2次失敗後的重試,而且重試必定會選擇異地的接入點,避免繼續重試到故障的節點。實現的原理是每一層master都會返回給前端至少兩組ip列表,並保證兩組ip列表爲異地節點,前端失敗時才能夠實現異地重試。
但重試因爲會形成請求的增長,因此是把雙刃劍,節日期間因爲請求自己漲幅已經很高,重試更容易引起問題,須要進行調整:
1.經過master路由下發,關閉重試。在元旦/春節這種請求有數倍增加的節日實行。
2.值班人員嚴密監控,若是IDC失敗率超過20%,則緊急手工關閉重試。這種在中秋/國慶這種增加並不高的節日實行。
Front模塊的重試控制界面:
容量評估和設備擴容:
節日前運維人員會連同資源組,根據業務預算和業務增加的需求及實際負載,進行各個機房、模塊的設備擴容。預算之外的請求上漲,則經過柔性或者過載的方式,進行下降或者拒絕。
春節朋友圈上傳負載:
業務側春節要求的增加比例,是上傳支持9倍增加,下載支持1倍增加,超過這個比例的請求能夠拒絕掉,但根據預算擴容後,達到上圖的效果,仍是有部分模塊沒法支持這個漲幅,尤爲是壓縮compress模塊,該模塊每支持一倍增加就須要大量虛擬機擴容,預算內沒法支持,這樣就須要使用柔性策略來解決。
朋友圈的柔性策略分爲兩層:
第一層是粗暴柔性,即按比例、接業務直接限制上傳下載的請求,被限制的請求會返回給用戶失敗,與微信C2C相同,這種通常用於超過系統預估的負載能力,形成系統故障時用於快速恢復業務時使用。
第二層是按業務特性柔性,即從業務層面經過下降圖片視頻清晰度、延遲用戶更新等方向下降系統的負載。下面主要詳述業務柔性
朋友圈業務的主要增加與瓶頸:
從前文的設備負載評估圖看,在預算範圍內,接入層和邏輯層都只能支撐5倍增加,而壓縮compress模塊只能支撐1倍增加。
Compress模塊的做用是將客戶端上傳來的原始圖片按需求壓縮成各類格式和尺寸,以支持特定的業務場景,而且節省存儲空間和帶寬。因爲壓縮技術的不斷髮展,使用更先進的壓縮格式,同等清晰度的圖片壓縮比例越高,須要消耗的壓縮計算資源就越多。
因此若是反向操做,將當前使用的hevc格式替換回jpeg格式存儲的話,就能夠節省壓縮資源,實測compress的cpu負載能夠降爲20%,即支持5倍增加。但圖片的平均大小也會上漲,形成下載流量上漲。
因此採用的折衷方法,是在上傳圖片換回jpeg格式的同時,將圖片的清晰度從70降爲50,這樣能夠減少文件平均大小,從而抵消換回jpeg格式帶來的流量上漲效果。實際測試中,發現用戶對降清晰度的感知並不明顯,在節假日短暫開啓不會影響用戶體驗。
小視頻的帶寬平時會超過1TB,節日效應增加明顯。所採起的降流量方法與圖片相似,即下降上傳視頻的碼率,經過下降文件平均大小的方法來節省帶寬。
柔性: 小視頻碼率1800 -> 1200 平均大小 2.1MB -> 1.3MB
經測試,降碼率後基本不會影響用戶體驗,但因爲是對新上傳視頻生效,要體現到下載帶寬的降低中,就有至關程度的延遲,大約須要4小時徹底生效。因此這一柔性措施在節日以前就須要開啓,不能用於應付緊急狀況。
3.上傳TSSD緩衝池柔性
因爲上傳preupload接口機及後層的邏輯模塊等,都沒法支持10倍漲幅。因此在架構中另外搭建了兩套TSSD緩衝池,緩衝池用於臨時存儲新上傳的文件,能夠支持讀寫。按上圖所示,在zone模塊處增長了緩衝池一,在上傳preupload處,增長了緩衝池二。兩個緩衝池的做用是有區別的:
4.朋友圈timeline按比例柔性
timeline指的是微信朋友圈更新的時間戳,這一柔性的原理是將通知用戶好友朋友圈更新的時間戳先緩存起來,不下發給用戶的微信終端,這樣微信上就看不到朋友圈更新的內容了,也就不會產生下載圖片/視頻的請求,能夠直接減小下載流量。
但也有幾點注意事項:
此文已由做者受權騰訊雲技術社區發佈,轉載請註明原文出處