引入 DTM 以支持 ABP 的多租戶多數據庫場景

這篇文章分享了使用 DTM 二階段消息模式解決?issue #10036?的方法。

今天我們要使用 EasyAbp 的?Abp.EventBus.Boxes.Dtm?模塊。

DTM 事件箱的介紹

這個模塊使用了 DTM 的?二階段消息?使得 ABP 的事件箱得以支持?多租戶多數據庫場景。

你需要先閱讀?DTM 文檔,它將幫助你理解這個模塊。

與 ABP 默認事件箱的差異


DTM 二階段消息事件箱ABP 5.0+ 默認事件箱
收發速度???
更少的數據傳輸???
保證事件發出
(事務工作單元)
????
保證事件發出
(非事務工作單元)
???
(要求消費端解決冪等)
不要求消費端解決冪等????
支持多租戶多數據庫???
沒有增加外部設施???
管理面板和報警???

DTM 發件箱是如何工作的?

假設你正在使用發件箱發布新的事件:

await _distributedEventBus.PublishAsync(eto1, useOutbox: true);await _distributedEventBus.PublishAsync(eto2, useOutbox: true);  // useOutbox 的默認值即 true

DTM 發件箱會臨時存儲這些事件。接下來我們看看,在你完成當前工作單元時它會怎么做:

// UnitOfWork.cs 的代碼片段protected override async Task CommitTransactionsAsync()
{    // 第 1 步:在事務內插入一條記錄到 DTM 屏障表,接著發送一條“prepare”請求到 DTM 服務器await DtmMessageManager.InsertBarriersAndPrepareAsync(EventBag);    // 第 2 步: 提交當前 DB 事務await base.CommitTransactionsAsync();    // 第 3 步: 發送一條"submit"請求到 DTM 服務器OnCompleted(async () => await DtmMessageManager.SubmitAsync(EventBag));
}

至此,DTM 服務器已經收到了一條“submit”請求。它會調用 app 的?PublishEvents?服務并附上所有事件的數據,后者被調用后會立即發布這些事件到 MQ。

aaea892186d6f475730616b70672f34f.png

查看更詳細的時序圖

如果你依然對這個模式“如何確保發送”困惑,請查看 DTM 的?二階段消息文檔?以了解更多。

DTM 收件箱是如何工作的?

與 ABP 的默認實現不同,DTM 收件箱從 MQ 收到一個事件后會立即處理(handle)。在所有的 handler 完成他們的工作后,收件箱會沿用當前事務,向 DTM 屏障表插入一條記錄。最后它提交了事務并向 MQ 返回 ACK。

所有入箱的事件都擁有一條唯一的 MessageId。擁有相同 MessageId 的事件只會被處理一次,因為我們不能插入 gid (MessageId) 重復的記錄到 DTM 屏障表。

bcb563aee5dbaaf1ba45153ecb89e531.png

查看更詳細的時序圖

正如你注意到的,DTM 服務器沒有參與收件箱的工作。🤭

安裝和使用

請閱讀?https://github.com/EasyAbp/Abp.EventBus.Boxes.Dtm/tree/main#installation.

后記

這樣的一個 DTM 事件箱實現并不是完美的解決方案。這里最大的成本是,你需要額外關心 DTM 服務器的可用性。但是如果你遇到了多租戶多數據庫的場景,它就是現在最佳的選擇。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/286561.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/286561.shtml
英文地址,請注明出處:http://en.pswp.cn/news/286561.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【前端就業課 第一階段】HTML5 零基礎到實戰(六)表格詳解

注意:手機(APP)打開,內容顯示更佳,不會的私聊博主即可 想要拿代碼或加入學習計劃(** 博主會監督你并且教你寫文章 **)的拉到最下面(PC端Web打開)加博主即可,目…

PHP中file_put_contents()函數的兼容性問題

