分布式服務接口請求的順序性如何保證?


問題

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

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

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

剖析

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

  下面我給個我們用過的方案吧,簡單來說,首先你得用 dubbo 的一致性 hash 負載均衡策略,將比如某一個訂單 id 對應的請求都給分發到某個機器上去(及需要保證順序性的操作請求放到一個機器去處理),接着就是在那個機器上因為可能還是多線程並發執行的,你可能得立即將某個訂單 id 對應的請求扔一個內存隊列里去,強制排隊,這樣來確保他們的順序性

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

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

 

 出處:https://github.com/doocs/advanced-java/blob/master/docs/distributed-system/distributed-system-request-sequence.md


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM