'秒殺系統怎麼設計?'

"

什麼是秒殺?

“秒殺”是商家在特定時間點進行促銷的一種運營手段,體現在系統層面,是指一個Web系統,在一秒鐘收到數以萬計的用戶請求,來搶購數量有限的促銷產品。本質上,秒殺系統就是一個“三高”系統,即高併發、高性能、高可用的分佈式系統。本文主要從“高併發”的角度,來看看需要解決的主要問題。

秒殺需要處理併發讀,併發寫。“併發讀”需要通過各種手段減少用戶到服務端來讀數據,而“併發寫”主要需要保證數據的正確性,確保大流量下數據一致。

秒殺系統關注三方面

下面以一個秒殺系統的例子,來看看一個秒殺系統主要關注的三方面問題。

"

什麼是秒殺?

“秒殺”是商家在特定時間點進行促銷的一種運營手段,體現在系統層面,是指一個Web系統,在一秒鐘收到數以萬計的用戶請求,來搶購數量有限的促銷產品。本質上,秒殺系統就是一個“三高”系統,即高併發、高性能、高可用的分佈式系統。本文主要從“高併發”的角度,來看看需要解決的主要問題。

秒殺需要處理併發讀,併發寫。“併發讀”需要通過各種手段減少用戶到服務端來讀數據,而“併發寫”主要需要保證數據的正確性,確保大流量下數據一致。

秒殺系統關注三方面

下面以一個秒殺系統的例子,來看看一個秒殺系統主要關注的三方面問題。

秒殺系統怎麼設計?

一、高併發訪問

秒殺前用戶不斷刷新頁面查看,來獲得購買按鈕,搶購時集中點擊併發購買,核心是對系統數據的高併發讀訪問,可以通過如下手段進行防護。

訪問攔截:從瀏覽器/反向代理/Web層/服務層/數據層多層攔截流量,儘量把訪問攔截在離用戶更近的層,減少對後臺的壓力;

分流:主要通過分佈式集群技術,多臺機器處理,提高併發能力;

動靜分離:將動態數據和靜態數據儘量分離,並通過緩存和CDN等技術對數據讀取進行加速;

二、數據正確性

秒殺伴隨這一系列業務流程,包括瀏覽商品、進入搶購頁、購買、扣減庫存、支付。其中併發寫主要與扣減庫存有關,要保證數據的正確性,防止超賣發生。大概的解決方法有:

減庫存:事務判斷,熱點商品放到單獨的熱點庫,增加併發鎖

熱點:對核心熱點數據進行實時分析,並在系統中進行優化或隔離

異步化:是指把購買請求的接受和處理異步化。購買請求先放到隊列中,這個過程非常高效,返回客戶信息。

限流降級:請求限流,控制系統的訪問;對服務的下游依賴進行降級,保證核心鏈路

三、防作弊

搶購還需要保證公平性,方舟如購票插件購買火車票、黃牛黨等。在技術角度,大概方法有:

答題:為了增加購買的複雜度;延緩請求。

Cache校驗:處理用戶購買請求時校驗緩存中是否已記錄此商品的購買。

秒殺系統設計原則

1、前臺請求數儘量少

前臺請求會增加瀏覽器的負擔,儘量簡化或合併頁面大小(CSS/JS,圖片等),去掉頁面裝飾;減少DNCS解析

2、後臺數據儘量少

後臺數據會增加網絡傳輸,壓縮和字符編碼,消耗CPU。需要梳理後臺依賴的數據和服務,關注序列化/反序列化方式,減少不必要的數據交互

3、調用路徑要儘量短

分佈式調用錯綜複雜,需要儘量縮短調用鏈路;減少第三方依賴,儘量弱依賴,並做好應用分級

4、儘量不要有單點

高可用和穩定性角度,消除單點;服務無狀態化,解藕服務狀態和機器,如機器配置動態化;有狀態的存儲,通過冗餘備份提高可用性。

高併發之“訪問攔截”

高併發的訪問攔截主要思路是:

