高並發解決方案之秒殺

2020-12-13 黑馬程式設計師

一、什麼是高並發

高並發(High Concurrency)是網際網路分布式系統架構設計中必須考慮的因素之一,它通常是指,通過設計保證系統能夠同時並行處理很多請求。高並發相關常用的一些指標有響應時間(Response Time),吞吐量(Throughput),每秒查詢率QPS(Query Per Second),並發用戶數等。

響應時間:系統對請求做出響應的時間。例如系統處理一個HTTP請求需要200ms,這個200ms就是系統的響應時間。

吞吐量:單位時間內處理的請求數量。

QPS:每秒響應請求數。在網際網路領域,這個指標和吞吐量區分的沒有這麼明顯。

並發用戶數:同時承載正常使用系統功能的用戶數量。例如一個即時通訊系統,同時在線量一定程度上代表了系統 的並發用戶數。

二、什麼是秒殺

秒殺場景一般會在電商網站舉行一些活動或者節假日在12306網站上搶票時遇到。對於電商網站中一些稀缺或者特 價商品,電商網站一般會在約定時間點對其進行限量銷售,因為這些商品的特殊性,會吸引大量用戶前來搶購,並 且會在約定的時間點同時在秒殺頁面進行搶購。

此種場景就是非常有特點的高並發場景,如果不對流量進行合理管控,肆意放任大流量衝擊系統,那麼將導致一系 列的問題出現,比如一些可用的連接資源被耗盡、分布式緩存的容量被撐爆、資料庫吞吐量降低,最終必然會導致 系統產生雪崩效應。

一般來說,大型網際網路站通常採用的做法是通過擴容、動靜分離、緩存、服務降級及限流五種常規手段來保護系統 的穩定運行。

三、如何解決秒殺的高並發

限流

在討論為什麼需要限流之前,我們先聊一聊生活中那些隨處可見的限流場景。

例如上下班高峰期,大量人群湧入地鐵站,會造成嚴重擁堵,原本從站廳到站臺最多只需花費5分鐘左右的時間, 卻在被限流管制下被迫花費30分鐘或更久才能順利進入站臺。

上面兩張圖片就展示了地鐵擁擠的場景,如果這所有的人全部湧入站臺,那麼會造成更多的人無法上車,所以採取 了管制之後,我們可以讓人們通過地面和站廳層的雙重排隊等待,減輕站臺的壓力,保證每一位乘客最終都能順利 的上車。

在電商系統的秒殺中,也會有大批量的用戶同時湧入,鑑於只有少部分用戶能夠秒殺成功,所以要限制大部分流 量,只允許少部分流量進入服務後端。

限流可以採用限制伺服器的連接等待數量以及等待時間,每次只放行少量用戶,讓更多的用戶處於假排隊的狀態。 例如tomcat的配置:

1 <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" maxThreads="800" acceptCount="1000"/>

其中最後兩個參數意義如下:

maxThreads:tomcat起動的最大線程數,即同時處理的任務個數,默認值為200 acceptCount:當tomcat起動的線程數達到最大時,接受排隊的請求個數,默認值為100 這兩個值如何起作用,請看下面三種情況

情況1:接受一個請求,此時tomcat起動的線程數沒有到達maxThreads,tomcat會起動一個線程來處理此請求。

情況2:接受一個請求,此時tomcat起動的線程數已經到達maxThreads,tomcat會把此請求放入等待隊列,等待 空閒線程。

情況3:接受一個請求,此時tomcat起動的線程數已經到達maxThreads,等待隊列中的請求個數也達到了acceptCount,此時tomcat會直接拒絕此次請求,返回connection refused

頁面靜態化

首先我們可以使用Freemarker對頁面進行靜態化,讓用戶減少跟後端伺服器之間的交互。這樣就能降低伺服器的 壓力,如果條件允許我們可以採用CDN加速。

Freemarker的原理如下圖,模板+數據通過Freemarker可以生成靜態頁面。

CDN是將源站內容分發至最接近用戶的節點,使用戶可就近取得所需內容,提高用戶訪問的響應速度和成功率。 例如下圖:北京網民會自動訪問到離自己最近並且速度最快的伺服器的資源。

引入Redis

限流和靜態化都是為了減輕伺服器後端的壓力,但是最終用戶的請求還是會落到伺服器中,為了增加用戶的體驗 度,我們也應加快相應速度。後端代碼和資料庫之間的交互會降低相應速度,所以我們可以採用Redis來進行數據 的高速讀取。

Redis是一款極其優秀的內存級別的NoSql資料庫,單線程下讀寫速度能達到5w/s。所以我們在很多情況下都能利 用Redis去解決高速讀取的問題。

特別是庫存量的超賣現象,我們可以在開始秒殺的時候,把總的庫存量存入Redis中,每當用戶來搶購時,利用String類型的decr方法去減一,如果減一成功就視認為搶夠成功,並把用戶和商品信息存入Redis的訂單條目中, 當最終搶購結束時,我們再一併把Redis的訂單信息存入到資料庫中。

代碼參考:

# 設置總的待搶購數量為1000000set amount 1000000;# 搶購 數量減一decr amount 5# 把用戶信息存入到搶購成功的集合中,由商品ID命名來區分lpush 用戶ID 商品ID

四、總結

通過上述3種方案可以解決大部分場景下的秒殺問題,當然高並發下也會出現更多的意外的狀況,那麼我們可以針 對自己的業務,資源的調度進行更多方位的嘗試,找到最適合自己的解決方案。

