一分鐘了解”秒殺”系統

關於秒殺,第一反應都是實現起來比較複雜。難點在於:並發讀+並發寫+設計兜底方案的實現。

 

比如QQ,雖然數據量很大,但是多數的數據都是細粒度的數據查詢,鎖衝突比較少;但12306涉及到大量的讀寫操作,對可用性,高性能,數據一致都有要求。

 

在開始前,先說一些基本概念,通常互聯網的應用包含了:

nginx代理層

tomcat站點層

rpc service服務層

數據層(cache和db)

方向上,降低數據層鎖衝突,具體兩大要點:

  • 緩存降讀

  • 降低寫的頻率,將請求攔截在系統上游

所以,優化的方向,也是從上面幾層展開。

 

一:優化方案:

 

1:端上的請求攔截(瀏覽器/app)

比如通過答題延長請求發出時間

js做一些基本性的校驗等

 

2:站點層的請求攔截

同一個uid xxS內才可以請求,比如計數和限速

這裡可以看到,站點層可能承擔了大部分的流量和壓力,所以站點層需要設計成無狀態服務,通過水平擴展的方式,分擔壓力;

但是站點層如何限速呢?

  • 如果使用redis,那麼redis需要做proxy切分

  • 當然,也可以通過nginx七層路由,相同的id落地到相同的tomcat站點上,做內存計數

     

3:服務層的請求攔截

流量削峰,比如根據你的數據庫抗壓能力,計算出tps,或者通過業務庫存計算等

流量削峰解決了什麼問題:

  • 服務端處理變得更加平穩

  • 節省服務器的資源成本

 

如何削峰:

  • 排隊:通過消息隊列來緩衝瞬時流量

4:數據庫處理

分庫分表,熱點數據隔離,讀寫分離等等

 

二:12306產品方案:

  • 對於秒殺系統來說,下單與支付可以分離,所以支付系統基本上可以不用特殊處理

  • 不同的地域分時售票等

 

三:兜底方案

1:降級

比如當秒殺流量達到5W/s時,把一些無關緊要的查詢記錄從之前的100條,降低為10條,這個可以直接由參數來控制

2:拒絕服務

當系統達到一定的閾值時,設置過載保護,比如在nginx層上做限制,直接返回503 code碼等

 

更多交流,也歡迎您關注我的微信公眾號:

Tags: