.net-core - 实体状态更改时向主题发送消息的模式
问题描述
当我们的应用程序中的某个实体更改为某个状态时,我们使用 Azure 服务总线通知订阅者。现在我们在调用 dbContext.SaveChangesAsync() 之后立即执行此操作:
dbContext.SaveChangesAsync()
topicClient.SendAsync(someMessage)
我遇到的问题是:假设 dbContext.SaveChangesAsync() 运行良好,但无论出于何种原因,对 topicClient.SendAsync() 的调用都会引发异常。现在,该主题的订阅者将不会知道实体的状态变化。
我尝试使用 TransactionScope,但这不起作用,因为据我所知,Azure 不使用 DTC。
(我可以切换上述两个步骤的顺序,但是如果消息发送正常并且保存失败,则消息包含虚假数据。)
有没有人对如何处理这个问题有任何建议?这似乎应该是常见的,但我在网上找不到任何东西。如果有人能指出我正确的方向,我将不胜感激。
先感谢您。
解决方案
正如您所概述的,操作顺序无关紧要,因为在数据库和消息传递服务这两个服务之间没有重叠事务。如果您使用的数据存储支持事务(例如 Azure SQL 服务器),您无需使用两阶段提交就可以逃脱,并考虑实施发件箱模式。
NServiceBus 将模式作为一项功能提供。您可以下载显示如何将它与 RabbitMQ 一起使用的发件箱示例。可以用Azure 服务总线传输替换传输以满足您的要求。
披露:我为 NServiceBus 做出了贡献。
推荐阅读
- database - 如何在 intellij Idea 从数据库生成 java pojos
- jmeter - 有没有办法使用 BeanShell PostProcessor 在 jmeter 中添加 java 脚本
- r - 如何创建一个以 30 分钟间隔为一年的日期时间数据的 24 小时窗口,并平均每 30 分钟间隔内的出现次数
- c++ - 使用 typedef 声明函数有什么意义?
- grpc - 如何在 Asylo 的 GrPC 服务器配置中写入服务器地址?
- android - 如何在 android 设备和 python 脚本之间建立通信?
- python - 如何根据来自发布请求的 URL 的 ID 创建具有 FK 字段的 Django 模型?
- perl - 如何将 perl 安装到 /usr/local/bin
- node.js - 无法更新基本查看器的 Revit 模型
- python - 如何使用 functools 和 queues 中的 Pools、Partial