0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

關于高并發(fā)和秒殺系統(tǒng)基本的概念的建立

C語言專家集中營 ? 來源:未知 ? 作者:李倩 ? 2018-06-04 17:10 ? 次閱讀

大家也許開發(fā)過高并發(fā)的系統(tǒng)或者秒殺程序,但肯定都有接觸過,像電商平臺的秒殺、搶購等活動,還有12306春運搶票。

互聯(lián)網(wǎng)公司,做一些有獎活動,而且數(shù)量有限,獎品給力,如果是先到先得的策略,那就類似秒殺系統(tǒng)了。

這類系統(tǒng)最大的問題就是活動周期短,瞬間流量大(高并發(fā)),很少人可以成功下單,絕大多數(shù)人都是很遺憾。所以從運營體驗上,沒有成功下單的人,心里肯定是不好受的,如果這時候,因為技術、網(wǎng)絡問題,影響用戶體驗,那就更是罵聲一片。

這里,就來講一講技術在這種情況下,會發(fā)生和要做的事。

下面是基本的概念的建立。

第一:高并發(fā)

技術要做的事,一方面優(yōu)化程序,讓程序性能最優(yōu),單次請求時間能從50ms優(yōu)化到25ms,那就可以在一秒鐘內(nèi)成功響應翻倍的請求了。

另一方面就是增加服務器,用更大的集群來處理用戶請求,設計好一個可靠且靈活擴充的分布式方案就更加重要了。

第二:時間短

火熱的秒殺活動,真的是一秒鐘以內(nèi)就會把商品搶購一空,而大部分用戶的感受是,提交訂單的過程卻要等待好幾秒、甚至十幾秒,更糟糕的當然是請求報錯。

那么一個好的秒殺體驗,當然希望盡可能減少用戶等待時間,準確的提示用戶當前是否還有商品庫存。而這些,也是需要有優(yōu)秀的程序設計來保證的。

第三:系統(tǒng)容量預估

系統(tǒng)設計的時候,都需要有一個容量預估,那就是要提前計算好,我們設計的系統(tǒng),要承載多大的數(shù)量級。

假如線上前端服務器規(guī)格是8核16G內(nèi)存的服務器,而提交訂單的處理程序耗時100ms,那么可以簡單計算一下:

每秒可以處理的訂單請求數(shù)=1000ms/100ms*8=80qps

上面這個結果,對于秒殺系統(tǒng)來說,肯定是非常不理想的。

如果能將處理程序耗時優(yōu)化后,降低到10ms,那么就可以達到800qps。

如果我們可以把程序繼續(xù)優(yōu)化,能快速區(qū)分開有庫存和無庫存處理,那么無庫存時處理就有可能做到1ms甚至更低的耗時。這樣無庫存時就能有更好的性能,上萬的qps也是可以達到的。

上面的預估,都是針對單機,那么簡單的增加前端服務器,是不是就能有更好的并發(fā)處理量呢?

肯定沒這么簡單,因為數(shù)據(jù)庫、緩存系統(tǒng)甚至機房網(wǎng)絡帶寬都會成為瓶頸。

于是就要有一個更好的分布式方案。

第四:好的分布式方案

一個好的分布式方案,首先當然是穩(wěn)定可靠,不要出亂子,然后就是方便擴充,最好的效果當然是增加一臺服務器,并發(fā)處理量可以1:1線性增長。

比如:單機qps是1k,那么10臺服務器可以做到1w,100臺可以做到10w每秒。

要做到這樣的線性增長效果,就要杜絕出現(xiàn)瓶頸,否則還是會代價太大。

拒絕假的分布式尤其重要,比如:前端服務器是可以獨立存在的,但是都依賴集中的一個數(shù)據(jù)庫或者緩存系統(tǒng),那最后,一定是集中的那個數(shù)據(jù)庫或者緩存系統(tǒng)受不了,同樣無法做到一個好的分布式。

第五:關注系統(tǒng)的瓶頸

大家先有幾個基本的共識,系統(tǒng)的處理速度

程序內(nèi)數(shù)據(jù)讀寫 > redis > mysql > 磁盤

