咱們打算組織一個併發一萬人的秒殺活動,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個二手牙刷。
悲觀鎖:select * from 表名 for update,該用戶不提交,其餘人都無法操做
樂觀鎖:在表裏面加一個version字段,經過一個版本號去控制
悲觀鎖VS樂觀鎖:
1.響應速度
2.衝突頻率
3.重試代價
高併發狀況下兩個鎖的結論:悲觀鎖速度更快!!!有時樂觀鎖偶然會比悲觀鎖低,可是在大數據的狀況下,悲觀鎖會比樂觀鎖低!
悲觀鎖速度測試:
樂觀鎖速度測試:
關鍵字:自旋鎖(樂觀鎖下操做失敗的請求,在進行重試)
限流算法-令牌桶
限流算法-漏桶
nginx配置:
自身的一個漏桶限流方式,$binary_remote_addr,限流維度,表示對每個ip進行限流,1r/s表示1秒一個
limit_req zone=preip,preip就是前面配置的。
秒殺的架構圖:
前端限流,Nginx限流,令牌桶限流,到數據庫→樂觀鎖或悲觀鎖防止超賣
喜歡的小夥伴們能夠搜索咱們我的的微信公衆號「程序員的成長之路」點擊關注或掃描下方二維碼