從瀏覽器/反向代理/Web層/服務層/數據層多層攔截流量,儘量把訪問攔截在離用戶更近的層,儘可能地過濾掉無效請求,讓“漏斗”最末端的才是有效請求。同時,用戶請求更早的得到處理,也減少了每次請求的RT,進而提高了系統的QPS和併發程度。

"

什麼是秒殺?

“秒殺”是商家在特定時間點進行促銷的一種運營手段,體現在系統層面,是指一個Web系統,在一秒鐘收到數以萬計的用戶請求,來搶購數量有限的促銷產品。本質上,秒殺系統就是一個“三高”系統,即高併發、高性能、高可用的分佈式系統。本文主要從“高併發”的角度,來看看需要解決的主要問題。

秒殺需要處理併發讀,併發寫。“併發讀”需要通過各種手段減少用戶到服務端來讀數據,而“併發寫”主要需要保證數據的正確性,確保大流量下數據一致。

秒殺系統關注三方面

下面以一個秒殺系統的例子,來看看一個秒殺系統主要關注的三方面問題。

秒殺系統怎麼設計?

一、高併發訪問

秒殺前用戶不斷刷新頁面查看,來獲得購買按鈕,搶購時集中點擊併發購買,核心是對系統數據的高併發讀訪問,可以通過如下手段進行防護。

訪問攔截:從瀏覽器/反向代理/Web層/服務層/數據層多層攔截流量,儘量把訪問攔截在離用戶更近的層,減少對後臺的壓力;

分流:主要通過分佈式集群技術,多臺機器處理,提高併發能力;

動靜分離:將動態數據和靜態數據儘量分離,並通過緩存和CDN等技術對數據讀取進行加速;

二、數據正確性

秒殺伴隨這一系列業務流程,包括瀏覽商品、進入搶購頁、購買、扣減庫存、支付。其中併發寫主要與扣減庫存有關,要保證數據的正確性,防止超賣發生。大概的解決方法有:

減庫存:事務判斷,熱點商品放到單獨的熱點庫,增加併發鎖

熱點:對核心熱點數據進行實時分析,並在系統中進行優化或隔離

異步化:是指把購買請求的接受和處理異步化。購買請求先放到隊列中,這個過程非常高效,返回客戶信息。

限流降級:請求限流,控制系統的訪問;對服務的下游依賴進行降級,保證核心鏈路

三、防作弊

搶購還需要保證公平性,方舟如購票插件購買火車票、黃牛黨等。在技術角度,大概方法有:

答題:為了增加購買的複雜度;延緩請求。

Cache校驗:處理用戶購買請求時校驗緩存中是否已記錄此商品的購買。

秒殺系統設計原則

1、前臺請求數儘量少

前臺請求會增加瀏覽器的負擔,儘量簡化或合併頁面大小(CSS/JS,圖片等),去掉頁面裝飾;減少DNCS解析

2、後臺數據儘量少

後臺數據會增加網絡傳輸,壓縮和字符編碼,消耗CPU。需要梳理後臺依賴的數據和服務,關注序列化/反序列化方式,減少不必要的數據交互

3、調用路徑要儘量短

分佈式調用錯綜複雜,需要儘量縮短調用鏈路;減少第三方依賴,儘量弱依賴,並做好應用分級

4、儘量不要有單點

高可用和穩定性角度,消除單點;服務無狀態化,解藕服務狀態和機器,如機器配置動態化;有狀態的存儲,通過冗餘備份提高可用性。

高併發之“訪問攔截”

高併發的訪問攔截主要思路是:

從瀏覽器/反向代理/Web層/服務層/數據層多層攔截流量,儘量把訪問攔截在離用戶更近的層,儘可能地過濾掉無效請求,讓“漏斗”最末端的才是有效請求。同時,用戶請求更早的得到處理,也減少了每次請求的RT,進而提高了系統的QPS和併發程度。

秒殺系統怎麼設計?

瀏覽器訪問攔截

