在模式隔离的多租户应用程序中设计/实现事务发件箱模式

Design / Implement Transactional Outbox pattern in schema isolated multitenant application

我有一个多租户应用程序。租户数据是基于模式隔离的。

我想实现一个事务性发件箱模式,我想将事件存储在 table(在同一事务中)中,然后稍后通过作业发送事件。

我计划将事件 table 保留在每个租户架构中,以便可以在同一事务中对其进行更新。我无法将事件 table 保留在公共(应用程序)模式中,因为这样我就无法在同一事务中更新 table...

现在我的问题是作业(基于 quartz/spring)如何知道需要检查哪些所有模式的事件?可以有多个没有要处理的事件的租户模式。

如果您正在实施发件箱模式,跟踪每个模式中的所有事件 table 是一项繁琐的工作。

这是一个更好的发件箱模式:https://betterprogramming.pub/an-alternative-to-outbox-pattern-7564562843ae

在 2-phase 消息中,无需维护 cron 作业来检查事件。相反,您编写 check-back 服务,其中 return 本地事务是否已提交。当DTM无法判断本地事务是否已经提交时,会调用check-back服务。

原理是,所有进行中的交易都记录在DTM服务器中,服务器中有cron作业会检查交易的超时时间。当超时发生时,DTM服务器会回调check-back服务来判断本地事务是否已经提交。

2 阶段消息比发件箱简单得多,并且需要的代码少得多。

一种方法是用 CDC 替换 cron 作业(MySQL 的 bin 日志)。您可以在 CDC 处理程序中完成整个处理过程,也可以使用它来更新某些中央 table 以跟踪哪个租户有新消息。