單機網(wǎng)絡請求 > 局域網(wǎng)內(nèi)請求 > 跨機房請求

我們優(yōu)化程序的時候,盡量用最快的方式,盡量用最簡短的邏輯。

用redis替代mysql來保存訂單處理中依賴的數(shù)據(jù),用程序中的提交的數(shù)據(jù)代替從redis中二次獲取數(shù)據(jù),比如:商品庫存信息,用戶訂單信息。

邏輯處理中,把速度快且提前中斷的邏輯放在最前面,比如:驗證登錄,驗證問答

我們做分布式方案的時候,盡量把資源調用放在最近的地方。

前端服務器依賴的數(shù)據(jù)盡量就在局域網(wǎng)內(nèi),如果能在單機都有讀的redis服務當然更好,程序維護數(shù)據(jù)響應會復雜些。

不要出現(xiàn)跨機房網(wǎng)絡請求,不要出現(xiàn)跨機房網(wǎng)絡請求,不要出現(xiàn)跨機房網(wǎng)絡請求,重要的事情說三遍。

第六:什么語言更適合這類系統(tǒng)

課程中用的是PHP語言,開發(fā)這類系統(tǒng)也是沒問題的。

當然,像是用golang, ngx_lua可能在高并發(fā)和性能方面會更有優(yōu)勢。

如果使用java、.net當然也是可以的,作為一個系統(tǒng),語言只是工具,更好的設計和優(yōu)化,才能達到最終想要的效果。

有了上面的基本概念,我們接下來再來看看,具體運行時,會出現(xiàn)什么狀況。

下面是一些具體的問題:

問題1:庫存超賣

只有10個庫存,但是一秒鐘有1k個訂單,怎么能不超賣呢?

核心思想就是保證庫存遞減是原子性操作,10--返回9,9--返回8,8--返回7。

而不能是讀取出來庫存10,10-1=9再更新回去。因為這個讀取和更新是并發(fā)執(zhí)行的,很可能就會有1k個訂單都成功了,而庫存實際只有10。

那么,怎么保證原子性操作呢?

1 數(shù)據(jù)庫:

update product set left_num=left_num-1 where left_num>0;

這里用到的是left_num=left_num-1,如果left_num>0才能執(zhí)行成功,數(shù)據(jù)庫查詢、更新的時候有用到鎖,是可以保證更新操作的原子性的。

數(shù)據(jù)庫性能較差,不建議使用。

2 分布式鎖

用redis來做一個分布式鎖,reids->setnx('lock', 1) 設置一個鎖,程序執(zhí)行完成再del這個鎖。

鎖定的過程,不利于并發(fā)執(zhí)行,大家都在等待鎖解開,不建議使用。

3 消息隊列

將訂單請求全部放入消息隊列,然后另外一個后臺程序一個個處理隊列中的訂單請求。

并發(fā)不受影響,但是用戶等待的時間較長,進入隊列的訂單也會很多,體驗上并不好,也不建議使用。

4 redis遞減

通過 redis->incrby('product', -1) 得到遞減之后的庫存數(shù)。

性能方面很好,同時體驗上也很好,在PHP秒殺課程中,優(yōu)化后就是用的這種方法,而沒有使用上述其他方法,大家應該也能對比了解啦。

問題2:集群怎么來規(guī)劃

前端服務器因為沒有相互間關聯(lián),集群的數(shù)量不受影響。

redis的性能可以達到每秒幾萬次響應,所以一個集群的規(guī)模,也就是redis服務可以承載的數(shù)量。

比如:一臺前端服務器是1~2k的qps(有庫存時),那么10臺+1臺redis就可以是一個獨立的集群,可以支撐1~2w每秒訂單量。

10個上述的集群就可以做到一秒鐘處理10w~20w的有效訂單。

如果秒殺活動的庫存量在1w以內(nèi),預計參與的人數(shù)在百萬左右,那么有一個集群也就可以搞定。

如果秒殺參與的人數(shù)超過千萬,那么就要用到不止一個集群了。

問題3:多個集群的數(shù)據(jù)怎么保持一致性

不要做多集群的數(shù)據(jù)同步,而是用散列,每個集群的數(shù)據(jù)是獨立存在的。

