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

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