面試場景
我們打算組織一個並發一萬人的秒殺活動,1元秒殺100個二手元牙刷,你給我說說解決方案。
秒殺/搶購業務場景
商品秒殺、商品搶購、群紅包、搶優惠劵、抽獎、......
秒殺/搶購業務特點
秒殺商品價格低廉、搶購商品很好|搶手、大幅推廣|廣為人知、瞬時售空、一般是定時上架、持續時間短、瞬時並發量高......
秒殺、搶購技術特點
讀多寫少、高並發、資源沖突
知道這些,恭喜你,獲得10分。
分析技術特點:
秒殺/搶購技術特點
-
1.讀多寫少
-
緩存
-
2.高並發
-
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限流,令牌桶限流,到數據庫→樂觀鎖或悲觀鎖防止超賣
喜歡的小伙伴們可以搜索我們個人的微信公眾號“程序員的成長之路”點擊關注或掃描下方二維碼