引入 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.mzph.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.为平台讲解栅格计算器的…