防止用戶的不必要的點擊,可以在產品層面限制用戶的行為,比如點擊後按鈕不可用,限定時間接受請求。當然,為了防止惡意搶購,還需要在防作弊上做其他嘗試,比如前文講的答題/cache校驗等。

CDN加速

CDN的全稱是Content Delivery Network,即內容分發網絡。簡單來講,就是把原服務器上數據複製到其他服務器上,用戶就近訪問服務器獲取資源。缺點是內容變更生效慢。

反向代理訪問攔截

主要是動靜分離,靜態文件作為web項目的一部分進行發佈;另外通過Nginx託管靜態文件 ,減輕Web服務的壓力。

Web層和Service層訪問攔截

主要是動態數據訪問,可以採用緩存的策略,減少對下一層的數據訪問。緩存又可分為本地緩存和redis、memcache等緩存中間件。

高併發之“分流”

分流主要通過分佈式集群技術,多臺機器處理,提高併發能力。

"

什麼是秒殺?

“秒殺”是商家在特定時間點進行促銷的一種運營手段,體現在系統層面,是指一個Web系統,在一秒鐘收到數以萬計的用戶請求,來搶購數量有限的促銷產品。本質上,秒殺系統就是一個“三高”系統,即高併發、高性能、高可用的分佈式系統。本文主要從“高併發”的角度,來看看需要解決的主要問題。

秒殺需要處理併發讀,併發寫。“併發讀”需要通過各種手段減少用戶到服務端來讀數據,而“併發寫”主要需要保證數據的正確性,確保大流量下數據一致。

秒殺系統關注三方面

下面以一個秒殺系統的例子,來看看一個秒殺系統主要關注的三方面問題。

秒殺系統怎麼設計?

一、高併發訪問

秒殺前用戶不斷刷新頁面查看,來獲得購買按鈕,搶購時集中點擊併發購買,核心是對系統數據的高併發讀訪問,可以通過如下手段進行防護。

訪問攔截:從瀏覽器/反向代理/Web層/服務層/數據層多層攔截流量,儘量把訪問攔截在離用戶更近的層,減少對後臺的壓力;

分流:主要通過分佈式集群技術,多臺機器處理,提高併發能力;

動靜分離:將動態數據和靜態數據儘量分離,並通過緩存和CDN等技術對數據讀取進行加速;

二、數據正確性

秒殺伴隨這一系列業務流程,包括瀏覽商品、進入搶購頁、購買、扣減庫存、支付。其中併發寫主要與扣減庫存有關,要保證數據的正確性,防止超賣發生。大概的解決方法有:

減庫存:事務判斷,熱點商品放到單獨的熱點庫,增加併發鎖

熱點:對核心熱點數據進行實時分析,並在系統中進行優化或隔離

異步化:是指把購買請求的接受和處理異步化。購買請求先放到隊列中,這個過程非常高效,返回客戶信息。

限流降級:請求限流,控制系統的訪問;對服務的下游依賴進行降級,保證核心鏈路

三、防作弊

搶購還需要保證公平性,方舟如購票插件購買火車票、黃牛黨等。在技術角度,大概方法有:

答題:為了增加購買的複雜度;延緩請求。

Cache校驗:處理用戶購買請求時校驗緩存中是否已記錄此商品的購買。

秒殺系統設計原則

1、前臺請求數儘量少

前臺請求會增加瀏覽器的負擔,儘量簡化或合併頁面大小(CSS/JS,圖片等),去掉頁面裝飾;減少DNCS解析

2、後臺數據儘量少

後臺數據會增加網絡傳輸,壓縮和字符編碼,消耗CPU。需要梳理後臺依賴的數據和服務,關注序列化/反序列化方式,減少不必要的數據交互

3、調用路徑要儘量短

分佈式調用錯綜複雜,需要儘量縮短調用鏈路;減少第三方依賴,儘量弱依賴,並做好應用分級

4、儘量不要有單點

高可用和穩定性角度,消除單點;服務無狀態化,解藕服務狀態和機器,如機器配置動態化;有狀態的存儲,通過冗餘備份提高可用性。

