??????? 上個月,騰訊有機會去逛了一圈,面試工作,雖然沒有承認,但在整個過程而言仍然令人愉快。面試面試過程中我的孩子(看看關于年齡26,7歲)他問了我一個關于秒殺問題。他說,騰訊游戲往往有秒殺活動。致server死鎖或壓力太大,應該怎樣設計減輕數據庫server壓力。當然由于面試的是PHP職位,我做的是C#和JAVA我知道應該沒機會所以本不想太過“配合”的回答,可是看面試我的小朋友看我好像非常不削的樣子(可能由于面試的是PHP職位并且一上來就讓我做題目,盡管我有點不情愿做題可是畢竟是騰訊還是做了可是PHP接觸的真的不多所以題目差點兒是連蒙帶猜的完畢的,預計不是非常好看),所以還是認真想了想解決方式。
??????? 秒殺說究竟就是瞬間大規模訪問,導致的壓力,前端我們能夠使用集群技術,數據庫呢?拆表?是個方法,可是假設僅僅是簡單拆表仍然會有問題,畢竟秒殺商品被記錄到表中后用戶秒殺必然是須要通過改動表中已有的秒殺商品記錄來確定這個商品是否已經被秒走。為了防止搶到同一條記錄加鎖是必須。
而數據庫一鎖性能問題就來了。那怎么辦呢?我想了一個方法(至少有一點能夠確定騰訊游戲沒實用這種方法解決),秒殺時并非立馬去改動數據庫中記錄(進行update操作),而是先向一張表中插入一條記錄,類似進入等待隊列,為了防止大規模插入操作導致鎖表我們能夠將隊列表拆成多張同樣結構表。有一個job會不斷讀取這些隊列表并依照插入時間排列計算那些記錄被秒殺成功。而client在點擊秒殺button后斷開連接,幾秒后再次通過查詢語句來查詢結果。并返回給前臺客戶。
???????? 這樣做的優點秒殺過程是分段的。前臺用戶在秒殺時僅是向(多張隊列表中)某一張隊列表中插入一條記錄。之后便斷開本次連接進入等待,job程序通過合并查詢將多張秒殺表合并按插入時間排序。按規則得出秒殺成功的用戶并改動秒殺商品表。表明此商品已被秒殺。前臺程序在等待幾秒后查詢秒殺商品表獲得自己是否已秒殺成功。
???????? 由于第一步驟是只插入操作,而不必擔心因臟數據同步問題。因此,我們可以拆表來分散壓力通過降低隔離級別。更新操作是一個單獨的job計劃完成,因為只有一個程序來更改記錄,所以它不會質疑鎖表的存在。最后,前臺得到結果的查詢,因為查詢不需要任何商品秒殺結果只需要知道訂單是否不夠抓住自己。它有可能使用with(nolock)忽略一類的鎖定機構來運行。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
