編者按與傳統(tǒng)意義上的紅包相比,近兩年火起來的“紅包”,似乎才是如今春節(jié)的一大重頭戲。歷經(jīng)上千年時代傳承與變遷,春節(jié)發(fā)紅包早已成為歷史沉淀的文化習(xí)俗,融入了民族的血脈。按照各家公布的數(shù)據(jù),除夕全天微信用戶紅包總發(fā)送量達到10.1億次,搖一搖互動量達到110億次,紅包峰值發(fā)送量為8.1億次/分鐘。春晚直播期間討論春晚的微博達到5191萬條,網(wǎng)友互動量達到1.15億,網(wǎng)友搶微博紅包的總次數(shù)超過8億次。
為此,InfoQ策劃了“春節(jié)紅包”系列文章,以期為讀者剖析各大平臺的紅包活動背后的技術(shù)細節(jié)。本文為微博篇。
隨著互聯(lián)網(wǎng)的發(fā)展,打破了以往傳統(tǒng)的發(fā)紅包,帶給了紅包全新的玩法。微博紅包已經(jīng)成為用戶給粉絲拜年的一種途徑,土豪版成為土豪刷存在感的方式。每年的紅包大戰(zhàn)都是用戶的現(xiàn)金盛宴,對于整個系統(tǒng)卻是殘酷的考驗。
微博有8億注冊用戶,單日活躍用戶數(shù)1.34億的社交平臺。紅包在微博平臺上運行,針對所有的微博用戶開放,微博所有用戶都可參與紅包活動。微博紅包有如下特點:
1.紅包價值高、種類多、覆蓋用戶廣,億級別用戶參與。
2.半點準時開搶,高并發(fā)訪問、瞬間峰值高,每分鐘帶來上億次的搶紅包峰值。
3.請求快速響應(yīng),更新億級用戶中獎狀態(tài)及紅包狀態(tài)。
4.單個紅包數(shù)額大。
春晚當(dāng)天紅包總價值超過10億,有1.34億用戶參與,產(chǎn)生了8億多次的搶紅包行為,其中并發(fā)量為平時峰值的10倍左右。在服務(wù)器數(shù)量一定的情況下,如何構(gòu)建高并發(fā)操作、瞬間峰值高的穩(wěn)定服務(wù)?對于團隊和架構(gòu)師都是一個極大的挑戰(zhàn)。這時候系統(tǒng)的架構(gòu)尤為重要!
紅包架構(gòu)
微博紅包支持每秒幾十萬次的操作,應(yīng)對突發(fā)性的熱點事件,快速響應(yīng),高內(nèi)聚低耦合的服務(wù)成了架構(gòu)首先要考慮的因素。
微博是社交型應(yīng)用,紅包在用戶數(shù)據(jù)、關(guān)系、搶紅包等結(jié)構(gòu)上存在著各種各樣復(fù)雜的依賴,這些依賴相比其它應(yīng)用來說,調(diào)用頻率更高,性能要求也更高。
如上圖所示,有多個應(yīng)用模塊接入紅包的服務(wù)層,服務(wù)層由多個節(jié)點組成,每個節(jié)點對應(yīng)相應(yīng)的功能并且相對獨立。代碼模塊的使用和組織上相對獨立,保證主功能的快速和穩(wěn)定,將附屬的新功能分離在獨立模塊中。其中紅色虛線框內(nèi)為核心的功能模塊,是重點需要保護的功能。
微博紅包提供獲取紅包屬性(紅包金額、紅包設(shè)置、紅包狀態(tài)、獲取抽取結(jié)果列表、拆包,抽獎等)接口。服務(wù)層調(diào)用紅包SDK相應(yīng)的API,會根據(jù)應(yīng)用層邏輯需求提供數(shù)據(jù)和定制化得數(shù)據(jù),完成前端完成交互,達到應(yīng)用層需要展現(xiàn)的效果。
防刷策略
微博紅包有別于微信用戶發(fā)出的紅包,微信用戶發(fā)出的紅包是針對自己所認識的朋友或者已存在于微信群的用戶;微博紅包是針對于微博所有用戶的紅包,通過分析參與紅包的用戶數(shù)據(jù)每年都會產(chǎn)生一些囤積大量賬號準備在春晚大發(fā)橫財?shù)墓竞蛡€人。如何防止微博紅包被自動注冊或者通過轉(zhuǎn)賣賬號來領(lǐng)取紅包?這成為面對我們需要解決的一大問題。
微博通過基于用戶在微博上的行為分析,通過登錄,發(fā)微博,身份驗證等方面來進行分析。主要有:
1.用戶注冊:通過用戶行為分析來識別機器注冊的用戶,則注冊環(huán)節(jié)進行攔截。
2.用戶登錄:分析用戶登錄的行為,通過驗證碼,身份驗證以及手機號驗證等措施來提高機器自動登錄的門檻。
3.賬號質(zhì)量:通過實名認證,微博的動態(tài)等方面來計算出用戶的質(zhì)量。
4.參與紅包:紅包戰(zhàn)場一貫是刷獎賬號的獲利主戰(zhàn)場, 通過用戶平時在微博的行為、屬性以及實時的登錄狀態(tài)和常用設(shè)備來進行分析,判斷是否是正常賬號來確定是否可以中獎。
完善的監(jiān)控
紅包系統(tǒng)是一個大而規(guī)則復(fù)雜的系統(tǒng),系統(tǒng)越大,依賴的資源越多,也就越容易出現(xiàn)各種各樣的問題。為了給提供穩(wěn)定運行的服務(wù),必須要能時刻知曉各個資源當(dāng)前的運行狀態(tài)。并且在系統(tǒng)出現(xiàn)異常之前或者出現(xiàn)異常的時候,對問題進行排查和定位。
如上圖所示,完善的監(jiān)控系統(tǒng),為微博紅包順利度過春晚提供了很好的保障。主要涉及的監(jiān)控如下:
1、應(yīng)用層接口響應(yīng)時間監(jiān)控
通過實時的分析access log日志,以HTTP code和響應(yīng)時間維度實時統(tǒng)計出接口的狀態(tài)和性能,根據(jù)占比來查看接口的健康程度。
2、服務(wù)層各模塊性能監(jiān)控
在模塊中記錄開始時間和結(jié)束時間,每次處理完計算出模塊的耗時,通過這種方式很好的發(fā)現(xiàn)各個模塊是否正常。
3、網(wǎng)絡(luò)層監(jiān)控
微博紅包的出口網(wǎng)絡(luò)是一個單獨的App池,出口帶寬使用到80%的時候網(wǎng)絡(luò)穩(wěn)定性就可能受到影響。通過計算后端服務(wù)器輸出計算出帶寬,以便能夠做到及時響應(yīng)擴容。
4、資源層的監(jiān)控
對各種資源的監(jiān)控,比如redis、MySQL、MC等資源的連接時間、狀態(tài)和操作的實時統(tǒng)計分析,快速定位是否存在資源瓶頸。
5、服務(wù)器的性能監(jiān)控
通過運維監(jiān)控系統(tǒng),對服務(wù)器的CPU、內(nèi)存使用情況,做到了能夠觀察每臺服務(wù)器具體的運行情況。
6、系統(tǒng)錯誤日志的監(jiān)控
系統(tǒng)錯誤監(jiān)控包括服務(wù)器負載,服務(wù)進程狀態(tài),資源連接,網(wǎng)絡(luò)連接出現(xiàn)的問題,實時通過手機,郵件和私信知道。為快速響應(yīng)創(chuàng)造了條件。
彈性資源管理和調(diào)度
1、故障的秒級切換
微博紅包服務(wù)部署在了三個機房(包括云服務(wù)),任何一個機房如果出現(xiàn)網(wǎng)絡(luò)或者其它不可預(yù)測的問題可以在幾秒鐘之內(nèi)將服務(wù)切換到其它機房。
2、資源的相互獨立
資源的相互獨立,讓資源的可擴展性變得容易。而且使得各個服務(wù)之間交叉影響達到了最小。
3、引入阿里云做為第三機房,使用Docker快速部署服務(wù)
紅包的核心服務(wù)主要分布在 2 個機房,兩者互相做為災(zāi)難備份用途,為應(yīng)對超預(yù)期的峰值,引入阿里云做為第三機房。使用定制化的紅包Docker快速部署服務(wù)來實現(xiàn)彈性調(diào)度架構(gòu)。通過Docker自動化操作大規(guī)模集群,進行彈性調(diào)度資源的任務(wù),實現(xiàn)快速部署服務(wù)來應(yīng)付超預(yù)期的峰值。
系統(tǒng)的挑戰(zhàn)和性能優(yōu)化
為了保證用戶體驗,微博紅包需要解決以下幾個問題:
1.系統(tǒng)性能的可靠性
2.關(guān)鍵節(jié)點的可用性
3.如何應(yīng)對突發(fā)熱點
4.業(yè)務(wù)頻繁迭代的處理
1、系統(tǒng)架構(gòu)的升級
模塊的獨立化,避免出現(xiàn)模塊間的相互影響。
Nginx+lua的使用,使得服務(wù)器的QPS有了數(shù)量級的提升,同時服務(wù)器集群做到了秒級重啟。
2、修枝剪頁
減少對于系統(tǒng)外部的依賴,梳理完整的調(diào)用關(guān)系圖。非核心功能使用異步調(diào)用,合并相關(guān)的調(diào)用,去掉重復(fù)的調(diào)用。保證核心調(diào)用邏輯,避免非核心業(yè)務(wù)影響核心業(yè)務(wù)。
3、多級緩存
服務(wù)端本地緩存,使用nginx本身緩存和服務(wù)器的L0緩存,來提升模塊的響應(yīng)速度,做到了90%以上核心接口的響應(yīng)時間在50ms以內(nèi),減少了進程等待時間,提升了服務(wù)器的處理速度。
一年一度的各大平臺搶紅包還會延續(xù)下去,這是一個斗智斗勇的過程,在服務(wù)器有限的情況下每一次與峰值的對抗都是對技術(shù)一次極大的挑戰(zhàn),每次挑戰(zhàn)都是帶來技術(shù)上的成長和收獲。