高併發之“訪問攔截”

高併發的訪問攔截主要思路是:

從瀏覽器/反向代理/Web層/服務層/數據層多層攔截流量,儘量把訪問攔截在離用戶更近的層,儘可能地過濾掉無效請求,讓“漏斗”最末端的才是有效請求。同時,用戶請求更早的得到處理,也減少了每次請求的RT,進而提高了系統的QPS和併發程度。

秒殺系統怎麼設計?

瀏覽器訪問攔截

防止用戶的不必要的點擊,可以在產品層面限制用戶的行為,比如點擊後按鈕不可用,限定時間接受請求。當然,為了防止惡意搶購,還需要在防作弊上做其他嘗試,比如前文講的答題/cache校驗等。

CDN加速

CDN的全稱是Content Delivery Network,即內容分發網絡。簡單來講,就是把原服務器上數據複製到其他服務器上,用戶就近訪問服務器獲取資源。缺點是內容變更生效慢。

反向代理訪問攔截

主要是動靜分離,靜態文件作為web項目的一部分進行發佈;另外通過Nginx託管靜態文件 ,減輕Web服務的壓力。

Web層和Service層訪問攔截

主要是動態數據訪問,可以採用緩存的策略,減少對下一層的數據訪問。緩存又可分為本地緩存和redis、memcache等緩存中間件。

高併發之“分流”

分流主要通過分佈式集群技術,多臺機器處理,提高併發能力。

秒殺系統怎麼設計?

DNS輪詢:從App/Browser入口,對請求進行分類,靜態數據直接去CDN獲取,同時Nginx進行集群化,通過DNCS輪詢。

Nginx負載均衡:Nginx可以支持10W的併發訪問, Nginx支持配置請求的代理策略,把請求路由到多個Web服務器處理。Nginx支持的負載均衡策略包括:輪詢,權重,ip_hash,fair,url_hash等

分佈式架構負載策略:Web層調用service,以及service之間的調用,每個service都需要部署多份。目前最常用的兩個框架技術,spring cloud、dubbo、HSF,都採用客戶端負載均衡策略,路由到service的不同實例。

Redis集群:redis單臺幾十萬的QPS,可通過Redis集群,把數據分配到多臺服務器上,減輕每臺機器的負載。

Mysql讀寫分離:一般不對寫請求分流,也可通過分佈式數據庫技術對寫請求分流。對於讀請求,一般採用讀寫分離的策略。讀庫應用單獨設置索引,提高讀性能。

高併發之“動靜分離”

動態頁面:根據實時數據渲染的頁面,需要調用後臺,讀取速度慢

靜態頁面:存儲在文件系統的文件,不經常變動,讀取速度很

為了提升效率,儘可能靜態化,用靜態頁面,替換動態頁面。例如,商品信息頁,商品信息在發佈後,保存下商品信息的靜態頁面;僅訪問必要的數據實時數據。

幾個關注點:

1、 靜態數據緩存到離用戶最近的地方。比如瀏覽器、CDN、服務端的 Cache

2、 可以直接緩存 HTTP 連接。關鍵是數據中是否含有和訪問者相關的個性化數據,比如輸出的數據是否和 URL、瀏覽者、時間、地域相關,以及是否含有 Cookie 等私密數據。

3、 經常使用Nginx和Web服務器緩存靜態文件。Java 系統本身不擅長處理大量連接請求,需要在Nginx和Web側儘量緩存

4、 動態數據儘量Json化。減少不必要的數據傳輸和解析

5、 緩存還需要考慮失效問題/命中率問題/發佈更新問題/動靜數據合併;以失效為例,一般有三種方式:超時更新,定時更新,通知更新。

秒殺之“減庫存”

減庫存一般有如下方式:下單減庫存,付款減庫存,預扣庫存。

其中,筆者比較推薦“下單減庫存”,因為參加秒殺,買到就是賺到,成功下單後卻不付款的情況比較少;同時賣家對秒殺商品的庫存有嚴格限制,邏輯上更為簡單。

