2021-02-02 分類: 網(wǎng)站建設
說到“秒殺”,恐怕大多數(shù)人想到的就是“雙 11”,“促銷”,“買買買”等火爆的場面吧。
圖片來自 Pexels
大家為了打折商品蜂擁而至,造成
技術隔離架構圖
前面有了準備工作,那么從技術上需要有以下幾個方面的考慮:
秒殺系統(tǒng)前端設計簡圖
代理層設計
說完了秒殺系統(tǒng)的前端設計,請求自然地來到了代理層。由于用戶的請求量大,我們需要用負載均衡加上服務器集群,來面對如此空前的壓力。
代理層三大功能簡圖
在這一層是可以做緩存,過濾和限流的:
主要想表達的意思是,可以將一些變化不頻繁的數(shù)據(jù),提到代理層來緩存,提高響應的效率。
同時,還可以根據(jù)風控系統(tǒng)返回的信息,過濾一些疑似機器人或者惡意請求。例如:從固定 IP 過來的,頻率過高的請求。最重要的就是在這一層,可以識別來自秒殺系統(tǒng)的請求。
如果是帶有秒殺系統(tǒng)的參數(shù),就要把請求路由到秒殺系統(tǒng)的服務器集群。這樣才能和正常的業(yè)務系統(tǒng)分割開來。
閥值的設置可以是動態(tài)調整的。例如:集群服務器中有 10 個服務器,其中一臺由于壓力過大掛掉了。
此時就需要調整代理層的流量閥值,將能夠處理的請求流量減少,保護后端的應用服務器。
當服務器恢復以后,又可以將閥值調回原位。可以通過 Nginx+Lua 合作完成,Lua 從服務注冊中心讀取服務健康狀態(tài),動態(tài)調整流量。
應用層設計
“秒殺系統(tǒng)”秒殺的是什么?無非是商品。對于系統(tǒng)來說就是商品的庫存,購買的商品一旦超過了庫存就不能再賣了。
防止超賣
超過了庫存還可以賣給用戶,這就是“超賣”,也是系統(tǒng)設計需要避免的。為了承受大流量的訪問,我們用了水平擴展的服務,但是對于他們消費的資源“庫存”來說,卻只有一個。
為了提高效率,會將這個庫存信息放到緩存中。以流行的 Redis 為例,用它存放庫存信息,由多個線程來訪問就會出現(xiàn)資源爭奪的情況。也就是分布式程序爭奪唯一資源,為了解決這個問題我們需要實現(xiàn)分布式鎖。
假設這里有多個應用響應用戶的訂單請求,他們同時會去訪問 Redis 中存放的庫存信息,每接受用戶一次請求,都會從 Redis 的庫存中減去 1 個商品庫存量。
當任何一個進程訪問 Redis 中的庫存資源時,其他進程是不能訪問的,所以這里需要考慮鎖的情況(樂觀,悲觀)。
Redis 緩存承載庫存變量
如果鎖長期沒有釋放,需要考慮鎖的過期時間,需要設置兩個超時時間:
訂單處理流程
這里的“扣減服務”完成了最簡單的扣減庫存工作,并沒有和其他項目服務打交道,更沒有訪問數(shù)據(jù)庫。
訂單流程示意圖
后面的流程相對比較復雜,我們先看圖,根據(jù)圖示來講解:
注意,這里可以加入類似 ZooKeeper 這樣的服務調度來幫助,協(xié)調服務調度和任務分配。
一旦發(fā)現(xiàn)不一致,會去做重試操作。如果重試依舊不成功,會重寫信息到緩存,讓用戶知道失敗原因。
雖然,這個信息和最終結果有偏差,但是在秒殺的場景,要求高性能是前提,結果的一致性,可以后期補償。
數(shù)據(jù)庫設計
講完了秒殺的處理流程,來談談數(shù)據(jù)庫設計要注意的點。
數(shù)據(jù)估算
前面說了秒殺場景需要注意隔離,這里的隔離包括“業(yè)務隔離”。就是說我們在秒殺之前,需要通過業(yè)務的手段,例如:熱場活動,問卷調查,歷史數(shù)據(jù)分析。通過他們去估算這次秒殺可能需要存儲的數(shù)據(jù)量。
這里有兩部分的數(shù)據(jù)需要考慮:
前者不言而喻是給業(yè)務系統(tǒng)用的。后者,是用來分析和后續(xù)處理問題訂單用的,秒殺完畢以后還可以用來復盤。
分表分庫
對于這些數(shù)據(jù)的存放,需要分情況討論,例如,MySQL 單表推薦的存儲量是 500W 條記錄(經驗數(shù)字)。
如果估算的時候超過了這個數(shù)據(jù),建議做分表。如果服務的連接數(shù)較多,建議進行分庫的操作。
數(shù)據(jù)隔離
由于大量的數(shù)據(jù)操作是插入,有少部分的修改操作。如果使用關系型數(shù)據(jù)來存儲,建議用專門的表來存放,不建議使用業(yè)務系統(tǒng)正在使用的表。
這個開頭提到了,數(shù)據(jù)隔離是必須的,一旦秒殺系統(tǒng)掛了,不會影響到正常業(yè)務系統(tǒng),這個風險意識要有。表的設計除了 ID 以外,最好不要設置其他主鍵,保證能夠快速地插入。
數(shù)據(jù)合并
由于是用的專用表存儲,在秒殺活動完畢以后,需要將其和現(xiàn)有的數(shù)據(jù)做合并。其實,交易已經完成,合并的目的也就是查詢。
這個合并需要根據(jù)具體情況來分析,如果對于那些“只讀”的數(shù)據(jù),對于做了讀寫分離的公司,可以導入到專門負責讀的數(shù)據(jù)庫或者 NoSQL 數(shù)據(jù)庫中。
壓力測試
構建了秒殺系統(tǒng),一定會面臨上線,那么在上線之前壓力測試是必不可少的。
我們做壓力測試的目的是檢驗系統(tǒng)崩潰的邊緣在哪里?系統(tǒng)的極限在哪里?
這樣才能合理地設置流量的上限,為了保證系統(tǒng)的穩(wěn)定性,多余的流量需要被拋棄。
壓力測試的方法
合理的測試方法可以幫助我們對系統(tǒng)有深入的了解,這里介紹兩種壓力測試的方法:
正壓力測試。每次秒殺活動都會計劃,使用多少服務器資源,承受多少的請求量。
可以在這個請求量上面不斷加壓,直到系統(tǒng)接近崩潰或者真正崩潰。簡單的說就是做加法。
正壓力測試示意圖
負壓力測試。在系統(tǒng)正常運行的情況下,逐步減少支撐系統(tǒng)的資源(服務器),看什么時候系統(tǒng)無法支撐正常的業(yè)務請求。
例如:在系統(tǒng)正常運行的情況下,逐步減少服務器或者微服務的數(shù)量,觀察業(yè)務請求的情況。說白了就是做減法。
負壓力測試示意圖
壓力測試的步驟
測試步驟
有了測試方法的加持,我們來看看需要遵循哪些測試步驟。下面的操作偏套路化,大家在其他系統(tǒng)的壓力測試也可以這么做,給大家做個參考。
第一,確定測試目標。與性能測試不同的是,壓力測試的目標是,什么時候系統(tǒng)會接近崩潰。比如:需要支撐 500W 訪問量。
第二,確定關鍵功能。壓力測試其實是有重點的,根據(jù) 2/8 原則,系統(tǒng)中 20% 的功能被使用的是最多的,我們可以針對這些核心功能進行壓力測試。例如:下單,庫存扣減。
關注核心服務
第三,確定負載。這個和關鍵服務的思路一致,不是每個服務都有高負載的,我們的測試其實是要關注那些負載量大的服務,或者是一段時間內系統(tǒng)中某些服務的負載有波動。這些都是測試目標。
第四,選擇環(huán)境,建議搭建和生產環(huán)境一模一樣的環(huán)境進行測試。
第五,確定監(jiān)視點,實際上就是對關注的參數(shù)進行監(jiān)視,例如 CPU 負載,內存使用率,系統(tǒng)吞吐量等等。
第六,產生負載,這里需要從生產環(huán)境去獲取一些真實的數(shù)據(jù)作為負載數(shù)據(jù)源,這部分數(shù)據(jù)源根據(jù)目標系統(tǒng)的承受要求由腳本驅動,對系統(tǒng)進行沖擊。
建議使用往期秒殺系統(tǒng)的數(shù)據(jù),或者實際生產系統(tǒng)的數(shù)據(jù)進行測試。
第七,執(zhí)行測試,這里主要是根據(jù)目標系統(tǒng),關鍵組件,用負載進行測試,返回監(jiān)視點的數(shù)據(jù)。
建議團隊可以對測試定一個計劃,模擬不同的網(wǎng)絡環(huán)境,硬件條件進行有規(guī)律的測試。
第八,分析數(shù)據(jù),針對測試的目的,對關鍵服務的壓力測試數(shù)據(jù)進行分析得知該服務的承受上限在哪里。
對一段時間內有負載波動或者大負載的服務進行數(shù)據(jù)分析,得出服務改造的方向。
總結
秒殺系統(tǒng)的特點,并發(fā)量大,資源有限,操作相對簡單,訪問的都是熱點數(shù)據(jù)。因此,我們需要把它從業(yè)務,技術,數(shù)據(jù)上做隔離,保證不影響到現(xiàn)有的系統(tǒng)。
因此,架構設計需要分幾層來考慮,從客戶請求到數(shù)據(jù)庫存儲,到最后上線前的壓力測試。
簡易的思維導圖送給大家
思考順序如下,客戶端→代理層→應用層→數(shù)據(jù)庫→壓力測試:
客戶端 90% 靜態(tài) HTML+10% 動態(tài) JS;配合 CDN 做好緩存工作。
接入層專注于過濾和限流。
應用層利用緩存+隊列+分布式處理好訂單。
做好數(shù)據(jù)的預估,隔離,合并。
上線之前記得進行壓力測試。
新聞名稱:這一次,徹底弄懂“秒殺系統(tǒng)”
本文來源:http://vcdvsql.cn/news/98718.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供服務器托管、企業(yè)網(wǎng)站制作、外貿網(wǎng)站建設、做網(wǎng)站、App開發(fā)、全網(wǎng)營銷推廣
聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內容