假設,有10個商品,每個商品有1w庫存,規(guī)劃用10個集群,那么每個集群有10個商品,每個商品是1k庫存。

每個集群只需要負責把自己的庫存賣掉即可,至于說,會不會有用戶知道有10個集群,然后每個集群都去搶。

這種情況就不要用程序來處理了,利用運營規(guī)則,活動結束后匯總訂單的時候再去處理就好了。

如果擔心散列的不合理,比如:某個集群用戶訪問量特別少,那么可以引入一個中控服務,來監(jiān)控各個集群的庫存,然后再做平衡。

問題4:機器人搶購怎么辦:

沒什么太好的辦法,類似DDOS攻擊,只能是讓自身更強大才是王道。

運營策略上,可以嚴格控制用戶注冊,必須登錄,提交訂單的時候引入圖像驗證碼,問答,交互式驗證等。

上面的內(nèi)容不知道大家還會有什么疑問,可以給我留言。

具體的關于高并發(fā)、秒殺的實戰(zhàn)內(nèi)容,在課程中也有詳細的講解,這里用文字的形式提煉整理出來,希望能更好的幫助大家理解,謝謝~

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 服務器
    +關注

    關注

    12

    文章

    8843

    瀏覽量

    84947
  • 數(shù)據(jù)庫

    關注

    7

    文章

    3734

    瀏覽量

    64171

原文標題:關于高并發(fā)和秒殺系統(tǒng),你知道的和不知道的一些事