當然“下單減庫存”,要保證庫存數據不能為負數。

一些方法:

1、事務判斷,即保證減後庫存不能為負數,否則就回滾;

2、直接設置數據庫的字段數據為無符號整數,小於零時會直接報錯;

3、熱點商品放在單獨的熱點庫

4、併發鎖:增加併發鎖,比如排隊等

5、計數器:在Web層或Service層做一個計數器,技術到達閾值,直接返回搶購失敗。

6、按商品路由:把對同一品類商品的搶購路由到同一個service以及DB鏈接上,減少不必要的鎖競爭。

實踐中的一些原則:

1. 將讀數據緩存在 Web 端,過濾掉無效的數據讀;

2. 對讀數據不做強一致性校驗;

3. 對寫數據做基於時間的分片,過濾過期請求;

4. 對寫請求做限流保護,過濾超載請求;

5. 對寫數據強一致性校驗,僅校驗最後有效的數據。

秒殺之“熱點”

秒殺需要對核心熱點數據進行實時分析,處理思路可以從業務/系統/數據不同角度進行優化/限制/隔離,比如:

靜態熱點數據:提前預測。賣家報名,提前打標

動態熱點數據:系統在運行過程中臨時產生的熱點

也可以增加單獨的熱點分析組件,總體控制系統業務的熱點,並做對應的限制和隔離方法。

秒殺之“異步”

秒殺系統設計上,經常使用消息隊列來緩衝瞬時流量,把同步的請求調用轉換成異步的間接推送,中間通過一個隊列在一端承接瞬時的流量洪峰,在另一端平滑地消費消息。

"

什麼是秒殺?

“秒殺”是商家在特定時間點進行促銷的一種運營手段,體現在系統層面,是指一個Web系統,在一秒鐘收到數以萬計的用戶請求,來搶購數量有限的促銷產品。本質上,秒殺系統就是一個“三高”系統,即高併發、高性能、高可用的分佈式系統。本文主要從“高併發”的角度,來看看需要解決的主要問題。

秒殺需要處理併發讀,併發寫。“併發讀”需要通過各種手段減少用戶到服務端來讀數據,而“併發寫”主要需要保證數據的正確性,確保大流量下數據一致。

秒殺系統關注三方面

下面以一個秒殺系統的例子,來看看一個秒殺系統主要關注的三方面問題。

秒殺系統怎麼設計?

一、高併發訪問

秒殺前用戶不斷刷新頁面查看,來獲得購買按鈕,搶購時集中點擊併發購買,核心是對系統數據的高併發讀訪問,可以通過如下手段進行防護。

訪問攔截:從瀏覽器/反向代理/Web層/服務層/數據層多層攔截流量,儘量把訪問攔截在離用戶更近的層,減少對後臺的壓力;

分流:主要通過分佈式集群技術,多臺機器處理,提高併發能力;

動靜分離:將動態數據和靜態數據儘量分離,並通過緩存和CDN等技術對數據讀取進行加速;

二、數據正確性

秒殺伴隨這一系列業務流程,包括瀏覽商品、進入搶購頁、購買、扣減庫存、支付。其中併發寫主要與扣減庫存有關,要保證數據的正確性,防止超賣發生。大概的解決方法有:

減庫存:事務判斷,熱點商品放到單獨的熱點庫,增加併發鎖

熱點:對核心熱點數據進行實時分析,並在系統中進行優化或隔離

異步化:是指把購買請求的接受和處理異步化。購買請求先放到隊列中,這個過程非常高效,返回客戶信息。

限流降級:請求限流,控制系統的訪問;對服務的下游依賴進行降級,保證核心鏈路

三、防作弊

搶購還需要保證公平性,方舟如購票插件購買火車票、黃牛黨等。在技術角度,大概方法有:

答題:為了增加購買的複雜度;延緩請求。

Cache校驗:處理用戶購買請求時校驗緩存中是否已記錄此商品的購買。

秒殺系統設計原則

1、前臺請求數儘量少

