還在糾結秒殺?看看 MQ 如何搞定
前言
我們先簡單回顧一下,訂單系統是整個電商交易平臺的核心,在它與內部模塊、外部第三方系統打交道的過程中,需要完成很多額外的步驟:
- 為用戶積分
- 發放紅包卡券
- 庫存扣減
- 通知物流系統
- 發送短信通知
在引入 MQ 后,我們可以讓訂單系統僅僅完成最核心的功能,然后將發送消息到 MQ。比如需要進行減庫存,就發送一個消息到庫存消息隊列中,然后庫存系統從這個 MQ 里獲取消息再進行處理就可以,把這些很耗時的步驟慢慢執行,從而也實現了系統之間的解耦。
但 MQ 還有一個更加強大的功能:緩沖流量,削峰填谷,諸如雙11這樣的大促活動,瞬時間涌入的大量下單請求有可能直接壓垮服務器,導致整個系統的癱瘓,通過使用 MQ 我們可以更好地解決流量突刺的問題。
本文就以秒殺場景為基礎,看完后會有更清晰的認識。本文將會從以下幾個方面來講述相關知識,相信大家耐心看了之后肯定有收獲,碼字不易,別忘了「在看」,「轉發」哦。
- 經典的秒殺場景
- 流量洪峰帶來的難點
- 使用 MQ 削峰填谷
- 升級整體架構
正文
01 經典的秒殺場景
秒殺場景一般出現在類電商的 APP 中,雙十一、618 這種打折大促已經屢見不鮮,各種節日都能成為剁手的理由。
就連饑餓營銷也被各大公司玩的越來越6,像我自己喜歡球鞋,喜歡買AJ和椰子,有過搶鞋經歷的同學一定知道有多痛苦,尤其是每次的結果都是這張圖。
每年的雙 11 活動在零點之后會開啟一個特別大的折扣優惠,比如前五分鐘下單買五件可以享受三折優惠。
全中國無數的男生女生,在雙 11 之前幾天就會在購物車精挑細選大量的商品,零點一到,瘋狂點擊下單。
每個接口對應的業務復雜度不同,有的接口一個請求可能要執行五六次數據庫操作。即使我們用高配置的 16 核 32G 以及 SSD 固態硬盤的機器,當流量洪峰到來時,CPU、磁盤、IO 等負載都會瞬間飆升,一段時間后,系統是無論如何扛不住持續到達的請求。
02 流量洪峰帶來的難點
經典的秒殺場景主要有兩個特點:
(1)秒殺時大量用戶會在同一時間同時進行搶購,網站瞬時訪問流量激增;
(2)秒殺一般是訪問請求量遠遠大于庫存數量,只有少部分用戶能夠秒殺成功。
隨之而來,對我們的系統就帶來一系列要求:
(1)短時間內并發量激增,對系統負載壓力大,容易造成崩潰;
(2)真正能秒殺成功的還是少數,天然的讀多寫少場景,如何對流量進行分配;
(3)分布式的環境下,如何做到一致性的處理;
(4)競爭資源有限,如何做到精準的控制,準時準點,不能多買,不能少賣,不能重復買。
而在這么多難點中,我們首要任務就是去解決并發量激增的問題,如果到達的請求太多直接壓垮了服務器,那其他的功能根本無從談起。
03 使用 MQ 削峰填谷
MQ 除了可以使用異步的方式實現系統間的解耦,更可以在雙 11 這樣的秒殺活動中,通過削峰填谷的方式,處理瞬時間涌入的大量請求。
什么是削峰填谷?
削峰填谷本身是電力行業的概念,電力企業通過必要的技術和管理手段,降低電網的高峰負荷,提高低谷負荷,平滑負荷曲線,提高負荷率,保證電網的穩定運行。
假設一個應用,它能夠每秒處理 1000 個請求。如果在第一秒接收到 2000 個請求,而接下來的兩秒都沒有請求到達。
整個應用必然面臨兩個問題:
(1)在第一秒被 2000 個請求直接壓垮;
(2)假設第一秒沒有被壓垮,它在這一秒時間內只能處理 1000 請求,第二第三秒卻完全空閑,浪費了系統資源。
所以,我們可以通過 MQ 把請求突刺均攤到一段時間內,讓系統負載保持在請求處理水位之內,同時盡可能地處理更多請求,從而起到“削峰填谷”的效果。
紅色的部分是超出系統處理能力的部分,可以把紅色的那部分消息平攤到后面空閑時去處理,這樣既可以保證系統負載處在一個穩定的水位,又可以盡可能地處理更多消息。通過配置流控規則,可以達到消息勻速處理的效果。
04 升級系統架構
隨著使用應用的用戶越來越多,系統面臨的壓力也會越來越大,無論是并發量還是數據量,你會發現整個系統各個模塊都需要進行優化。
一個高并發、大數據量的系統架構,需要不斷的迭代和進化,涉及到大量的技術方案、架構重構。
針對秒殺的場景,上游發起高并發的下單操作,由于下游處理能力有限,兩端速度不匹配。此時我們引入 MQ 可以對流量進行緩沖,并實現削峰填谷。
上游速度很快,每秒發起五萬個請求也沒關系,它只管往 MQ 中發。下游系統雖然每秒只能處理 1000 個請求,但它完全可以 follow 自己的節奏,每隔一段時間,主動拉取若干條信息,實施限流的效果,保護自身。
而在這個過程中,只需要引入 MQ 組件,對上下游的業務代碼并不用有太多的修改。
在接下來的文章我會更加詳細介紹,使用現在主流的消息中間件 RocketMQ 進行實現,敬請期待~
本文轉載自微信公眾號「程序員大帝」,可以通過以下二維碼關注。轉載本文請聯系 程序員大帝公眾號。






































