秒殺系統的架構設計

2021-08-09 13:12:03 字數 1505 閱讀 1258

秒殺系統,是典型的短時大量突發訪問類問題。對這類問題,有三種優化效能的思路:

寫入記憶體而不是寫入硬碟

非同步處理而不是同步處理

分布式處理

用上這三招,不論秒殺時負載多大,都能輕鬆應對。更好的是,redis能夠滿足上述三點。因此,用redis就能輕鬆實現秒殺系統。

用我這個方案,無論是電商平台**秒殺,12306火車票秒殺,都不是事:)

下面介紹一下為什麼上述三種效能優化思路能夠解決秒殺系統的效能問題:

redis和redis cluster(分布式版本),是乙個分布式快取系統。其支援多種資料結構,也支援mq。redis在效能上做了大量優化。因此使用redis或者redis cluster就可以輕鬆實現乙個強大的秒殺系統。

基本上,你用redis的這些命令就可以了。

rpush key value

插入秒殺請求

當插入的秒殺請求數達到上限時,停止所有後續插入。

後台啟動多個工作執行緒,使用

lpop key

讀取秒殺成功者的使用者id,進行後續處理。

或者使用lrange key start end命令讀取秒殺成功者的使用者id,進行後續處理。

每完成一條秒殺記錄的處理,就執行incr key_num。一旦所有庫存處理完畢,就結束該商品的本次秒殺,關閉工作執行緒,也不再接收秒殺請求。

也許你會說,我們的客戶很多。即使部署了redis cluster,仍然撐不住。那該怎麼辦呢?

記得某個偉人曾經說過:辦法總比困難多!

下面,我們具體分析下,還有哪些情況會壓垮我們架構在redis(cluster)上的秒殺系統。

如現在有很多搶火車票的軟體。它們會自動發起http請求。乙個客戶端一秒會發起很多次請求。如果有很多使用者使用了這樣的軟體,就可能會直接把我們的交換機給壓垮了。

這個問題其實屬於網路問題的範疇,和我們的秒殺系統不在乙個層面上。因此不應該由我們來解決。很多交換機都有防止乙個源ip發起過多請求的功能。開源軟體也有不少能實現這點。如linux上的tc可以控制。流行的web伺服器nginx(它也可以看做是乙個七層軟交換機)也可以通過配置做到這一點。乙個ip,一秒鐘我就允許你訪問我2次,其他軟體包直接給你丟了,你還能壓垮我嗎?

可能你們的客戶併發訪問量實在太大了,交換機都撐不住了。

這也有辦法。我們可以用多個交換機為我們的秒殺系統服務。

原理就是dns可以對乙個網域名稱返回多個ip,並且對不同的源ip,同乙個網域名稱返回不同的ip。如網通使用者訪問,就返回乙個網通機房的ip;電信使用者訪問,就返回乙個電信機房的ip。也就是用cdn了!

我們可以部署多台交換機為不同的使用者服務。 使用者通過這些交換機訪問後面資料中心的redis cluster進行秒殺作業。

有了redis cluster的幫助,做個支援海量使用者的秒殺系統其實so easy!

這裡介紹的方案雖然是針對秒殺系統的,但其背後的原理對其他高併發系統一樣有效。

最後,我們再重溫一下高效能系統的優化原則:

寫入記憶體而不是寫入硬碟

非同步處理而不是同步處理

分布式處理

秒殺系統架構設計

最近聊天總有人問秒殺的架構設計,秒殺這種業務場景一直是個熱門話題,網上也看了很多,感覺大牛分享的12306的搶票架構挺不錯的。文章講的從網路接入開始,不是那種空洞的架構。1,client請求接入到內網後,通過ospf協議進行第一步負載均衡,2,請求被 到多台lvs負載均衡器,lvs是網路層負載,效率...

秒殺架構設計

業務介紹 秒殺架構設計 什麼是秒殺?通俗一點講就是網路商家為 等目的組織的網上限時搶購活動 比如說京東秒殺,就是一種定時定量秒殺,在規定的時間內,無論商品是否秒殺完畢,該場次的秒殺活動都會結束。這種秒殺,對時間不是特別嚴格,只要下手快點,秒中的概率還是比較大的。以前就做過一元搶購,一般都是限量 1 ...

秒殺架構設計理念

限流 鑑於只有少部分使用者能夠秒殺成功,所以要限制大部分流量,只允許少部分流量進入服務後端。削峰 對於秒殺系統瞬時會有大量使用者湧入,所以在搶購一開始會有很高的瞬間峰值。高峰值流量是壓垮系統很重要的原因,所以如何把瞬間的高流量變成一段時間平穩的流量也是設計秒殺系統很重要的思路。實現削峰的常用的方法有...