相關焦點

  • 「高並發」Redis如何助力高並發秒殺系統,看完這篇我徹底懂了!
    秒殺業務最大的特點就是瞬時並發流量高,在電商系統中,庫存數量往往會遠遠小於並發流量,比如:天貓的秒殺活動,可能庫存只有幾百、幾千件,而瞬間湧入的搶購併發流量可能會達到幾十到幾百萬。所以,我們可以將秒殺系統的業務特點總結如下。
  • 高並發庫存秒殺場景,阿里巴巴資料庫是這樣應對的
    高並發庫存系統的資料庫實現為了解決單實例存在的容量和性能上限問題,阿里巴巴所有的庫存系統在十年前就實現了分庫分表設計,主要通過數據的水平拆分實現不同商品的庫存扣減請求路由到不同的資料庫。熱點商品的庫存扣減本質上就是熱點行更新的能力,高並發的同行更新會造成嚴重的行鎖等待現象,從而導致資料庫的threads_running和rt飆升,造成雪崩。在當前的官方mysql中,一般單行更新的QPS在500以內,對於熱點商品的秒殺需求,這個量往往是不達標的。
  • java學習:高並發下的架構解決方案附案列講解
    眾所周知,網際網路分布式系統架構設計必須考慮高並發,高並發也是開發者常常會面臨的一個技術難題。如何控制庫存避免超賣?怎麼實現線程間數據處理的同步?本文將以紅包雨系統業務為例,為大家詳細闡述業務痛點和系統設計的方法,幫助大家梳理解決問題的思路,構建系統思維的能力。
  • 商城秒殺之超賣問題的解決思路
    比如12:00:00搶購, 12:00:01活動就結束了1.1 突然多了很多訪問,可能導致原有商城癱瘓秒殺活動只是網站營銷的一個附加活動,這個活動具有時間短,並發訪問量大的特點,如果和網站原有應用部署在一起,必然會對現有業務造成衝擊,稍有不慎可能導致整個網站癱瘓。
  • redis如何解決高並發問題?避免出現超賣的情況?
    相信你要處理高並發問題,肯定會想到使用redis緩存資料庫。因為它可以在一定程度上解決網站一瞬間的並發量,不會出現卡死的情況,因為他是使用了內存的,如果你使用普通的資料庫的話,增加伺服器的壓力,效率低下不說,更有可能高並發的時候導致壞表了,也有可能直接導致伺服器假死。也就是卡著了,一點反應都沒有。這可是致命的問題啊。
  • JAVA並發編程:並發問題的根源及主要解決方法
    並發問題的根源在哪首先,我們要知道並發要解決的是什麼問題?並發要解決的是單進程情況下硬體資源無法充分利用的問題。而造成這一問題的主要原因是CPU-內存-磁碟三者之間速度差異實在太大。如果將CPU的速度比作火箭的速度,那麼內存的速度就像火車,而最慘的磁碟,基本上就相當於人雙腿走路。
  • 高並發與實時處理技術實戰:IT系統架構調優就得這麼玩
    在19日下午的《高並發與實時處理》分論壇上,來自同程藝龍機票事業群的王曉波、51信用卡大數據架構師劉建輝、遊密通訊雲技術副總裁餘俊澎和新浪微博實時流技術平臺負責人廖博,分別從高並發下緩存的治理、大數據產品進階之道、實時音視頻海量並發之道和實時流計算平臺及應用模式四個不同的角度,為到場的聽眾帶來了一場高並發技術應用的饕餮盛宴。
  • 阿里P9耗時28天,總結歷年億級活動高並發系統設計手冊
    高並發俗話說:羅馬不是一天建成的,系統的設計當然也是如此。同樣的,高並發系統的演進也不是一步到位的,也是循序漸進,不斷改進的,像幾年前,雙十一卡崩,無法付款無法選擇地址的事情每年都會發生,但是今年的情況是不是好一些呢?就是在這些不斷地改進過程中,以解決系統中存在的問題為目的和驅動力的系統設計得以進行,而阿里,正是在這方面的最佳實踐者。有人可能會說,他們有伺服器啊(要不把你程序放在他們伺服器上抵抗億級並發的衝擊試試?)
  • 詳解:如何設計出健壯的秒殺系統?
    1.2:高並發秒殺具有時間短、並發量大的特點,秒殺持續時間只有幾分鐘,而一般公司都為了製造轟動效應,會以極低的價格來吸引用戶,因此參與搶購的用戶會非常的多。1.6:大量請求問題按照1.2的考慮,就算使用緩存還是不足以應對短時間的高並發的流量的衝擊。如何承載這樣巨大的訪問量,同時提供穩定低時延的服務保證,是需要面對的一大挑戰。
  • 高並發的中斷下半部tasklet實例解析
    最近為了解決一個技術問題,需要用到內核裡中斷下半部的tasklet機制,使用過程遇到了非常有趣的問題。在解決問題過程中,也逐步加深了對tasklet機制的理解。每一次__elv_add_request函數的調用,都有一次blk_add_trace_rq_insert1回調函數與之對應執行。
  • 阿里雲最新重構的數據湖解決方案「秒殺所有對手」
    之後,隨著大數據、雲計算以及雲存儲技術的不斷成熟,數據湖解決方案被主流雲計算廠商極力推崇,並且演繹出不同版本。走到今天,數據湖解決方案似乎已足夠成熟,但從應用場景來看,一切才剛剛開始,還有大量變革空間,這也是阿里云為什麼要重構數據湖解決方案,主推下一代技術的根本原因。  什麼是下一代數據湖解決方案?
  • 1號店11.11:從應用架構落地點談高可用高並發高性能
    1.背景 1.1三高是電商核心交易系統的基礎電商核心交易系統有很多特點,如分布式、高可擴展等,在眾多特性中,高可用、高並發、高性能是基礎。大到技術峰會、論壇、研討會,小到一場面試,高可用、高並發、高性能始終是焦點,是技術大牛、技術追隨者永遠津津樂道的話題,成為他們畢生的追求。
  • 銳捷網絡率先推出醫療Wi-Fi 6零漫遊解決方案
    11月21-22日,第三屆全國醫院物聯網大會暨中國國際醫院物聯網產品展覽會在合肥盛大召開,銳捷網絡攜全新無線方案亮相其中。銳捷醫療行業總經理徐偉現場重磅發布下一代無線技術—「醫療Wi-Fi6零漫遊解決方案」,受到參會嘉賓的廣泛關注!
  • 最常用的分布式ID解決方案,你知道幾個?
    對於分布式ID而言,也需要具備分布式系統的特點:高並發,高可用,高性能等特點。並發性能不高,受限於資料庫性能;2. 分庫分表,需要改造,複雜;3. 自增:數據量洩露Redis自增Redis計數器,原子性自增使用內存,並發性能好1. 數據丟失;2. 自增:數據量洩露雪花算法(snowflake)大名鼎鼎的雪花算法,分布式ID的經典解決方案1. 不依賴外部組件;2.
  • 華為發布面向行業場景的5G室內覆蓋解決方案LampSite EE...
    通信世界網消息(CWW)今日,華為發布了面向行業場景的5G室內覆蓋解決方案LampSite EE (Enterprise Edition)。該解決方案可基於華為領先的LampSite 5G室內無線接入網絡升級,主要面向智能製造、智慧醫院、智慧交紐、智能倉儲等行業應用場景,幫助企業有效利用5G技術加速企業智慧化建設,助力行業數位化轉型。隨著5G的正式商用,加速5G在垂直行業的落地已成為行業數位化轉型的關鍵。行業場景應用對無線網絡的需求與普通用戶存在較大差異。
  • 支撐百萬高並發內核參數調優
    眾所周知在默認參數情況下Linux對高並發支持並不好,主要受限於單進程最大打開文件數限制、內核TCP參數方面和IO事件分配機制等。下面就從幾方面來調整使Linux系統能夠支持高並發環境。通過上述步驟,就為支持高並發TCP連接處理的通訊處理程序解除關於打開文件數量方面的系統限制。內核TCP參數方面Linux系統下,TCP連接斷開後,會以TIME_WAIT狀態保留一定的時間,然後才會釋放埠。
  • 某旅行社電子合同解決方案
    某旅行社電子合同解決方案平臺及需求簡介:這是一家區域型連鎖旅行社,在多地擁有分支機構。在以前,該旅行社通過地推或線下活動獲取用戶,但現場籤約率較低,而事後面對部分意向客戶又沒有線上簽約平臺,而上門籤約成本高,如果讓用戶自行前往籤約,則大大增加了客戶流失率。
  • 幫你解讀什麼是Redis緩存穿透和緩存雪崩(包括解決方案)
    並給出一些解決方案。這兩個問題是基本問題也是面試常問問題。這篇文章我參考了很多篇,發現寫的基本上一樣,所以在此基礎之上進行改進。內容是我在某字母網站看的尚矽谷的教程總結的。特在此說明。這裡需要注意和緩存擊穿的區別,緩存擊穿,是指一個key非常熱點,在不停的扛著大並發,大並發集中對這一個點進行訪問,當這個key在失效的瞬間,持續的大並發就穿破緩存,直接請求資料庫,就像在一個屏障上鑿開了一個洞。為了避免緩存穿透其實有很多種解決方案。下面介紹幾種。
  • 大牌限量五折秒殺,全場至高24期免息,京東電腦數碼再掀12.12熱浪
    大牌限量五折秒殺,全場至高24期免息,京東電腦數碼再掀12.12熱浪 2020年12月10日 16:50作者:黃頁編輯:黃頁
  • 大中小型指揮/視頻監控中心KVM坐席協作管理的解決方案
    總體來說,光纖KVM技術方案在超大規模項目場景、大規模數據並發處理、高強度連續運行、高要求數據保密性的方面表現出了超出市場一般產品的優勢,這些關鍵任務場景通常具有顯著的需求特徵:1. 需要處理100路以上的信號通道2. 對接超過50平方米的顯示大屏3. 需要實時處理超大規模並發數據業務4.