天天看點

分布式事務-可靠消息最終一緻性

---沒有一種分布式事務解決方案能解決所有場景,也就是沒有一個完美的分布式事務解決方案,或者說每個分布式事務解決方案都有各自的使用場景。

 更多分享請關注我的公衆号

分布式事務-可靠消息最終一緻性

 一、定義

可靠消息最終一緻性(異步確定型):顧名思義,也就是沒有做到實時一緻性,而是異步最終一緻性。

        這裡要注意,不是因為可靠消息最終一緻性能做到分布式事務的功能,是以它就适合所有的場景,而是當業務适合用異步最終一緻性,才用可靠消息最終一緻性。

 二、案例

        比如當使用者下單後,給使用者獎勵,這個獎勵的實時性使用者不是很關心的,也就是延遲獎勵影響不大,隻要你最終保證能給使用者獎勵即可,這樣的場景就适合用可靠消息最終一緻性;但如果下單扣款場景,你的賬戶隻夠你下一個單,你先給使用者下單成功,扣款延遲,那等你扣款還沒成功,使用者又下了幾次單,判斷賬戶的錢都還沒扣都可以下單,那豈不是錢到時候扣款失敗,卻成功下了幾次單。

 三、實作方式

異步確定型通常是把消息發送到消息隊列異步處理,其實這裡主要是要保證消息隊列的消息可靠性,當然每種消息隊列有所不同,這裡隻以RabbitMQ為例。

方式1:其實也可以還是用表來保證可靠性,而不用消息隊列,最簡單但不夠友好的方式就是借用事務日志表,當消息的生産者處理完自己的業務後且把事務日志消息持久化到本地的資料庫事務日志表中且狀态為為消費,當消費者消費後,用一個定時任務去拉取消費者的消費業務狀态來修改生産者那邊的事務日志表狀态,如果消費者業務未成功,則重新發送消息到隊列給消費者消費。

分布式事務-可靠消息最終一緻性

方式2:發送消息到消息隊列需要保證消息的可靠性

這裡可以用持久化、發送确認、RabbitMQ的鏡像模式

,而消息的消費需要做重試,既然有重試,就要保證消費的幂等性。這裡其實就要在消息發送到隊列的時候生成一個全局唯一值或者根據業務是否資料本身就有唯一值字段可以借用的。

分布式事務-可靠消息最終一緻性

繼續閱讀