1分鐘出票5萬張!阿里電影節(jié)搶票技術(shù)揭秘
????阿里妹導(dǎo)讀:對于電影愛好者來說,每次的電影節(jié)、影展活動(dòng),都是搶票大戰(zhàn)的開啟,出票速度幾乎可以用“秒空”來形容,例如上海國際電影節(jié)線上開售的記錄是1分鐘售出5萬張。
今天,阿里高級開發(fā)工程師念賢主要圍繞售票環(huán)節(jié),講述阿里文娛的云智系統(tǒng)是如何支撐高流量并發(fā),保障系統(tǒng)的穩(wěn)定,不出現(xiàn)重賣等實(shí)現(xiàn)方案背后的技術(shù)。
一、背景介紹
先簡單分析一下電影節(jié)的搶票業(yè)務(wù),典型特征是在大流量搶購、高并發(fā)的場景下,讓用戶極快的鎖定座位然后出票,特別是熱門的影片,會(huì)異常的火爆。第一道壓力是查詢已售座位列表和鎖座,需要能快速的支撐用戶的鎖座請求,且實(shí)時(shí)查詢到已售賣的座位列表,避免發(fā)起無效的鎖座請求;第二道壓力是出票,如果鎖座成功,但一直出票失敗,會(huì)給用戶帶來很不好的體驗(yàn)。
二、架構(gòu)設(shè)計(jì)思考的方向
1.讓業(yè)務(wù)贏
在分層設(shè)計(jì)上,分成渠道接入層、業(yè)務(wù)層和服務(wù)層。在業(yè)務(wù)層,對外業(yè)務(wù)和管理后臺(tái)功能獨(dú)立,職責(zé)清晰,快速支撐業(yè)務(wù);服務(wù)層沉淀基礎(chǔ)服務(wù),構(gòu)成穩(wěn)定的業(yè)務(wù)和基礎(chǔ)服務(wù)。
?? 
圖2:業(yè)務(wù)技術(shù)大圖
2.讓系統(tǒng)穩(wěn)定
在架構(gòu)設(shè)計(jì)上,接入統(tǒng)一網(wǎng)關(guān)讓系統(tǒng)安全,有限流,對庫存中心和訂單中心進(jìn)行數(shù)據(jù)隔離,且加入多級緩存方案,讓系統(tǒng)穩(wěn)定。
?? 
圖3:技術(shù)架構(gòu)圖
三、實(shí)現(xiàn)方案與技術(shù)解析
1.高并發(fā)流量如何抗?
電影節(jié)的流量是非常典型的秒殺場景,瞬時(shí)流量非常高,對于系統(tǒng)的高性能要求就注定很高,在云智中,我們是如何抗高并發(fā)流量的?我們通過以下三點(diǎn)來進(jìn)行闡述:熱點(diǎn)數(shù)據(jù)隔離、流量削峰漏斗、多級緩存。
1)熱點(diǎn)數(shù)據(jù)隔離
在熱點(diǎn)隔離這塊,云智選擇的策略包括:數(shù)據(jù)隔離和業(yè)務(wù)隔離。
數(shù)據(jù)隔離:是把查詢已售賣座位和已鎖定座位等庫存相關(guān)的熱點(diǎn)數(shù)據(jù),隔離出來,單獨(dú)業(yè)務(wù)數(shù)據(jù)庫,且使用分庫分表,減少系統(tǒng)性能壓力,提高吞吐量。
業(yè)務(wù)隔離:電影節(jié)的業(yè)務(wù)數(shù)據(jù),獨(dú)立的業(yè)務(wù)數(shù)據(jù)生成能力,圈定參與活動(dòng)的業(yè)務(wù)數(shù)據(jù),進(jìn)行緩存預(yù)熱,起到隔離的效果。
2)流量削峰漏斗
關(guān)鍵詞是“分層削峰”,漏斗式的減少請求流量,在業(yè)務(wù)鏈路的過程中,我們會(huì)進(jìn)行業(yè)務(wù)校驗(yàn),層層過濾,如用戶的賬號安全、購買資格,影院、影廳等基礎(chǔ)信息狀態(tài)是否正常,要購買的商品信息狀態(tài)是否正常、秒殺是否已經(jīng)結(jié)束等,每個(gè)層次都盡可能的過濾掉非法的請求,只在最后端處理真正有效的請求,最終減少請求到數(shù)據(jù)庫DB的寫操作流量,保證系統(tǒng)處理真正有效的請求。
以鎖座流程為例子:
?? 
圖4:流量削峰漏斗示例圖
3)多級緩存
在分層漏斗的前提下,云智采用分布式緩存和本地緩存LocalCache多級緩存的方案來抵抗高并發(fā)流量,以下簡要介紹一下在系統(tǒng)中使用的策略:
a)緩存預(yù)熱。在指定參加活動(dòng)的場次后,會(huì)在限定時(shí)間內(nèi)停止變更,在開售前,會(huì)自動(dòng)進(jìn)行預(yù)熱緩存,避免激增流量擊穿緩存;
b)緩存失效時(shí)長控制,對基礎(chǔ)數(shù)據(jù)實(shí)體的VO對象和DO對象采用失效時(shí)間長短的緩存控制,靜態(tài)數(shù)據(jù)和DO實(shí)體使用長失效時(shí)長的策略:不失效或24H;動(dòng)態(tài)數(shù)據(jù)和實(shí)體Info使用比較短的失效時(shí)長策略:分鐘級,比如冪等性KEY的緩存時(shí)間為2min;
c)本地緩存LocalCache使用的緩存時(shí)長策略分3種:2s,60s,122s。優(yōu)先讀本地的緩存,其次讀遠(yuǎn)程分布式的緩存,使得系統(tǒng)可以抵抗瞬間的高并發(fā)流量。
示例圖如下所示:
?? 
圖5:多級緩存示例圖
將緩存分2層結(jié)構(gòu):
- 第一層是本地緩存結(jié)構(gòu):用戶、權(quán)限、基礎(chǔ)信息等靜態(tài)數(shù)據(jù),我們優(yōu)先選擇本地緩存;
- 第二層是全量的緩存實(shí)體信息的DO和VO信息,這層采用的是Tair分布式緩存。
2.系統(tǒng)的穩(wěn)定性、高可用性如何保證?
對于任何檔期或者活動(dòng),系統(tǒng)的穩(wěn)定性都是第一要素,針對電影節(jié)的活動(dòng)場景,我們使用了很多設(shè)計(jì)上的穩(wěn)定性模式,其中比較核心的有:多輪全鏈路壓測、限流、降級、動(dòng)態(tài)擴(kuò)容、流量調(diào)度、減少單點(diǎn)、依賴簡化等方式;除了以上幾點(diǎn),本節(jié)我們重點(diǎn)聊一聊我們在電影節(jié)過程中是如何保障備戰(zhàn)的?
1)保障備戰(zhàn)體系
?? 
圖6:保障備戰(zhàn)體系圖
a)在戰(zhàn)前階段
這個(gè)階段的工作會(huì)比較多,只有做到事前充分準(zhǔn)備,才能有更好的保障結(jié)果,主要包括以下幾個(gè)部分:
(1)梳理薄弱點(diǎn),包括系統(tǒng)架構(gòu)、系統(tǒng)薄弱點(diǎn)、核心主流程,識(shí)別出來后制定應(yīng)對策略;
(2)全鏈路壓測,對系統(tǒng)進(jìn)行全鏈路壓測,找出系統(tǒng)可以承載的最大QPS;
(3)限流配置,為系統(tǒng)配置安全的、符合業(yè)務(wù)需求的限流閥值;
(4)應(yīng)急預(yù)案,收集各個(gè)域的可能風(fēng)險(xiǎn)點(diǎn),制作應(yīng)急處理方案;
(5)安全保障,主要聚焦在賬號權(quán)限管控,以最小夠用原則為準(zhǔn),防止權(quán)限濫用,安全無小事;
(6)戰(zhàn)前演練,通過演練來檢驗(yàn)保障體系是否完善,演練開票現(xiàn)場,提高團(tuán)隊(duì)響應(yīng)和處理能力;
(7)作戰(zhàn)手冊,制定作戰(zhàn)手冊,明確作戰(zhàn)流程和關(guān)鍵點(diǎn)節(jié)點(diǎn)的任務(wù)以及溝通機(jī)制。
?? ??
第九屆北京國際電影節(jié)保障現(xiàn)場
b)在戰(zhàn)中階段
活動(dòng)開售,我們也稱為戰(zhàn)中,整個(gè)項(xiàng)目組主要專注三件事情,即“監(jiān)控““響應(yīng)”和“記錄”。項(xiàng)目組的同學(xué)都必須要保持作戰(zhàn)狀態(tài),嚴(yán)格按照應(yīng)用owner機(jī)制,負(fù)責(zé)巡檢應(yīng)用情況,及時(shí)同步技術(shù)數(shù)據(jù)和業(yè)務(wù)數(shù)據(jù)是否有異常。同時(shí),在戰(zhàn)中,我們臨時(shí)組建“保障虛擬小組”,用于應(yīng)對大促期間可能出現(xiàn)的緊急客訴等問題,及時(shí)做出決策,控制影響范圍,同時(shí)也能提高整體作戰(zhàn)能力。記錄,是在戰(zhàn)中過程中必須要記錄下各應(yīng)用的峰值,及時(shí)沉淀技術(shù)數(shù)據(jù),為后續(xù)系統(tǒng)建設(shè),流量評估等提供參考借鑒。
c)在戰(zhàn)后階段
這個(gè)階段的主要工作是項(xiàng)目復(fù)盤,復(fù)盤的內(nèi)容主要包括:項(xiàng)目結(jié)果、項(xiàng)目回顧、項(xiàng)目沉淀和改進(jìn),將項(xiàng)目過程中收集到的問題和故障進(jìn)行詳細(xì)分析,并將項(xiàng)目過程中沉淀出來的,關(guān)于系統(tǒng)穩(wěn)定性保障的經(jīng)驗(yàn)沉淀到日常,讓活動(dòng)保障的常態(tài)化逐步落地。
2)優(yōu)秀實(shí)踐
a)精準(zhǔn)監(jiān)控
通過監(jiān)控,實(shí)時(shí)發(fā)現(xiàn)各個(gè)服務(wù)是否觸發(fā)限流值,及時(shí)進(jìn)行Review,調(diào)整限流值,保證業(yè)務(wù)成功率和系統(tǒng)穩(wěn)定。
對系統(tǒng)基礎(chǔ)值班和業(yè)務(wù)量指標(biāo)進(jìn)行精準(zhǔn)監(jiān)控,如load,內(nèi)存,PV,UV,錯(cuò)誤量等,避免因內(nèi)存泄露或代碼的Bug對系統(tǒng)產(chǎn)生影響,精準(zhǔn)監(jiān)控,提前感知內(nèi)存泄露等問題。
b)數(shù)據(jù)大盤
通過數(shù)據(jù)大盤,實(shí)時(shí)匯總數(shù)據(jù),展示業(yè)務(wù)數(shù)據(jù),為系統(tǒng)、為業(yè)務(wù)提供更加直觀的業(yè)務(wù)支持,也可以更加有效的進(jìn)行業(yè)務(wù)備戰(zhàn)。
?? ??
第二十二屆上海國際電影節(jié)保障現(xiàn)場
3.如何保證不出現(xiàn)重賣?
在業(yè)務(wù)過程中,我們實(shí)現(xiàn)了很多業(yè)務(wù),解決了很多困難,我們重點(diǎn)闡述以下兩個(gè)痛點(diǎn),一個(gè)是惡意鎖座,一個(gè)是防止超賣。
1)如何解決惡意鎖座?
首先我們采用的扣減庫存方式是預(yù)扣庫存,用戶操作鎖定座位時(shí)即鎖定庫存,那我們?nèi)绾谓鉀Q惡意鎖座呢?
a)鎖座訂單中會(huì)生成一個(gè)“庫存失效時(shí)間”,超過該時(shí)間,鎖座訂單會(huì)失效釋放庫存;
b)限制用戶購買數(shù)量,一人最多只能購買6張票;
c)接入黃牛防控系統(tǒng);
2)如何防止庫存超賣?
電影票不同于電商業(yè)務(wù)普通的標(biāo)品,是不允許出現(xiàn)超賣的情況,否則會(huì)出現(xiàn)重票,從而引發(fā)客訴輿論問題,所以在庫存數(shù)據(jù)一致性上,需要保障在高并發(fā)情況下不出現(xiàn)重票,我們的解決方案是:
a)使用分布式緩存,在分布式緩存中預(yù)減庫存,減少數(shù)據(jù)庫訪問;
b)使用數(shù)據(jù)庫唯一鍵,在鎖座表中,設(shè)定場次Id和座位Id作為唯一鍵。鎖定座位時(shí),如果座位已經(jīng)售賣,會(huì)報(bào)出數(shù)據(jù)庫異常,不允許某一個(gè)座位重復(fù)售賣。
四、總結(jié)
回顧電影節(jié)搶票,我們首先想到的是能抗高并發(fā)流量,能讓系統(tǒng)穩(wěn)定。通過上述章節(jié)我們揭開了高性能、高可用等背后的技術(shù),展示了一個(gè)典型搶票大戰(zhàn)的技術(shù)方案,核心技術(shù)包括:
- 讓業(yè)務(wù)贏 = 完整的業(yè)務(wù)應(yīng)用 + 支撐核心業(yè)務(wù)
- 高性能、高可用 = 流量削峰 + 限流降級 + 多級緩存
- 平臺(tái)成熟化 = 完善的監(jiān)控 + 保障方案
在這個(gè)過程中,我們沿著讓系統(tǒng)穩(wěn)定、讓業(yè)務(wù)贏的設(shè)計(jì)思想,不斷的思考和落地這些技術(shù)細(xì)節(jié),沉淀核心技術(shù),以達(dá)到讓用戶體驗(yàn)流暢的搶票過程。
