前臺請求會增加瀏覽器的負擔,儘量簡化或合併頁面大小(CSS/JS,圖片等),去掉頁面裝飾;減少DNCS解析

2、後臺數據儘量少

後臺數據會增加網絡傳輸,壓縮和字符編碼,消耗CPU。需要梳理後臺依賴的數據和服務,關注序列化/反序列化方式,減少不必要的數據交互

3、調用路徑要儘量短

分佈式調用錯綜複雜,需要儘量縮短調用鏈路;減少第三方依賴,儘量弱依賴,並做好應用分級

4、儘量不要有單點

高可用和穩定性角度,消除單點;服務無狀態化,解藕服務狀態和機器,如機器配置動態化;有狀態的存儲,通過冗餘備份提高可用性。

高併發之“訪問攔截”

高併發的訪問攔截主要思路是:

從瀏覽器/反向代理/Web層/服務層/數據層多層攔截流量,儘量把訪問攔截在離用戶更近的層,儘可能地過濾掉無效請求,讓“漏斗”最末端的才是有效請求。同時,用戶請求更早的得到處理,也減少了每次請求的RT,進而提高了系統的QPS和併發程度。

秒殺系統怎麼設計?

瀏覽器訪問攔截

防止用戶的不必要的點擊,可以在產品層面限制用戶的行為,比如點擊後按鈕不可用,限定時間接受請求。當然,為了防止惡意搶購,還需要在防作弊上做其他嘗試,比如前文講的答題/cache校驗等。

CDN加速

CDN的全稱是Content Delivery Network,即內容分發網絡。簡單來講,就是把原服務器上數據複製到其他服務器上,用戶就近訪問服務器獲取資源。缺點是內容變更生效慢。

反向代理訪問攔截

主要是動靜分離,靜態文件作為web項目的一部分進行發佈;另外通過Nginx託管靜態文件 ,減輕Web服務的壓力。

Web層和Service層訪問攔截

主要是動態數據訪問,可以採用緩存的策略,減少對下一層的數據訪問。緩存又可分為本地緩存和redis、memcache等緩存中間件。

高併發之“分流”

分流主要通過分佈式集群技術,多臺機器處理,提高併發能力。

秒殺系統怎麼設計?

DNS輪詢:從App/Browser入口,對請求進行分類,靜態數據直接去CDN獲取,同時Nginx進行集群化,通過DNCS輪詢。

Nginx負載均衡:Nginx可以支持10W的併發訪問, Nginx支持配置請求的代理策略,把請求路由到多個Web服務器處理。Nginx支持的負載均衡策略包括:輪詢,權重,ip_hash,fair,url_hash等

分佈式架構負載策略:Web層調用service,以及service之間的調用,每個service都需要部署多份。目前最常用的兩個框架技術,spring cloud、dubbo、HSF,都採用客戶端負載均衡策略,路由到service的不同實例。

Redis集群:redis單臺幾十萬的QPS,可通過Redis集群,把數據分配到多臺服務器上,減輕每臺機器的負載。

Mysql讀寫分離:一般不對寫請求分流,也可通過分佈式數據庫技術對寫請求分流。對於讀請求,一般採用讀寫分離的策略。讀庫應用單獨設置索引,提高讀性能。

高併發之“動靜分離”

動態頁面:根據實時數據渲染的頁面,需要調用後臺,讀取速度慢

靜態頁面:存儲在文件系統的文件,不經常變動,讀取速度很

為了提升效率,儘可能靜態化,用靜態頁面,替換動態頁面。例如,商品信息頁,商品信息在發佈後,保存下商品信息的靜態頁面;僅訪問必要的數據實時數據。

幾個關注點:

1、 靜態數據緩存到離用戶最近的地方。比如瀏覽器、CDN、服務端的 Cache

2、 可以直接緩存 HTTP 連接。關鍵是數據中是否含有和訪問者相關的個性化數據,比如輸出的數據是否和 URL、瀏覽者、時間、地域相關,以及是否含有 Cookie 等私密數據。

