基於雲原生的秒殺系統設計思路
秒殺服務需要單獨進行特別分析,主要有下面兩個原因:
- 秒殺服務的重要性:秒殺活動本身已經是很多業務推廣的重要方式之一,大部分的電商類業務都會涉及這一促銷方式。很多非直接秒殺的業務(如火車購票),在實際運行時也會碰到類似秒殺的場景。秒殺實際上就是在瞬時極大並發場景下如何保證系統正常運行的問題,而這種場景對很多系統都是無法避免的,因此在系統設計時,我們往往要考慮到秒殺的影響。
- 系統實現難度:秒殺最能考驗系統負載能力,瞬間湧入平時數十倍甚至數百倍的壓力,對開發和運維人員來說都是噩夢,這也為系統設計帶來了巨大的挑戰。針對秒殺活動的處理,是一個系統性的設計,並不是單一模塊或者層面可以解決的問題,需要從系統設計整體進行考量。
處理秒殺的指導思路
秒殺的核心問題就是極高並發處理,由於系統要在瞬時承受平時數十倍甚至上百倍的流量,這往往超出系統上限,因此處理秒殺的核心思路是流控和性能優化。
流控
- 請求流控
儘可能在上游攔截和限制請求,限制流入後端的量,保證後端系統正常。
因為無論多少人參與秒殺,實際成交往往是有限的,而且遠小於參加秒殺的人數,因此可以通過前端系統進行攔截,限制最終流入系統的請求數量,來保證系統正常進行。
- 客戶端流控
在客戶端進行訪問限制,較為合適的做法是屏蔽用戶高頻請求,比如在網頁中設置5s一次訪問限制,可以防止用戶過度刷介面。這種做法較為簡單,用戶體驗也尚可,可以攔截大部分小白用戶的異常訪問,比如狂刷F5。關鍵是要明確告知用戶,如果像一些搶購系統那樣假裝提交一個排隊頁面但又不回應任何請求,就是赤裸裸的欺騙了。
- Web端流控
對客戶端,特別是頁面端的限流,對稍有編程知識或者網路基礎的用戶而言沒有作用(可以簡單修改JS或者模擬請求),因此服務端流控是必要的。服務端限流的配置方法有很多種,現在的主流Web伺服器一般都支持配置訪問限制,可以通過配置實現簡單的流控。
但是這種限制一般都在協議層。如果要實現更為精細的訪問限制(根據業務邏輯限流),可以在後端伺服器上,對不同業務實現訪問限制。常見做法是可以通過在內存或緩存服務中加入請求訪問信息,來實現訪問量限制。
- 後端系統流控
上述的流控做法只能限制用戶異常訪問,如果正常訪問的用戶數量很多,就有後端系統壓力過大甚至異常宕機的可能,因此需要後端系統流量控制。
對於後端系統的訪問限制可以通過非同步處理、消息隊列、並發限制等方式實現。核心思路是保證後端系統的壓力維持在可以正常處理的水平。對於超過系統負載的請求,可以選擇直接拒絕,以此來對系統進行保護,保證在極限壓力的情況下,系統有合理範圍內的處理能力。
系統架構優化
除了流控之外,提高系統的處理能力也是非常重要的,通過系統設計和架構優化,可以提高系統的吞吐量和抗壓能力。關於通用系統性能的提升,已經超出本節的範圍,這裡只會提幾點和秒殺相關的優化。
- 讀取加速:在秒殺活動中,數據需求一般都是讀多寫少。20萬人搶2000個商品,最後提交的訂單最多也就2000個,但是在秒殺過程中,這20萬人會一直產生大量的讀取請求。因此可以使用緩存服務對用戶請求進行緩存優化,把一些高頻訪問的內容放到緩存中去。對於更大規模的系統,可以通過靜態文件分離、CDN服務等把用戶請求分散到外圍設施中去,以此來分擔系統壓力。
- 非同步處理和排隊:通過消息隊列和非同步調用的方式可以實現介面非同步處理,快速響應用戶請求,在後端有較為充足的時間來處理實際的用戶操作,提高對用戶請求的響應速度,從而提升用戶體驗。通過消息隊列還可以隔離前端的壓力,實現排隊系統,在湧入大量壓力的情況下保證系統可以按照正常速率來處理請求,不會被流量壓垮。
- 無狀態服務設計:相對於有狀態服務,無狀態服務更容易進行擴展,實現無狀態化的服務可以在秒殺活動前進行快速擴容。而雲化的服務更是有著先天的擴容優勢,一般都可以實現分鐘級別的資源擴容。
系統擴容
這項內容是在雲計算環境下才成為可能,相對於傳統的IT行業,雲計算提供了快速的系統交付能力(min VS. day),因此可以做到按需分配,在業務需要時實現資源的並行擴展。
對一次成功的秒殺活動來說,無論如何限流,如何優化系統,最終產生數倍於正常請求的壓力是很正常的。因此臨時性的系統擴容必不可少,系統擴容包括以下3個方面。
- 增加系統規格:可以預先增加系統容量,比如提高系統帶寬、購買更多流量等。
- 服務擴展:無狀態服務+負載均衡可以直接進行水平擴展,有狀態的服務則需要進行較為複雜的垂直擴展,增大實例規格。
- 後端系統擴容:緩存服務和資料庫服務都可以進行容量擴展。
秒殺服務實踐
一般來說,流控的實現,特別是業務層流控,依賴於業務自身的設計,因此雲計算提供的服務在於更多、更完善的基礎設計,來支持用戶進行更簡單的架構優化和擴容能力。
系統架構優化
通過CDN服務和對象存儲服務來分離靜態資源,實現靜態資源的加速,避免伺服器被大量靜態資源請求過度佔用。要實現非同步的消息處理,可以使用隊列服務來傳輸消息,以達到消息非同步化和流控。
系統擴容
雲服務會提供按需計費的資源分配方式和分鐘級甚至秒級的資源交付能力,根據需要快速進行資源定製和交付。
內部系統可以通過負載均衡等服務實現並行擴展,在網易雲基礎服務中,用戶可以直接使用 Kubernetes 的 Replication Controller 服務實現在線水平擴容。對於對外提供的 Web 系統,可以通過負載均衡服務實現水平在線擴展。
對於後端系統來說,建議使用雲計算服務商提供的基礎服務來實現並行擴展。例如,網易雲基礎服務就提供了分散式緩存服務和資料庫服務,支持在線擴容。
本文節選自《雲原生應用架構實踐》,網易雲基礎服務架構團隊著。
推薦閱讀:
※智慧城市的互聯網雲腦架構,7種城市神經反射弧的建設是重點
※阿里雲發力人工智慧,殺入醫療、工業勝算幾何?
※精彩啟程 | AWS re:Invent 2017 第一天回顧
※從0到數千萬日活,靠什麼?音樂+社交