「面試」分散式服務介面請求的順序性如何保證?

面試題

分散式服務介面請求的順序性如何保證?

面試官心理分析

其實分散式系統介面的呼叫順序,也是個問題,一般來說是不用保證順序的。但是有時候可能確實是需要嚴格的順序保證。給大家舉個例子,你服務 A 呼叫服務 B,先插入再刪除。好,結果倆請求過去了,落在不同機器上,可能插入請求因為某些原因執行慢了一些,導致刪除請求先執行了,此時因為沒資料所以啥效果也沒有;結果這個時候插入請求過來了,好,資料插入進去了,那就尷尬了。

本來應該是 “先插入 -> 再刪除”,這條資料應該沒了,結果現在 “先刪除 -> 再插入”,資料還存在,最後你死都想不明白是怎麼回事。

所以這都是分散式系統一些很常見的問題。

面試題剖析

首先,一般來說,個人建議是,你們從業務邏輯上設計的這個系統最好是不需要這種順序性的保證,因為一旦引入順序性保障,比如使用分散式鎖,會導致系統複雜度上升,而且會帶來效率低下,熱點資料壓力過大等問題。

下面我給個我們用過的方案吧,簡單來說,首先你得用 dubbo 的一致性 hash 負載均衡策略,將比如某一個訂單 id 對應的請求都給分發到某個機器上去,接著就是在那個機器上因為可能還是多執行緒併發執行的,你可能得立即將某個訂單 id 對應的請求扔一個記憶體佇列裡去,強制排隊,這樣來確保他們的順序性。

「面試」分散式服務介面請求的順序性如何保證?

但是這樣引發的後續問題就很多,比如說要是某個訂單對應的請求特別多,造成某臺機器成熱點怎麼辦?解決這些問題又要開啟後續一連串的複雜技術方案……曾經這類問題弄的我們頭疼不已,所以,還是建議什麼呢?

最好是比如說剛才那種,一個訂單的插入和刪除操作,能不能合併成一個操作,就是一個刪除,或者是什麼,避免這種問題的產生。