3、 經常使用Nginx和Web服務器緩存靜態文件。Java 系統本身不擅長處理大量連接請求,需要在Nginx和Web側儘量緩存

4、 動態數據儘量Json化。減少不必要的數據傳輸和解析

5、 緩存還需要考慮失效問題/命中率問題/發佈更新問題/動靜數據合併;以失效為例,一般有三種方式:超時更新,定時更新,通知更新。

秒殺之“減庫存”

減庫存一般有如下方式:下單減庫存,付款減庫存,預扣庫存。

其中,筆者比較推薦“下單減庫存”,因為參加秒殺,買到就是賺到,成功下單後卻不付款的情況比較少;同時賣家對秒殺商品的庫存有嚴格限制,邏輯上更為簡單。

當然“下單減庫存”,要保證庫存數據不能為負數。

一些方法:

1、事務判斷,即保證減後庫存不能為負數,否則就回滾;

2、直接設置數據庫的字段數據為無符號整數,小於零時會直接報錯;

3、熱點商品放在單獨的熱點庫

4、併發鎖:增加併發鎖,比如排隊等

5、計數器:在Web層或Service層做一個計數器,技術到達閾值,直接返回搶購失敗。

6、按商品路由:把對同一品類商品的搶購路由到同一個service以及DB鏈接上,減少不必要的鎖競爭。

實踐中的一些原則:

1. 將讀數據緩存在 Web 端,過濾掉無效的數據讀;

2. 對讀數據不做強一致性校驗;

3. 對寫數據做基於時間的分片,過濾過期請求;

4. 對寫請求做限流保護,過濾超載請求;

5. 對寫數據強一致性校驗,僅校驗最後有效的數據。

秒殺之“熱點”

秒殺需要對核心熱點數據進行實時分析,處理思路可以從業務/系統/數據不同角度進行優化/限制/隔離,比如:

靜態熱點數據:提前預測。賣家報名,提前打標

動態熱點數據:系統在運行過程中臨時產生的熱點

也可以增加單獨的熱點分析組件,總體控制系統業務的熱點,並做對應的限制和隔離方法。

秒殺之“異步”

秒殺系統設計上,經常使用消息隊列來緩衝瞬時流量,把同步的請求調用轉換成異步的間接推送,中間通過一個隊列在一端承接瞬時的流量洪峰,在另一端平滑地消費消息。

秒殺系統怎麼設計?

本質上,就是把一步變成兩步,其中增加一些機制來緩衝。比如在秒殺優惠券搶購,用戶搶碼(確定用戶是否有資格) 和 系統發碼(為有資格用戶分發優惠券) ,搶碼QPS可能10幾萬,只需要知道是否有資格;而發碼僅針對有資格用戶,QPS可能僅僅幾千,使用消息隊列,可以大大提高效率。

除了消息隊列,也可以使用其他方式排隊,比如線程池加鎖等待、內存排隊算法(如FIFO)、文件排隊(如基於 MySQL binlog 的同步機制)

Takeaways

  • 秒殺系統就是一個“三高”系統,即高併發、高性能高可用的分佈式系統
  • 秒殺設計原則:前臺請求儘量少,後臺數據儘量少,調用鏈路儘量短,儘量不要有單點
  • 秒殺高併發方法:訪問攔截、分流、動靜分離
  • 秒殺數據方法:減庫存策略、熱點、異步、限流降級
  • 訪問攔截主要思路:通過CDN和緩存技術,儘量把訪問攔截在離用戶更近的層,儘可能地過濾掉無效請求。
  • 分流主要思路:通過分佈式集群技術,多臺機器處理,提高併發能力。

最後

秒殺要求對系統的高併發、高性能和高可用都有極高的要求,本文主要從高併發的角度進行了闡述。對於高性能和高可用,感興趣的同學可以關注小編,小編會每天為你分享有趣的技術文章哦。 偷偷告訴你回覆“學習”會有意想不到的驚喜喲~~!

"

相關推薦

推薦中...