实现秒杀的几个想法(续)
轉自:http://blog.itpub.net/29254281/viewspace-1800617/
還是秒殺.
秒殺一般有幾個場景
1.電商秒殺商品
2.搶紅包
3.搶票
假設一個場景如下:
? ? 某電商公司搞活動,一折秒殺,推出幾種秒殺的商品,每種商品1000個,預計100w人搶購
要求:
? ? 不能超賣.絕對不可以賣多了.
? ? 數據庫要扣減庫存,并且記錄訂單明細.
難點分析
1.不能阻塞.
海量的請求就像血栓一樣,遍走周身,一旦遇到瓶頸,就會堵塞整個血管.
所以一定要讓海量的用戶請求,盡快結束.
2.數據庫單行更新
大量的 update 庫存表 set 剩余數量=剩余數量-1 where 商品ID=?
這種單行更新,有行鎖,會阻塞其他事務,占用寶貴的數據庫處理能力.
針對這種場景,綜合了很多資料
我覺得可以嘗試幾個關于秒殺的優化.
1.Web服務器集群層,卸載流量
? ? 海量的用戶秒殺請求,本質上是一個排序,先到先得.
????但是如此之多的請求,完全響應,難度又很大.
? ? 所以在Web服務器集群,可以考慮卸載流量.
? ? 比如每十個請求,隨機拋棄九個,只放行一個請求到后續處理環節.
? ? 把秒殺的排序模式,變為隨機抽獎的模式.
????
2.Web服務器集群層,縮小鎖范圍.
? ? 每次秒殺活動開始之前.先計算活動推出的商品數量,然后分配一個限額到每個Web服務器.
? ? 比如一個活動推出秒殺商品
? ? 電視,手機,衣服各1000件,那么每臺服務器的限額就是125件.
? ? 將這個限額寫入ZooKeeper,Web服務器監聽到限額的變化,就會重新初始化各自的商品剩余數量.
模擬示例:
? ? 假設用戶請求秒殺電視機,它只是鎖了該Web服務器電視機的數量。(該Web服務器手機和衣服還可以繼續并發處理,當然其他的Web服務器也在同時處理電視機的秒殺請求)
? ? 這樣縮小了鎖定的范圍,增加了系統處理的吞吐量.
????如果這個剩余數量大于零,則將用戶ID放入電視機購買隊列,然后告知用戶秒殺成功
? ? 如果這個剩余數量等于零,則告知用戶秒殺失敗.即便別的Web服務器還有電視機的剩余配額.
3.ZooKeeper層,ZooKeeper變更庫存信息
? ? 假設活動期間,需要修改庫存信息。
? ? 兩種可能,
? ? 第一種,該商品已經賣了500件,電商不想繼續賣了.
? ? 第二種,從倉庫中又找到了一些積壓庫存..
? ? 兩種情況,都直接修改ZooKeeper中相應商品的配額.
? ? Web服務器會監聽變化,并重新初始化全局容器.
4.消息隊列層,多消費者處理
? ? 消費者主要是從隊列獲取購買請求,發送至數據庫
? ? 扣減數據庫庫存
? ? 寫訂單明細記錄
5.數據庫層,使用存儲過程代替JDBC調用
? ? 由于使用了多消費者處理同一隊列,增加吞吐量,避免隊列堆積過大.
? ? 但是多消費者,必然導致數據庫出現單行更新問題.
? ? 單行更新問題就是多個線程,并發修改同一條記錄,導致事務相互阻塞.浪費了數據庫寶貴的處理能力.
? ? 考查下圖.
????假設消費者到數據庫的網絡是1毫秒
? ? 那么相對于存儲過程,使用JDBC的方式,每個事務將至少多持有行鎖2毫秒.
? ? 所以進一步優化,可以考慮用存儲過程代替JDBC
6.數據庫層,庫存單行更新,增加多個槽位.
? ? 單行更新場景
? ? 增加槽位的表結構
? ?
????使用槽位分散行鎖
? ? 每種商品的庫存,由4個槽位組成.
? ? 事務開始,首先找到剩余數量最多的那個商品槽位.
? ? 然后扣減該槽位的庫存.
? ? 這樣一個行鎖,可以變為4個行鎖,系統吞吐量增加了4倍.
? ? (其實如果update的影響行數為0,表示該槽位已經沒有庫存.可以重復執行這個過程,再另選一個槽位)
commit;
7.數據庫層,冷熱商品分開.
? ? 某些熱點商品,可以單獨放置在一個數據庫處理
? ? 比如蘋果手機新品,特賣打折 10w部
? ? 這種注定會熱的商品,應該使用單獨的數據庫處理
? ? 避免和普通商品競爭,堵塞本次活動其他商品的處理.
參考:
http://blog.itpub.net/29254281/viewspace-1783043/
? ??
http://jiagou.baijia.baidu.com/article/108134?qq-pf-to=pcqq.group
http://www.infoq.com/cn/presentations/seckill-solution-based-sql
轉載于:https://www.cnblogs.com/yanwei-wang/p/5957137.html
總結
以上是生活随笔為你收集整理的实现秒杀的几个想法(续)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【小白成长撸】--二分查找
- 下一篇: web.xml中的那些标签和意义