PHP中file_put_contents()函數的兼容性問題 file_put_contents()函數就相當于依次使用fopen(),fwrite()和fclose(),真是個令人愉快的函數。我的第一個PHP小腳本中用到了這個函數,本地運行很正常,放到服務器上去之后點擊submit按鈕…

Android實戰:手把手實現“捧腹網”APP(一)-----捧腹網網頁分析、數據獲取

“捧腹網”頁面結構分析捧腹網M站地址: http://m.pengfu.com/捧腹網M站部分截圖: 從截圖中(可以直接去網站看下),我們可以看出,該網站相對簡單,一共分為四個模塊:最新笑話、捧腹段子、趣圖、神…

專題2-通過按鍵玩中斷\第1課-中斷處理流程深度剖析-lesson1

中斷概念 1、中斷生命周期 串口先產生一個事件,該事件傳送到中斷控制器里面,中斷控制器會進行相應過濾,能通過過濾,那么就交給CPU去處理。 2、中斷源 2440芯片手冊 6410芯片手冊 3、中斷過濾 4、中斷處理 cpu處理方式有兩種&#…

Android之okdownload下載提示奔潰Expected URL scheme ‘http‘ or ‘https‘ but was ‘data‘

1 問題 客戶現場奔潰在firebase上面提示錯誤信息如下 Fatal Exception: java.lang.IllegalArgumentException: Expected URL scheme http or https but was dataat okhttp3.t$a.a(HttpUrl.kt:38)at okhttp3.t$b.b(HttpUrl.kt:8)at okhttp3.y$a.b(Request.kt:5)at com.liulish…

mysql語法學習(一)__Instances__表

2019獨角獸企業重金招聘Python工程師標準>>> ---建表 CREATE TABLE temp( id INT ); ----查詢表 SELECT * FROM temp_t; ---刪表 DROP TABLE temp; ---修改表名 ALTER TABLE temp_tt RENAME temp; ALTER TABLE temp RENAME TO temp_t; ALTER TABLE temp RENAME AS t…

【ArcGIS遇上Python】python批量獲取柵格數據四至(top,bottom,left,right)坐標代碼

上圖所示為ArcGIS自帶的影像數據,存放路徑為C:\Program Files (x86)\ArcGIS\Desktop10.6\ArcGlobeData\wsiearth.tif",在源中可以查看該數據的四至坐標,那么,怎樣用python批量獲取多個柵格數據的四至坐標呢? 參考閱讀:【ArcGIS風暴】ArcGIS求一個矢量圖層中多個圖斑…

使用 C# 讀取 zip 壓縮包解壓文件的方法及注意事項

從 .NET Framework 4.5 版本開始,微軟為 .NET 類庫增加了一個名為 ZipFile 的類型。該類型在 System.IO.Compression 命名空間下,提供創建、解壓縮和打開 zip 存檔的靜態方法。若要在 .NET Framework 應用中使用 ZipFile 類,必須添加對程序集…

CenterOS x64安裝serv-U

1、下載serv-Usu - root cd / cd /src wget http://www.rhinosoft.com.cn/download/14.0.1.0/SU-MFTS-Linux-64bit.zip # 64bit下載地址wget http://www.rhinosoft.com.cn/download/14.0.1.0/SU-MFTS-Linux-32bit.zip # 32bit下載地址2、解壓serv-U安裝包unzip SU-MF…

Android實戰:手把手實現“捧腹網”APP(二)-----捧腹APP原型設計、實現框架選取

APP原型設計在APP的開發過程中,原型設計是必不可少的。用戶界面原型必須在先啟階段的初期或在精化階段一開始建立。整個系統(包括它的“實際”用戶界面)的分析、設計和實施必須在原型建立后進行。 如何設計“捧腹網”APP呢?我們先…

【前端就業課 第一階段】HTML5 零基礎到實戰(七)文字及圖片詳解

注意:手機(APP)打開,內容顯示更佳,不會的私聊博主即可 想要拿代碼或加入學習計劃(** 博主會監督你并且教你寫文章 **)的拉到最下面(PC端Web打開)加博主即可,目…

