1.如果有A,B,C三個方法,A,B方法在同一個微服務,C方法在另外一個微服務
2.在A方法和B方法中間加入通知C的消息顯然是不科學的,因為B如果失敗了,C是不應該提交的
3.如果在A和B方法後面加上通知C的消息也不行,因為如果A,B一起提交失敗了,那麼C也是不應該通知的
4.把A和B放在同一個方法裡面,把通知C的放在一個方法裡面,A,B提交了之後再通知C是否可行呢
5.其實也是不行的,因為通知C可能會失敗啊,如果發送的通知失敗了,也是個問題
6.所以把通知放在A,B之前,先發送一個事務消息到rocketMq,rocketMq不會馬上通知C
7.等A,B成功執行了之後,再通知rocketMq,把這條事務消息處理了,那麼才會通知C
8.如果A,B成功執行之後,通知rocketMq的時候消息發送失敗了怎麼辦呢
9.這個時候rocketMq會有個查詢機制,查詢客戶端的事務有沒有提交,如果有提交那麼通知C
10.消息隊列解決分布式事務簡單有效,但是出現失敗的可能性比其他分布式事務的解決方案差點
11.消息隊列解決方案還有一種是記錄本地消息表,失敗一直重發,也可以解決分布式事務
12.比如充值的操作,錢已經到帳了,但是因為網絡的問題回調失敗,那麼可以用延時隊列實現多久重發
13.如果重發失敗了,繼續向隊列裡面寫數據,這種分布式解決方案時效太差,但是實現簡單