以下都是作者的假想期犬,未經(jīng)實戰(zhàn)河哑,僅作參考。
一些個假定或者說經(jīng)驗值:
這個系統(tǒng)業(yè)務(wù)邏輯假定并不復雜:用戶進來就是查一下某種公共資源的庫存龟虎、然后下訂單預(yù)約璃谨,完事兒。每個用戶每個手機號只能預(yù)約一次鲤妥。
假設(shè)同時10萬人使用佳吞,而且使用頻度不低。一方面不會每個用戶一直不停的操作棉安,另一方面一個操作可能會產(chǎn)生多個請求并發(fā)底扳;所以這里只是估計。我們假設(shè)平均一個用戶操作觸發(fā)1個請求贡耽,然后每秒10萬用戶中有5萬多人同時進行了操作衷模。這樣真正給到系統(tǒng)的并發(fā)是5萬/秒鹊汛。
我們看看按照上面的設(shè)想,這個10萬級別秒殺系統(tǒng)需要準備些什么阱冶?
主機: 6臺刁憋,8c16g, 其中1臺部署nginx木蹬、 5臺部署應(yīng)用服務(wù)器至耻;
說明,這里按照1個nginx處理5萬/秒的請求镊叁,而每個應(yīng)用服務(wù)器負責處理1萬/秒的請求(在nginx與每個應(yīng)用服務(wù)器之間維持100個連接尘颓,每個請求耗時10ms、則1連接1秒可處理100請求晦譬,100連接1秒可處理1萬請求疤苹。)。關(guān)于硬件配置蛔添,參考了https://kiswo.com/archives/349 痰催,這篇文章。怕不夠迎瞧,還增強了一下配置。
網(wǎng)絡(luò):每個請求按照10KB算逸吵、每秒5萬個請求488MB/s凶硅, 3.9Gbps的帶寬。4個1Gbps帶寬的網(wǎng)絡(luò)設(shè)備做接入扫皱。實際這么搞肯定不行足绅,圖片和js什么的要使用cdn以及客戶端緩存,就算是從服務(wù)端拿的json報文韩脑、如果是每次用戶只需要從后臺拉一次的話要使用客戶端緩存氢妈、下次直接訪問客戶端本地緩存就行了。一般服務(wù)器外網(wǎng)帶寬也就150MB的居多段多、1Gbps首量,稱為千兆網(wǎng)卡。
數(shù)據(jù)庫:sql優(yōu)化得當进苍,并且添加應(yīng)用層緩存加缘,那么假設(shè)20%的請求真正落到數(shù)據(jù)庫。 1萬的綜合tps觉啊。(跟sql和事務(wù)處理邏輯有關(guān)拣宏,但是1萬tps沒啥應(yīng)該感到吃驚的,數(shù)據(jù)庫已經(jīng)不是千把tps就會壓垮的時代了杠人。具體可見 https://zhuanlan.zhihu.com/p/339996719 猜測測試的數(shù)據(jù)庫是16核64G以上配置勋乾,阿里云rds這個配置的最大連接數(shù)給的是1萬剛好宋下、1年9萬價格)。
btw辑莫,阿里云rds目前頂配mysql的配置是:
90核 720GB(獨占物理機) 1000GB (本地SSD盤)
最大連接數(shù):150000 ; IOPS:140000
1臺 77萬元/年
按照經(jīng)驗学歧,我們設(shè)定一些個公式:
注冊用戶除以10 = 日活(這里指一般系統(tǒng)來說,微信這種太特殊摆昧,注冊用戶基本跟日活一個數(shù)量級)
日活除以10 = 同時在線人數(shù) 撩满,峰值=2*同時在線人數(shù)
我們認為秒殺系統(tǒng)在線的用戶很大部分都會在活動時段都會同時操作。一次用戶操作绅你,我們假設(shè)會觸發(fā)2個請求伺帘。
綜上,10萬并發(fā)可認為是5萬用戶同時操作忌锯,同時在線人數(shù)30萬伪嫁、即同時在線人數(shù)的三分之一。
那么5萬并發(fā)意味著什么偶垮? 相當于最高峰10萬在線人數(shù)张咳。
綜上、對10萬級別的秒殺系統(tǒng)的接入層似舵、服務(wù)層脚猾、數(shù)據(jù)庫,網(wǎng)絡(luò)做了大概的一個空想砚哗。永遠抱著學習的態(tài)度龙助,歡迎指正。
擴展閱讀:
如何設(shè)計一個億級消息量的IM系統(tǒng): https://xie.infoq.cn/article/19e95a78e2f5389588debfb1c