自定義桌面右鍵菜單

一 編寫自定義右鍵菜單要執行的程序 只要是在 Windows 平臺上的可執行應用程序即可。 二 修改注冊表添加自定義右鍵菜單 添加位置如下: HKEY_CLASSES_ROOT\Directory\Background\shell 如下圖:轉載于:https://www.cnblogs.com/jRoger/articles/5799664.h…

Android之giide加載失敗提示You can‘t start or clear loads in RequestListener or Target callbacks If you‘re t

1 問題 用glide進行加載視頻數據的時候,加載錯誤了再用glide進行加載一次,代碼如下 var iv = helper.getView<ImageView>(R.id.download_iv)iv?.let {val transform = RoundedCornersTransform(mContext, UnitUtils.dip2px(mContext, 12.toFloat()).toFloat())transf…

本地工程提交github

1. 首先在github上創建一個新的Repository 2. 在本地windows機器上裝上git 3. 建立一個文件夾&#xff0c;以后就用這個文件夾作為與Repository對應的庫文件夾 4. 輸入一下命令&#xff0c;建立文件夾與Repository的連接關系 touch README.md git init git add README.md git c…

【ArcGIS遇上Python】ArcGIS python計算長時間序列多個柵格數據的平均值

通常&#xff0c;我們需要將多個柵格求平均&#xff0c;例如&#xff0c;將一年中每個月的NDVI值加起來除以12&#xff0c;就會等到月均NDVI&#xff0c;該過程雖然在柵格計算器中可以實現&#xff0c;但是當時間序列較長時就比較費事&#xff0c;此時&#xff0c;python代碼是…

統信 Deepin為什么要擺脫Ubuntu和Debian?

文 | 大東出品 | OSC開源社區&#xff08;ID&#xff1a;oschina2013&#xff09;Deepin 出走 Debian 。近日&#xff0c;統信軟件宣布旗下 Linux 社區發行版 Deepin 將脫離上游 Debian&#xff0c;從 Linux Kernel 開始構建的新聞在社區引發了熱議。其實早在 7 年前&#xff0…

解決筆記本重裝問題(VISTA系統改為XP系統)

今天一位同事要我幫她的上網本重裝一下系統&#xff0c;經查看發現只是開機后一個出錯問題&#xff0c;是安裝酷狗軟件引起的&#xff0c;用360軟件管家徹底刪除就行了。這時&#xff0c;老大拿了一臺筆記本過來讓我幫忙裝XP操作系統&#xff0c;嘿~這下我的桌子擺滿了電腦&…

Android實戰:手把手實現“捧腹網”APP(三)-----UI實現,邏輯實現

APP頁面實現根據原型圖&#xff0c;我們可以看出&#xff0c;UI分為兩部分&#xff0c;底部Tab導航上方列表顯示。 所以此處&#xff0c;我們通過 FragmentTabHostFragment&#xff0c;來實現底部的導航頁面&#xff0c;通過RecyclerView來實現列表頁面。 因為篇幅原因&#xf…

【前端就業課 第一階段】HTML5 零基礎到實戰(八)表單詳解

注意&#xff1a;手機&#xff08;APP&#xff09;打開&#xff0c;內容顯示更佳&#xff0c;不會的私聊博主即可 想要拿代碼或加入學習計劃&#xff08;** 博主會監督你并且教你寫文章 **&#xff09;的拉到最下面&#xff08;PC端Web打開&#xff09;加博主即可&#xff0c;目…

【ArcGIS遇上Python】ArcGIS10.6 python批量將柵格中的特定值替換Setnull為NoData

案例一: 如下圖所示為蘭州市dem,將圖一中高程大于1600m的像元值設置為無效(Setnull)之后的效果如圖二所示。 實現過程: 柵格計算器參考文章:《【ArcGIS風暴】ArcGIS 10.2柵格計算器實用公式大全(經典珍藏版)》,該文章中主要以ArcGIS102.為平臺講解柵格計算器的…