一、秒殺的場景
電商中爲了吸引顧客、彙集人氣,常常會策劃一些秒殺活動。活動中售賣的商品,要麼價格遠低於市場價格,要麼比較稀缺(如一些新發布的商品)。這些商品電商通常都會限量、限時銷售。無疑這些商品對消費者的誘惑力是巨大的,消費者蜂擁而來,每每幾秒鐘就能夠將商品搶購一空。而對於電商系統來講可能更多的是考驗。前端
二、傳統秒殺系統的痛點
首先,秒殺的場景決定了秒殺是一場速度的比拼,也就是俗話說的「手快有、手慢無」。你們都爭着在活動開始後,第一時間將商品搶到,完成下單。所以秒殺活動開始的一瞬間會有大量的流量涌入,幾倍、甚至於十幾倍的流量對系統的衝擊不可謂不大。若是系統沒有足夠的capacity或應對措施,極可能就被瞬時高流量給壓垮了。數據庫
其次,突如其來的高流量,給系統各個模塊都來了一連串的壓力,系統可能會所以變慢,並且可能會彼此影響,影響可用性。好比:數據庫更新同一個商品庫存,需對同一行記錄加鎖,隨着併發的壓力逐漸增大,數據庫更新的性能是逐漸降低的。從而引發提供庫存service的應用服務性能降低,連鎖的影響到下單service的性能,最終反饋到消費者的可能就是整個網站購物流程性能差、響應慢。而面對響應慢的系統,不少消費者可能採起反覆刷新,屢次嘗試,這無疑又增大了對系統的壓力。架構
還有,上述種種給消費者帶來的每每是體驗上的痛苦。如:網站響應慢,點擊搶購按鈕沒反應。好不容易能夠操做了,卻發現秒殺活動已經結束,消費者的參與感比較差。長此以往,可能就對此類活動失去了興趣。併發
三、1號店秒殺系統的設計理念
基於以上秒殺場景下的痛點,1號店的秒殺排隊系統在設計時主要考慮如下幾點:異步
- 限流:當秒殺活動開始後,只有少部分消費者能搶購到秒殺商品,意味着其實大部分用戶的流量傳達到後臺服務後都是無效。若是能引導這大部分的流量,不讓這大部分的流量傳達到後臺服務,其實對咱們系統的壓力就很小了。所以設計思路之一就是,僅讓能成功搶購到商品的流量(能夠有必定餘量)進入咱們的系統。
- 削峯:進入系統的有效流量雖然總量不必定是很大的,但倒是在很短的時間內涌入的,所以會存在很高的瞬時流量峯值。總量相同的流量在1秒鐘進入系統,和在10分鐘均勻地進入系統,對系統的衝擊是相差很大的。高峯值的流量每每能將系統壓垮。所以另外一個設計思路是,如何將進入系統的瞬時高流量拉平,使得系統能夠在本身處理能力範圍內,將全部搶購的請求處理完畢。
- 異步處理:傳統的系統對於請求是同步處理的,即收到請求後當即處理並把結果返回給用戶。咱們的系統有了削峯的設計後,請求不是被馬上處理的,所以就要求咱們能將同步的服務改形成異步的。
- 可用性:咱們設計時始終把系統的可用性放在重要的位置,針對系統可能出現的各類情況,都盡最大程度地保證高可用。
- 用戶體驗:系統設計必定要充分考慮用戶體驗。消費者點擊搶購按鈕後,不管是否能搶到商品,指望是能獲得及時的反饋。系統上發生任何故障也要儘量的保證用戶體驗的損害減到最小。
四、系統架構簡介
如今來簡單介紹下咱們秒殺排隊系統的架構,從大的方面來講分爲三個主要模塊:性能
- 排隊模塊:負責接收用戶的搶購請求,將請求以先入先出的方式保存下來。每個參加秒殺活動的商品保存一個隊列,隊列的大小能夠根據參與秒殺的商品數量(或加點餘量)自行定義。排隊模塊還負責提供一系列接口,如:給已進入隊列的用戶查詢下單狀態的接口,給調度模塊拉取請求的接口,服務模塊回寫業務處理狀態的接口等。
- 調度模塊:負責排隊模塊到服務模塊的動態調度,不斷檢查服務模塊,一旦處理能力有空閒,就從排隊隊列頭上把用戶訪問請求調入服務模塊。並負責向服務模塊分發請求。這裏調度模塊扮演一箇中介的角色,但不僅是傳遞請求而已。它還擔負着調節系統處理能力的重任。咱們能夠根據服務模塊的實際處理能力,動態調節向排隊系統拉取請求的速度。做用有點相似水壩的閘門,當下遊乾旱時就打開閘門多放些水,當下遊洪澇時,就放下閘門少放些水。
- 服務模塊:是負責調用真正業務處理服務,並返回處理結果,並調用排隊模塊的接口回寫業務處理結果。咱們設計這個模塊,是爲了和後面真正的業務處理服務解耦。目前咱們的系統不僅支持秒殺搶購這種業務場景,後續有其餘適用於排隊系統的業務均可以接入,如:領取抵用券等等。同時咱們也能夠針對後面業務系統的處理能力,動態調節服務模塊調用後面業務處理服務的速度。
五、容錯處理
任何系統都不可能一路順風,但咱們要能在出現錯誤時仍舊保證系統的高用性和良好的客戶體驗。舉幾個簡單的例子,好比服務模塊調用後面服務時,出現調用服務超時怎麼辦?對此咱們設計了對於超時的請求,能夠重試的機制。再好比,若是後面真正的業務處理系統宕機怎麼辦?若是是傳統系統的話,可能就面臨系統沒法使用的尷尬。而咱們的系統已是異步的了,所以加入排隊隊列的用戶請求,在業務處理系統恢復後均可以獲得處理。只要咱們在前端給用戶以友好的交互、提示,系統仍是能提供必定質量服務的。網站
六、用戶交互
由於咱們的系統設計成異步的,所以消費者再也不是像之前同樣同步地去等待反饋。消費者須要一個途徑來獲取搶購的狀態和進度。咱們的主體流程大致上分爲幾個階段:設計
- 當等待人數大於500人,頁面提示:排在您前面的人超過500位;
- 當等待人數小於等於500人,頁面提示:您已擠進第***位;
- 當等待時間大於等於1分鐘,頁面提示:剩餘時間約*分鐘。每次以分鐘倒計時。
- 當等待時間小於1分鐘,頁面提示:預計剩餘*秒。
- 搶購成功,後續跳轉到訂單支付頁面
下面僅挑選2個PC端頁面交互的設計供你們參考,blog
固然咱們還提供了一些分支流程的提示與處理,若是你們感興趣,更詳細的狀況能夠到1號店親自參與秒殺活動來體驗。接口
七、總結
目前咱們的秒殺排隊系統已經應用於1號店的歷次大促,並取得了良好的效果,受到業務運營和消費者一致的好評。優秀的系統必定是創建在對業務透徹理解的基礎上,針對業務的場景與痛點,結合現有的技術有針對性的提供解決方案。同時技術上成功的系統,每每也推進着業務的發展,給業務更好的支撐和推進。