一、背景介紹
先簡單分析一下電影節的搶票業務,典型特征是在大流量搶購、高并發的場景下,讓使用者極快的鎖定座位然後出票,特别是熱門的影片,會異常的火爆。第一道壓力是查詢已售座位清單和鎖座,需要能快速的支撐使用者的鎖座請求,且實時查詢到已售賣的座位清單,避免發起無效的鎖座請求;第二道壓力是出票,如果鎖座成功,但一直出票失敗,會給使用者帶來很不好的體驗。
二、架構設計思考的方向
1.讓業務赢
在分層設計上,分成管道接入層、業務層和服務層。在業務層,對外業務和管理背景功能獨立,職責清晰,快速支撐業務;服務層沉澱基礎服務,構成穩定的業務和基礎服務。

圖1:業務技術大圖
2.讓系統穩定
在架構設計上,接入統一網關讓系統安全,有限流,對庫存中心和訂單中心進行資料隔離,且加入多級緩存方案,讓系統穩定。
圖2:技術架構圖
三、實作方案與技術解析
1.高并發流量如何抗?
電影節的流量是非常典型的秒殺場景,瞬時流量非常高,對于系統的高性能要求就注定很高,在雲智中,我們是如何抗高并發流量的?我們通過以下三點來進行闡述:熱點資料隔離、流量削峰漏鬥、多級緩存。
1)熱點資料隔離
在熱點隔離這塊,雲智選擇的政策包括:資料隔離和業務隔離。
資料隔離:是把查詢已售賣座位和已鎖定座位等庫存相關的熱點資料,隔離出來,單獨業務資料庫,且使用分庫分表,減少系統性能壓力,提高吞吐量。
業務隔離:電影節的業務資料,獨立的業務資料生成能力,圈定參與活動的業務資料,進行緩存預熱,起到隔離的效果。
2)流量削峰漏鬥
關鍵詞是“分層削峰”,漏鬥式的減少請求流量,在業務鍊路的過程中,我們會進行業務校驗,層層過濾,如使用者的賬号安全、購買資格,影院、影廳等基礎資訊狀态是否正常,要購買的商品資訊狀态是否正常、秒殺是否已經結束等,每個層次都盡可能的過濾掉非法的請求,隻在最後端處理真正有效的請求,最終減少請求到資料庫DB的寫操作流量,保證系統處理真正有效的請求。
以鎖座流程為例子:
圖3:流量削峰漏鬥示例圖
3)多級緩存
在分層漏鬥的前提下,雲智采用分布式緩存和本地緩存LocalCache多級緩存的方案來抵抗高并發流量,以下簡要介紹一下在系統中使用的政策:
a)緩存預熱。在指定參加活動的場次後,會在限定時間内停止變更,在開售前,會自動進行預熱緩存,避免激增流量擊穿緩存;
b)緩存失效時長控制,對基礎資料實體的VO對象和DO對象采用失效時間長短的緩存控制,靜态資料和DO實體使用長失效時長的政策:不失效或24H;動态資料和實體Info使用比較短的失效時長政策:分鐘級,比如幂等性KEY的緩存時間為2min;
c)本地緩存LocalCache使用的緩存時長政策分3種:2s,60s,122s。優先讀本地的緩存,其次讀遠端分布式的緩存,使得系統可以抵抗瞬間的高并發流量。
示例圖如下所示:
圖4:多級緩存示例圖
将緩存分2層結構:
第一層是本地緩存結構:使用者、權限、基礎資訊等靜态資料,我們優先選擇本地緩存;
第二層是全量的緩存實體資訊的DO和VO資訊,這層采用的是Tair分布式緩存。
2.系統的穩定性、高可用性如何保證?
對于任何檔期或者活動,系統的穩定性都是第一要素,針對電影節的活動場景,我們使用了很多設計上的穩定性模式,其中比較核心的有:多輪全鍊路壓測、限流、降級、動态擴容、流量排程、減少單點、依賴簡化等方式;除了以上幾點,本節我們重點聊一聊我們在電影節過程中是如何保障備戰的?
1)保障備戰體系
圖5:保障備戰體系圖
a)在戰前階段
這個階段的工作會比較多,隻有做到事前充分準備,才能有更好的保障結果,主要包括以下幾個部分:
(1)梳理薄弱點,包括系統架構、系統薄弱點、核心主流程,識别出來後制定應對政策;
(2)全鍊路壓測,對系統進行全鍊路壓測,找出系統可以承載的最大QPS;
(3)限流配置,為系統配置安全的、符合業務需求的限流閥值;
(4)應急預案,收集各個域的可能風險點,制作應急處理方案;
(5)安全保障,主要聚焦在賬号權限管控,以最小夠用原則為準,防止權限濫用,安全無小事;
(6)戰前演練,通過演練來檢驗保障體系是否完善,演練開票現場,提高團隊響應和處理能力;
(7)作戰手冊,制定作戰手冊,明确作戰流程和關鍵點節點的任務以及溝通機制。
第九屆北京國際電影節保障現場
b)在戰中階段
活動開售,我們也稱為戰中,整個項目組主要專注三件事情,即“監控““響應”和“記錄”。項目組的同學都必須要保持作戰狀态,嚴格按照應用owner機制,負責巡檢應用情況,及時同步技術資料和業務資料是否有異常。同時,在戰中,我們臨時組建“保障虛拟小組”,用于應對大促期間可能出現的緊急客訴等問題,及時做出決策,控制影響範圍,同時也能提高整體作戰能力。記錄,是在戰中過程中必須要記錄下各應用的峰值,及時沉澱技術資料,為後續系統建設,流量評估等提供參考借鑒。
c)在戰後階段
這個階段的主要工作是項目複盤,複盤的内容主要包括:項目結果、項目回顧、項目沉澱和改進,将項目過程中收集到的問題和故障進行詳細分析,并将項目過程中沉澱出來的,關于系統穩定性保障的經驗沉澱到日常,讓活動保障的常态化逐漸落地。
2)最佳實踐
a)精準監控
通過監控,實時發現各個服務是否觸發限流值,及時進行Review,調整限流值,保證業務成功率和系統穩定。
對系統基礎值班和業務量名額進行精準監控,如load,記憶體,PV,UV,錯誤量等,避免因記憶體洩露或代碼的Bug對系統産生影響,精準監控,提前感覺記憶體洩露等問題。
b)資料大盤
通過資料大盤,實時彙總資料,展示業務資料,為系統、為業務提供更加直覺的業務支援,也可以更加有效的進行業務備戰。
第二十二屆上海國際電影節保障現場
3.如何保證不出現重賣?
在業務過程中,我們實作了很多業務,解決了很多困難,我們重點闡述以下兩個痛點,一個是惡意鎖座,一個是防止超賣。
1)如何解決惡意鎖座?
首先我們采用的扣減庫存方式是預扣庫存,使用者操作鎖定座位時即鎖定庫存,那我們如何解決惡意鎖座呢?
a)鎖座訂單中會生成一個“庫存失效時間”,超過該時間,鎖座訂單會失效釋放庫存;
b)限制使用者購買數量,一人最多隻能購買6張票;
c)接入黃牛防控系統;
2)如何防止庫存超賣?
電影票不同于電商業務普通的标品,是不允許出現超賣的情況,否則會出現重票,進而引發客訴輿論問題,是以在庫存資料一緻性上,需要保障在高并發情況下不出現重票,我們的解決方案是:
a)使用分布式緩存,在分布式緩存中預減庫存,減少資料庫通路;
b)使用資料庫唯一鍵,在鎖座表中,設定場次Id和座位Id作為唯一鍵。鎖定座位時,如果座位已經售賣,會報出資料庫異常,不允許某一個座位重複售賣。
四、總結
回顧電影節搶票,我們首先想到的是能抗高并發流量,能讓系統穩定。通過上述章節我們揭開了高性能、高可用等背後的技術,展示了一個典型搶票大戰的技術方案,核心技術包括:
- 讓業務赢 = 完整的業務應用 + 支撐核心業務
- 高性能、高可用 = 流量削峰 + 限流降級 + 多級緩存
- 平台成熟化 = 完善的監控 + 保障方案
在這個過程中,我們沿着讓系統穩定、讓業務赢的設計思想,不斷的思考和落地這些技術細節,沉澱核心技術,以達到讓使用者體驗流暢的搶票過程。