面試題
分布式服務(wù)接口請求的順序性如何保證?
面試官心理分析
其實(shí)分布式系統(tǒng)接口的調(diào)用順序朵夏,也是個(gè)問題蔼啦,一般來說是不用保證順序的。但是有時(shí)候可能確實(shí)是需要嚴(yán)格的順序保證仰猖。給大家舉個(gè)例子捏肢,你服務(wù) A 調(diào)用服務(wù) B奈籽,先插入再刪除。好鸵赫,結(jié)果倆請求過去了衣屏,落在不同機(jī)器上,可能插入請求因?yàn)槟承┰驁?zhí)行慢了一些辩棒,導(dǎo)致刪除請求先執(zhí)行了狼忱,此時(shí)因?yàn)闆]數(shù)據(jù)所以啥效果也沒有;結(jié)果這個(gè)時(shí)候插入請求過來了一睁,好钻弄,數(shù)據(jù)插入進(jìn)去了,那就尷尬了卖局。
本來應(yīng)該是 “先插入 -> 再刪除”斧蜕,這條數(shù)據(jù)應(yīng)該沒了,結(jié)果現(xiàn)在 “先刪除 -> 再插入”砚偶,數(shù)據(jù)還存在批销,最后你死都想不明白是怎么回事。
所以這都是分布式系統(tǒng)一些很常見的問題染坯。
面試題剖析
首先均芽,一般來說,個(gè)人建議是单鹿,你們從業(yè)務(wù)邏輯上設(shè)計(jì)的這個(gè)系統(tǒng)最好是不需要這種順序性的保證掀宋,因?yàn)橐坏┮腠樞蛐员U希热缡褂?strong>分布式鎖仲锄,會(huì)導(dǎo)致系統(tǒng)復(fù)雜度上升劲妙,而且會(huì)帶來效率低下,熱點(diǎn)數(shù)據(jù)壓力過大等問題儒喊。
下面我給個(gè)我們用過的方案吧镣奋,簡單來說,首先你得用 dubbo 的一致性 hash 負(fù)載均衡策略怀愧,將比如某一個(gè)訂單 id 對應(yīng)的請求都給分發(fā)到某個(gè)機(jī)器上去侨颈,接著就是在那個(gè)機(jī)器上因?yàn)榭赡苓€是多線程并發(fā)執(zhí)行的,你可能得立即將某個(gè)訂單 id 對應(yīng)的請求扔一個(gè)內(nèi)存隊(duì)列里去芯义,強(qiáng)制排隊(duì)哈垢,這樣來確保他們的順序性。
但是這樣引發(fā)的后續(xù)問題就很多扛拨,比如說要是某個(gè)訂單對應(yīng)的請求特別多耘分,造成某臺(tái)機(jī)器成熱點(diǎn)怎么辦?解決這些問題又要開啟后續(xù)一連串的復(fù)雜技術(shù)方案......曾經(jīng)這類問題弄的我們頭疼不已,所以陶贼,還是建議什么呢啤贩?
最好是比如說剛才那種待秃,一個(gè)訂單的插入和刪除操作拜秧,能不能合并成一個(gè)操作,就是一個(gè)刪除章郁,或者是什么枉氮,避免這種問題的產(chǎn)生。