JAVA構建高併發商城秒殺系統——架構分析

面試場景

咱們打算組織一個併發一萬人的秒殺活動,1元秒殺100個二手元牙刷,你給我說說解決方案。前端

 

秒殺/搶購業務場景

商品秒殺、商品搶購、羣紅包、搶優惠劵、抽獎、......nginx

秒殺/搶購業務特色

秒殺商品價格低廉、搶購商品很好|搶手、大幅推廣|廣爲人知、瞬時售空、通常是定時上架、持續時間短、瞬時併發量高......程序員

秒殺、搶購技術特色

讀多寫少、高併發、資源衝突面試

 

知道這些,恭喜你,得到10分。redis

 

分析技術特色:

秒殺/搶購技術特色算法

  • 1.讀多寫少   數據庫

    • 緩存緩存

  • 2.高併發   tomcat

    • 1.限流服務器

    • 2.負載均衡 (單體tomcat併發200完美勝任,突破五,六百就力不從心)

    • 3.緩存

    • 4.異步(將同步的併發請求轉換爲異步)

    • 5.隊列

  • 3.資源衝突   

    • 數據庫鎖

    • 分佈式鎖

    • 其餘原子操做

    • 樂觀鎖

    • 悲觀鎖

    • redis

    • redis

    • decr

    • 原子操做

    • 異步

    • 原子操做和異步分爲:

 

回答到這裏,恭喜你,得到50分了,可是尚未及格。

 

系統基本架構

日均PV只有幾萬的企業管理系統

用戶量過千萬的中型技術社區

活躍用戶過億的大型購物網站

 

這三種都是這種架構:

一個系統基本架構

 

 

回答這一步,恭喜你,得到80分

 

秒殺人羣、併發規模的預估

1.爲何要估算?

肯定一個最終的技術選型以及服務器容量

 

2.怎麼估算?

日併發估算的公式很不少

1) 平均併發用戶數爲 C = nl/T

2) 併發用戶數峯值 C = C + 3 * 根號C

 

秒殺的併發規模就要根據公司活動歷時依賴的最高峯值再擴容。

 

這裏咱們的併發需求在前面已經肯定了。

咱們打算組織一個併發1萬人的秒殺活動,1元秒殺100個二手牙刷。

 

10000個併發的架構

 

悲觀鎖:select * from 表名 for update,該用戶不提交,其餘人都無法操做

樂觀鎖:在表裏面加一個version字段,經過一個版本號去控制

 

悲觀鎖VS樂觀鎖:

1.響應速度

2.衝突頻率

3.重試代價

 

高併發狀況下兩個鎖的結論:悲觀鎖速度更快!!!有時樂觀鎖偶然會比悲觀鎖低,可是在大數據的狀況下,悲觀鎖會比樂觀鎖低!

 

悲觀鎖速度測試:

樂觀鎖速度測試:

關鍵字:自旋鎖(樂觀鎖下操做失敗的請求,在進行重試)

 

限流算法-令牌桶

限流算法-漏桶

nginx配置:

 

自身的一個漏桶限流方式,$binary_remote_addr,限流維度,表示對每個ip進行限流,1r/s表示1秒一個

limit_req zone=preip,preip就是前面配置的。

 

秒殺的架構圖:

前端限流,Nginx限流,令牌桶限流,到數據庫→樂觀鎖或悲觀鎖防止超賣

喜歡的小夥伴們能夠搜索咱們我的的微信公衆號「程序員的成長之路」點擊關注或掃描下方二維碼

相關文章
相關標籤/搜索