基於雲原生的秒殺系統設計思路

網易雲社群發表於2018-11-27

歡迎訪問網易雲社群,瞭解更多網易技術產品運營經驗。


秒殺服務需要單獨進行特別分析,主要有下面兩個原因:

  • 秒殺服務的重要性:秒殺活動本身已經是很多業務推廣的重要方式之一,大部分的電商類業務都會涉及這一促銷方式。很多非直接秒殺的業務(如火車購票),在實際執行時也會碰到類似秒殺的場景。秒殺實際上就是在瞬時極大併發場景下如何保證系統正常執行的問題,而這種場景對很多系統都是無法避免的,因此在系統設計時,我們往往要考慮到秒殺的影響。

  • 系統實現難度:秒殺最能考驗系統負載能力,瞬間湧入平時數十倍甚至數百倍的壓力,對開發和運維人員來說都是噩夢,這也為系統設計帶來了巨大的挑戰。針對秒殺活動的處理,是一個系統性的設計,並不是單一模組或者層面可以解決的問題,需要從系統設計整體進行考量。

處理秒殺的指導思路

秒殺的核心問題就是極高併發處理,由於系統要在瞬時承受平時數十倍甚至上百倍的流量,這往往超出系統上限,因此處理秒殺的核心思路是流控和效能優化。

流控

  • 請求流控

儘可能在上游攔截和限制請求,限制流入後端的量,保證後端系統正常。

因為無論多少人蔘與秒殺,實際成交往往是有限的,而且遠小於參加秒殺的人數,因此可以通過前端系統進行攔截,限制最終流入系統的請求數量,來保證系統正常進行。

  • 客戶端流控

在客戶端進行訪問限制,較為合適的做法是遮蔽使用者高頻請求,比如在網頁中設定5s一次訪問限制,可以防止使用者過度刷介面。這種做法較為簡單,使用者體驗也尚可,可以攔截大部分小白使用者的異常訪問,比如狂刷F5。關鍵是要明確告知使用者,如果像一些搶購系統那樣假裝提交一個排隊頁面但又不迴應任何請求,就是赤裸裸的欺騙了。

  • Web端流控

對客戶端,特別是頁面端的限流,對稍有程式設計知識或者網路基礎的使用者而言沒有作用(可以簡單修改JS或者模擬請求),因此服務端流控是必要的。服務端限流的配置方法有很多種,現在的主流Web伺服器一般都支援配置訪問限制,可以通過配置實現簡單的流控。

但是這種限制一般都在協議層。如果要實現更為精細的訪問限制(根據業務邏輯限流),可以在後端伺服器上,對不同業務實現訪問限制。常見做法是可以通過在記憶體或快取服務中加入請求訪問資訊,來實現訪問量限制。

  • 後端系統流控

上述的流控做法只能限制使用者異常訪問,如果正常訪問的使用者數量很多,就有後端系統壓力過大甚至異常當機的可能,因此需要後端系統流量控制。

對於後端系統的訪問限制可以通過非同步處理、訊息佇列、併發限制等方式實現。核心思路是保證後端系統的壓力維持在可以正常處理的水平。對於超過系統負載的請求,可以選擇直接拒絕,以此來對系統進行保護,保證在極限壓力的情況下,系統有合理範圍內的處理能力。

系統架構優化

除了流控之外,提高系統的處理能力也是非常重要的,通過系統設計和架構優化,可以提高系統的吞吐量和抗壓能力。關於通用系統效能的提升,已經超出本節的範圍,這裡只會提幾點和秒殺相關的優化。

  • 讀取加速:在秒殺活動中,資料需求一般都是讀多寫少。20萬人搶2000個商品,最後提交的訂單最多也就2000個,但是在秒殺過程中,這20萬人會一直產生大量的讀取請求。因此可以使用快取服務對使用者請求進行快取優化,把一些高頻訪問的內容放到快取中去。對於更大規模的系統,可以通過靜態檔案分離、CDN服務等把使用者請求分散到外圍設施中去,以此來分擔系統壓力。

  • 非同步處理和排隊:通過訊息佇列和非同步呼叫的方式可以實現介面非同步處理,快速響應使用者請求,在後端有較為充足的時間來處理實際的使用者操作,提高對使用者請求的響應速度,從而提升使用者體驗。通過訊息佇列還可以隔離前端的壓力,實現排隊系統,在湧入大量壓力的情況下保證系統可以按照正常速率來處理請求,不會被流量壓垮。

  • 無狀態服務設計:相對於有狀態服務,無狀態服務更容易進行擴充套件,實現無狀態化的服務可以在秒殺活動前進行快速擴容。而云化的服務更是有著先天的擴容優勢,一般都可以實現分鐘級別的資源擴容。

系統擴容

這項內容是在雲端計算環境下才成為可能,相對於傳統的IT行業,雲端計算提供了快速的系統交付能力(min VS. day),因此可以做到按需分配,在業務需要時實現資源的並行擴充套件。

對一次成功的秒殺活動來說,無論如何限流,如何優化系統,最終產生數倍於正常請求的壓力是很正常的。因此臨時性的系統擴容必不可少,系統擴容包括以下3個方面。

  • 增加系統規格:可以預先增加系統容量,比如提高系統頻寬、購買更多流量等。

  • 服務擴充套件:無狀態服務+負載均衡可以直接進行水平擴充套件,有狀態的服務則需要進行較為複雜的垂直擴充套件,增大例項規格。

  • 後端系統擴容:快取服務和資料庫服務都可以進行容量擴充套件。

秒殺服務實踐

一般來說,流控的實現,特別是業務層流控,依賴於業務自身的設計,因此雲端計算提供的服務在於更多、更完善的基礎設計,來支援使用者進行更簡單的架構優化和擴容能力。

系統架構優化

通過CDN服務和物件儲存服務來分離靜態資源,實現靜態資源的加速,避免伺服器被大量靜態資源請求過度佔用。要實現非同步的訊息處理,可以使用佇列服務來傳輸訊息,以達到訊息非同步化和流控。

系統擴容

雲服務會提供按需計費的資源分配方式和分鐘級甚至秒級的資源交付能力,根據需要快速進行資源定製和交付。

內部系統可以通過負載均衡等服務實現並行擴充套件,在網易雲基礎服務中,使用者可以直接使用 Kubernetes 的 Replication Controller 服務實現線上水平擴容。對於對外提供的 Web 系統,可以通過負載均衡服務實現水平線上擴充套件。

對於後端系統來說,建議使用雲端計算服務商提供的基礎服務來實現並行擴充套件。例如,網易雲基礎服務就提供了分散式快取服務和資料庫服務,支援線上擴容。



本文節選自《雲原生應用架構實踐》,網易雲基礎服務架構團隊著。


網易雲端計算基礎服務深度整合了 IaaS、PaaS 及容器技術,提供彈性計算、DevOps 工具鏈及微服務基礎設施等服務,幫助企業解決 IT、架構及運維等問題,使企業更聚焦於業務,是新一代的雲端計算平臺,點選可免費試用


相關文章:
【推薦】 優化雲課堂直播間效能的一些思考與總結
【推薦】 用RegularJS開發小程式 — mpregular解析
【推薦】 Bug是一種財富-------研發同學的錯題集、測試同學的遺漏用例集


相關文章