售票并发解决方案
? ? ?今天找以前的筆記,突然發(fā)現(xiàn)這篇,遙記是去年在一家主營代理各種點(diǎn)卡在線充值的公司問的面試題。
以前從沒做過悲觀并發(fā)方面的,一時(shí)想不出看起來可行的解決方案。加上面試的人非要我在那臺(tái)放打印機(jī)邊的爛公共電腦上上機(jī),
于是走了。在公交車上對(duì)并發(fā)售票的問題念念不忘,在手機(jī)上寫了篇筆記。這次還能找到,就拿出來放這里當(dāng)筆記,要是還放電腦上,
不知很年月能再發(fā)現(xiàn)。以下為思索過程:
一,購票大致流程:
1,讀取所有可買票(where state=可買)
2,買的過程:
? ?2.0查詢余票
? ?2.1點(diǎn)擊購買
? ?2.2 中間各種蹉跎
? ?2.3 最后一步做完
? ?2.4放棄。
二,數(shù)據(jù)庫端設(shè)計(jì)
1,一類票本來可以用一行數(shù)據(jù)來記錄,但是為了支持更高的并發(fā),可以分拆成n條記錄,比如1w張,分成100行,則每行有100條記錄。只使用行級(jí)鎖的時(shí)候,提高的并發(fā)度非常客觀。假設(shè)記錄數(shù)量的字段叫TicketCount。
2,每條記錄多加一個(gè)字段用來記錄已開始點(diǎn)擊購買但是尚未完成購買的數(shù)量,例如名字叫OrderingCount。
3,服務(wù)端設(shè)任務(wù)管理器
三,詳細(xì)過程
2.0?采用top one,條件是可賣((TicketCount-OrderingCount>0),若取不到top one,則告知?jiǎng)倓傎u光。
返回該條的key.
2.1?
?a,key+用戶初始化一個(gè)任務(wù),添加到任務(wù)管理器,開始計(jì)時(shí)該條任務(wù)。
?b,update 數(shù)據(jù)庫記錄中的OrderingCount
2.2,倒計(jì)時(shí)任務(wù),如果時(shí)間到,則提示購買超時(shí),update回?cái)?shù)據(jù)庫記錄中的OrderingCount。或是其他策略,比如只是回退OrderingCount,把機(jī)會(huì)讓出來,若是客戶最后還是走到了2.3,則再試試2.0,看是否還可以買。
2.3
?a,update回?cái)?shù)據(jù)庫記錄中的OrderingCount,TicketCount.
?b,任務(wù)管理器標(biāo)志任務(wù)完成,并做其他銷毀動(dòng)作。
2.4
?a,update回退數(shù)據(jù)庫記錄中的OrderingCount.
?b,任務(wù)管理器標(biāo)志任務(wù)完成,并做其他銷毀動(dòng)作。
?
一些小細(xì)節(jié)也許需要更多斟酌,但是要大致解決提高并發(fā),支持業(yè)務(wù)中的長事務(wù),在大方向上應(yīng)該是可以了。
尚未測(cè)試,以后來寫段測(cè)試程序看看。
轉(zhuǎn)載于:https://www.cnblogs.com/wusong/archive/2012/07/17/2596536.html
總結(jié)
- 上一篇: 皇家特使2 全三星攻略
- 下一篇: jQuery 动画效果