秒殺套路總結-你不能錯過的高併發場景
最近拜讀了許令波老師極客時間的專欄《如何設計一個秒殺系統》有所感,特總結如下:
很重要的一點是根據不同的使用者體量來做不同的設計,首先你得知道你預估的QPS是多少,業務的瓶頸在哪裡,10w級別可能瓶頸就在資料讀取上,通過增加快取一般就能解決,如果到100w級別,那麼服務端的網路可能都是瓶頸,所以要把大部分的靜態資料放到cdn上甚至快取在瀏覽器裡。
那秒殺有哪些關鍵點呢:無非是高效能、一致性、高可用。要解決的問題主要是併發讀,併發寫。下面來說下有哪些辦法可以對這種秒殺進行優化:
1、架構原則:使用者請求資料量要少;請求次數要少;請求經過的節點要少;依賴的服務要少;不能單點。
2、獨立部署:防止流量影響其它業務;熱點資料放到單獨的快取系統,甚至直接放到本地。
3、動靜分離:秒殺開始時不用重新整理整個頁面;靜態頁面儲存在離使用者最近的地方(使用者瀏覽器裡、CDN 上或者在服務端的 Cache 中);靜態化改造(直接快取http連線);藉助nginx處理靜態檔案請求。
4、限流:評估出最大qps,進行限流保護;總 QPS =(1000ms / 響應時間)× 執行緒數量。
5、熱點隔離:比如說某個商品突然成了熱點資料,請求量暴增,這個時候就有可能影響使用者訪問其它的商品,可以怎麼做呢,其實可以按照商品id做一致性hash路由到不同的處理佇列,防止熱點商品佔用太多伺服器資源。
6、發現熱點:由於請求是一層一層呼叫的,比如先到搜尋,再到詳情,再到下單,支付等;就可以通過一些中介軟體收集到上游的熱點資料,提前通知下游做好防護。
7、削峰:技術上有排隊、答題、分層過濾;業務上也可於同一時間發放其它優惠來分散請求。
8、優化系統:減少編碼,靜態字串可以提前編好碼快取;減少序列化,因為序列化也涉及編碼;使用原生Servlet 處理請求避免使用mvc框架也能稍微降低響應時間;併發讀優化,類似庫存業務,沒必要每次讀都走庫或快取中介軟體,可以直接放在本地,定時更新,允許少量資料不一致情況,到寫入的時候再保證最終一致性。
9、庫存業務:減庫存又分為如下方式:下單減庫存、扣款減庫存、預扣庫存。秒殺根據業務可以採用第一種。
10、解決併發鎖:我們知道mysql資料庫有行鎖,大量執行緒競爭行鎖會導致等待執行緒增加,tps下降影響資料庫吞吐量,可以在應用層做排隊,按照商品維度設定佇列順序執行,這樣能減少同一臺機器對資料庫同一行記錄進行操作的併發度,同時也能控制單個商品佔用資料庫連線的數量。
11、避免多扣:1.應用層面通過事務;2.資料庫設定無符號整數;3.sql增加條件。
12、降級:通過開關限制系統非核心功能;過載保護,當機器負載達到一定閥值時,直接拒絕請求(nginx、伺服器)。
......
會持續補充,套路是不是很多呀,加油!
本文為原創編譯,如需轉載請註明作者資訊及本文連結,謝謝尊重個人勞動成果。
你點個贊和關注,我會拼命幹活哈哈哈