如何通过本地化事件正确实现微服务内部强一致性,事件总线跨微服务间最终一致性...
目錄
設計重點
流程圖
偽代碼
2.1. PublishEvent
2.2. SubscribeEvent
2.3. Publisher
2.4. Subscriber
微服務 強一致性
3.1 Publisher
3.2 Subscriber
事件總線 - 跨服務 最終一致性
4.1 Publisher & Subscriber 都開啟了本地事務,保證了強一致性
4.2 問題場景一:當 ③ 發布失敗怎么辦?
4.3 問題場景二:當 ③ 發布成功,但 ④ 更新事件狀態失敗怎么辦?
4.4 問題場景三:Publisher 端Ok,Subscriber 消費出錯
0. 設計重點
Publisher?本地化?PublishEvent?保證事件發布可靠性
Subscriber?本地化?SubscribeEvent?保證事件訂閱可靠性
SubscribeEvent?通過 EventId & HandlerType 組合約束 保證不重復消費事件
事件中央控制臺?處理?Publisher?&?Subscriber?事件重試
1. 執行流程圖
2. 偽代碼
2.1 PublishEvent
2.2 SubscribeEvent
2.3 Publisher
2.4 Subscriber
3. 微服務 強一致性
3.1 Publisher
開啟本地事務達到強一致性
執行本地業務代碼
本地事務內部保存事件?預發布?狀態?②
發布事件到事件總線?③
修改事件發布狀態為已發布?④
3.2 Subscriber
開啟本地事務達到強一致性
執行本地業務代碼
保存訂閱事件到本地倉庫
4 事件總線 - 跨服務 最終一致性
4.1 Publisher & Subscriber 都開啟了本地事務,保證了強一致性
4.2 問題場景一:當 ③ 發布失敗怎么辦?
③?發布失敗,意味著拋出異常,則?④?不執行,那么事件狀態依然保持?預發布狀態
后續?事件重試?重新發布該事件,并更新事件狀態為?已發布
4.3 問題場景二:當 ③ 發布成功,但 ④ 更新事件狀態失敗怎么辦?
4.3.1 場景二·一 Subscriber 訂閱成功
③?發布成功,但?④?更新事件狀態失敗,事件狀態依然是?預發布狀態
Subscriber?訂閱到該事件后成功執行完業務代碼
Subscriber?將訂閱事件保存到本地訂閱事件倉庫?⑤
該場景存在的問題:?Publisher?會通過?事件重試?再次發布?預發布?狀態的事件,那么此時Subscriber?將重復消費該事件
方案:該問題我們可以通過將?SubscribeEvent?EventId & HandlerType 組合唯一約束,來避免重復消費
4.3.2 場景二·二 Subscriber 訂閱失敗
③?發布成功,但?④?更新事件狀態失敗,事件狀態依然是?預發布狀態
Subscriber?執行消費失敗
Subscriber?回滾本地事務
該場景不存在任何問題,因為?Publisher?會通過?事件重試?再次發布?預發布?狀態的事件 。
4.4 問題場景三:Publisher 端Ok,Subscriber 消費出錯
Publisher?端處理順利
Subscriber?消費失敗,回滾本地事務,此時?SubscribeEvent?未存儲到本地倉庫
該場景存在的問題:
Publisher?發送成功,并且本地?PublishEvent?事件為已發布,那么意味著從Publisher端是無法知道Subscriber消費失敗需要重新消費
解決方案:
通過檢測?PublishEvent?&?SubscribeEvent?獲得需要?事件重試?的?PublishEvent
將?PublishEvent?重新發布?到?Subscriber
5. 通過Nuget安裝組件支持以上編程模型
Install-Package SmartEventBus.RabbitMQImpl Install-Package SmartEventBus.Repository6. ORM:SmartSql 廣而告之
SmartSql = Dapper + MyBatis + Cache(Memory | Redis) + ZooKeeper + R/W Splitting + ......
作者:Ahoo Wang (阿虎)
Github:?https://github.com/Ahoo-Wang/
SmartSql(高性能、高生產力,超輕量級的ORM!):?https://github.com/Ahoo-Wang/SmartSql
SmartCode(不只是代碼生成器!):?https://github.com/Ahoo-Wang/SmartCode
原文地址:https://www.cnblogs.com/Ahoo-Wang/p/micoservice-eventbus.html
.NET社區新聞,深度好文,歡迎訪問公眾號文章匯總 http://www.csharpkit.com
總結
以上是生活随笔為你收集整理的如何通过本地化事件正确实现微服务内部强一致性,事件总线跨微服务间最终一致性...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Visual Studio 2017 1
- 下一篇: 干货!请码住——点此领取免费开源框架