秒殺概念-網上競拍
網絡商家為促銷等目的組織的網上
限時搶購活動。由於商品價格低廉,往往一上架就被搶購一空,有時只用一秒鐘。秒殺關鍵問題
一是併發讀,一是併發寫,對應到架構設計,就是高可用、一致性和高性能的要求。
⑴讀
- 先在數組中定位Segment並利用UNSAFE.getObjectVolatile原子讀語義獲取Segment
- 接著在數組中定位HashEntry並利用UNSAFE.getObjectVolatile原子讀語義獲取HashEntry
- 然後依賴final不變的next指針遍歷鏈表
- 找到對應的volatile值
⑵寫
- 先在數組中定位Segment並利用UNSAFE.getObjectVolatile原子讀語義獲取Segment
- 然後嘗試加鎖ReentrantLock
- 接著在數組中定位HashEntry並利用UNSAFE.getObjectVolatile原子讀語義獲取HashEntry鏈表頭節點
- 遍歷鏈表,若找到已存在的key,則利用UNSAFE.putOrderedObject原子寫新值,若找不到,則創建一個新的節點,插入到鏈表頭,同時利用UNSAFE.putOrderedObject原子更新鏈表頭
- 完成操作後釋放鎖
三步走原則
- 動靜分離
1、數據拆分
2、靜態緩存
3、數據整合
- 熱點數據處置
1、熱點識別
2、熱點隔離
3、熱點優化
我們看到的熱點優化與動靜分離是不一樣的,熱點優化是基於二八原則對數據進行了縱向拆分,以便進行針對性地處理。
秒殺系統性能優化
對於一個軟件系統,提高性能可以有很多種手段,如提升硬件水平、調優JVM 性能,這裡主要關注代碼層面的性能優化
- 一致性優化
庫存就是熱點數據。對系統來說,熱點的實際影響就是 “高讀” 和 “高寫”,系統架構之核心。
- 高可用
秒殺系統流量數據的圖形是,一條挺拔的直線,源於秒殺請求高度集中於某一特定的時間點,就會造成一個特別高的零點峰值,對資源的消耗也幾乎是瞬時的。
所以秒殺系統的可用性保護是不可或缺的。
秒殺系統-限流
一般有三種方法,令桶法,漏桶算法,分佈式鎖
- 令牌桶-算法描述
⑴ 假如用戶請求的平均發送速率為r,則每隔1/r秒一個令牌被加入到桶中。
⑵ 假設桶中最多可以存放b個令牌。如果令牌到達時令牌桶已經滿了,那麼這個令牌會被丟棄
⑶ 當流量以速率v進入,從桶中以速率v取令牌,拿到令牌的流量通過,拿不到令牌流量不通過,執行熔斷邏輯。
- 漏桶算法-思想
水(請求)先進入到漏桶裡,漏桶以一定的速度出水,當水流入速度過大會直接溢出,可以看出漏桶算法能強行限制數據的傳輸速率。
- 分佈式鎖
⑴ 基於數據庫實現分佈式鎖
⑵ 基於緩存實現分佈式鎖,如redis
⑶ 基於Zookeeper實現分佈式鎖
閱讀更多 天天面試題 的文章