文章出處:【微信號:C_Expert,微信公眾號:C語言專家集中營】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    從服務端視角看并發(fā)難題

    ,比如:使用集群,分布式的系統(tǒng)架構應用優(yōu)化,比如:使用更高效的編程語言,優(yōu)化處理業(yè)務邏輯的算法,優(yōu)化訪問數(shù)據(jù)庫的SQL基本原則:分而治之,并提高單個請求的處理速度并發(fā)處理的基本手段1)客戶端發(fā)出請求
    發(fā)表于 11-02 15:11

    如何去實現(xiàn)一種基于SpringMVC的電商并發(fā)秒殺系統(tǒng)設計

    參考博客Java并發(fā)秒殺系統(tǒng)API目錄業(yè)務場景要解決的問題Redis的使用業(yè)務場景首頁倒計時秒殺活動,搶購商品要解決的問題
    發(fā)表于 01-03 07:50

    并行和并發(fā)哪個好?并行和并發(fā)概念和區(qū)別

    摘要:并發(fā)與并行是兩個既相似而又不相同的概念并發(fā)性,又稱共行性,是指能處理多個同時性活動的能力;并行是指同時發(fā)生的兩個并發(fā)事件,具有并發(fā)
    發(fā)表于 12-08 09:12 ?6.6w次閱讀
    并行和<b class='flag-5'>并發(fā)</b>哪個好?并行和<b class='flag-5'>并發(fā)</b>的<b class='flag-5'>概念</b>和區(qū)別

    阿里的秒殺系統(tǒng)是如何設計的?

    阿里的秒殺系統(tǒng)是怎么設計的?,服務器,redis,調用,后端
    的頭像 發(fā)表于 02-20 11:23 ?1893次閱讀
    阿里的<b class='flag-5'>秒殺</b><b class='flag-5'>系統(tǒng)</b>是如何設計的?

    解密并發(fā)業(yè)務場景下典型的秒殺系統(tǒng)的架構

    中,就更別提如何構建并發(fā)系統(tǒng)了! 究竟什么樣的系統(tǒng)算是并發(fā)
    的頭像 發(fā)表于 11-17 10:32 ?2194次閱讀
    解密<b class='flag-5'>高</b><b class='flag-5'>并發(fā)</b>業(yè)務場景下典型的<b class='flag-5'>秒殺</b><b class='flag-5'>系統(tǒng)</b>的架構

    【源碼版】基于SpringMVC的電商并發(fā)秒殺系統(tǒng)設計思路

    參考博客Java并發(fā)秒殺系統(tǒng)API目錄業(yè)務場景要解決的問題Redis的使用業(yè)務場景首頁倒計時秒殺活動,搶購商品要解決的問題
    發(fā)表于 01-12 10:23 ?0次下載
    【源碼版】基于SpringMVC的電商<b class='flag-5'>高</b><b class='flag-5'>并發(fā)</b><b class='flag-5'>秒殺</b><b class='flag-5'>系統(tǒng)</b>設計思路

    如何實現(xiàn)一個秒殺系統(tǒng)

    實現(xiàn)一個秒殺系統(tǒng),采用spring boot 2.x + mybatis+ redis + swagger2 + lombok實現(xiàn)。
    的頭像 發(fā)表于 09-15 09:56 ?2102次閱讀

    通過秒殺商品來模擬并發(fā)的場景

    并發(fā)場景在現(xiàn)場的日常工作中很常見,特別是在互聯(lián)網(wǎng)公司中,這篇文章就來通過秒殺商品來模擬并發(fā)的場景。
    的頭像 發(fā)表于 02-07 10:47 ?403次閱讀

    服務器的并發(fā)能力如何提升?

    服務器的并發(fā)能力如何提升? 服務器并發(fā)能力體現(xiàn)著服務器在單位時間內(nèi)的很強數(shù)據(jù)處理能力,一般來說,如果企業(yè)的互聯(lián)網(wǎng)業(yè)務需要面對大量的同時在線請求,那么就需要高
    的頭像 發(fā)表于 03-17 17:07 ?936次閱讀

    如何控制秒殺商品頁面購買按鈕的點亮

    售空;(4)一般是定時上架;(5)時間短、瞬時并發(fā); ? 2 秒殺技術挑戰(zhàn) 假設某網(wǎng)站秒殺活動只推出一件商品,預計會吸引1萬人參加活動,也就說最大
    的頭像 發(fā)表于 06-29 11:12 ?771次閱讀
    如何控制<b class='flag-5'>秒殺</b>商品頁面購買按鈕的點亮

    服務器并發(fā)概念

    自己調整系統(tǒng)的相關參數(shù) 并發(fā)概念是什么?什么是并發(fā)? 對于服務器并發(fā)概念,下面幾點是錯誤的定
    的頭像 發(fā)表于 11-10 10:05 ?4111次閱讀
    服務器<b class='flag-5'>并發(fā)</b>的<b class='flag-5'>概念</b>

    java結合redis秒殺功能

    近年來,隨著電子商務的快速發(fā)展,各大電商平臺都推出了各種促銷活動來吸引用戶。秒殺活動作為一種高效的促銷方式,能夠在很短的時間內(nèi)促成大量的交易。然而,并發(fā)場景下的秒殺活動也給
    的頭像 發(fā)表于 12-04 11:06 ?526次閱讀

    redis并發(fā)能力直接相關概念有哪些

    Redis是一種高性能的開源內(nèi)存數(shù)據(jù)庫,具有出色的并發(fā)能力。為了實現(xiàn)并發(fā),需要有一些相關概念和技術。下面是關于Redis
    的頭像 發(fā)表于 12-05 10:34 ?705次閱讀

    并發(fā)系統(tǒng)的藝術:如何在流量洪峰中游刃有余

    前言 我們常說的三,并發(fā)、可用、高性能,這些技術是構建現(xiàn)代互聯(lián)網(wǎng)應用程序所必需的。對于京東618備戰(zhàn)來說,所有的中臺系統(tǒng)服務,無疑都是
    的頭像 發(fā)表于 08-05 13:43 ?178次閱讀
    <b class='flag-5'>高</b><b class='flag-5'>并發(fā)</b><b class='flag-5'>系統(tǒng)</b>的藝術:如何在流量洪峰中游刃有余

    并發(fā)物聯(lián)網(wǎng)云平臺是什么

    并發(fā)物聯(lián)網(wǎng)云平臺是一種能夠處理大量設備同時連接并進行數(shù)據(jù)交換的云計算平臺。這種平臺通常被設計用來應對來自數(shù)以萬計甚至數(shù)十億計的物聯(lián)網(wǎng)設備的并發(fā)請求,保證系統(tǒng)的穩(wěn)定性和響應速度。 首先
    的頭像 發(fā)表于 08-13 13:50 ?180次閱讀