microservices - 微服务 - 在事务中持久化到 RDBMS 和队列
问题描述
我有一个 REST 服务——它的所有请求都保存到它自己的关系数据库中。到目前为止,很好。但是,还有一个小型企业功能(电子邮件通知、短信警报)应该在新接收/更新的数据上运行。为了让这个过程在后台处理数据,它需要某种方式来了解持久化的数据——消息队列可以解决这个问题。我看到设计这个的三种常见方式,
REST 服务插入到数据库中,也发布到队列中。
- 这里的问题是,分布式事务 - 在一个事务中组合不同的类型 - 关系数据库和队列。有些工具可能支持,有些可能不支持。
像往常一样,REST 服务只保留到它的数据库中。此外,它还将数据插入到另一个表中,计划作业查询到该表,将它们发布到队列(后台作业应该从该队列开始工作)。
- 我看到的问题是调度程序 - 不是反应式的,批处理,受时隙限制,不是实时的,慢的等等。
REST 端点将数据直接发布到
topic
. 一个消费者将它持久化到数据库中,而另一个在后台处理它。- 类似事件外包的东西。TMU,随着服务数量的增长,实现起来有点复杂。此外,如果数据库关闭,持久服务将无法保存数据,但是后台服务(例如,电子邮件)会发送功能错误的电子邮件。这可能会导致服务和功能之间的不一致。
我也想过阅读数据库transaction-logs
,但它似乎更复杂,需要配置工具才能使其工作,而且,它似乎更适合数据处理系统而不是我们的用例。
你对此有何看法——我错过了什么吗?你如何管理这样的场景?应该寻找什么?思考反应,说Vertx
?
抱歉,如果这看起来很幼稚,但我不得不问。
解决方案
我认为最好的方法是 2 使用像 debezium 这样的 CDC(变更数据捕获)系统。
请参阅 [ https://microservices.io/patterns/data/transactional-outbox.html][1]
推荐阅读
- mongodb - 如何将flutter与MongoDB连接起来
- windows-10 - Sublime3 - 在 Windows 中执行 python 脚本时找不到指定的文件
- swift - Spritekit:如何将玩家移动限制在某些瓷砖上
- excel - 如何根据用户值突出显示范围内特定数量的单元格
- c# - Kentico - AsyncWorker(运行任务)
- java - 如何为商店的数字秤创建一个安卓应用程序
- c - LRS使用C程序
- java - 如何在 TypeScript 中定义结构?
- angular - ngx-gallery:如何获取活动图像?
- flutter - 在 Flutter 中手动设置语言(flutter_localizations)