日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

如何通过本地化事件正确实现微服务内部强一致性,事件总线跨微服务间最终一致性...

發布時間:2023/12/4 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何通过本地化事件正确实现微服务内部强一致性,事件总线跨微服务间最终一致性... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

  • 設計重點

  • 流程圖

  • 偽代碼
    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.Repository

    6. 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

    總結

    以上是生活随笔為你收集整理的如何通过本地化事件正确实现微服务内部强一致性,事件总线跨微服务间最终一致性...的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。