首页 > 解决方案 > 实体状态更改时向主题发送消息的模式

问题描述

当我们的应用程序中的某个实体更改为某个状态时,我们使用 Azure 服务总线通知订阅者。现在我们在调用 dbContext.SaveChangesAsync() 之后立即执行此操作:

  1. dbContext.SaveChangesAsync()

  2. topicClient.SendAsync(someMessage)

我遇到的问题是:假设 dbContext.SaveChangesAsync() 运行良好,但无论出于何种原因,对 topicClient.SendAsync() 的调用都会引发异常。现在,该主题的订阅者将不会知道实体的状态变化。

我尝试使用 TransactionScope,但这不起作用,因为据我所知,Azure 不使用 DTC。

(我可以切换上述两个步骤的顺序,但是如果消息发送正常并且保存失败,则消息包含虚假数据。)

有没有人对如何处理这个问题有任何建议?这似乎应该是常见的,但我在网上找不到任何东西。如果有人能指出我正确的方向,我将不胜感激。

先感谢您。

标签: .net-coreentity-framework-coreazureservicebusazure-servicebus-topics

解决方案


正如您所概述的,操作顺序无关紧要,因为在数据库和消息传递服务这两个服务之间没有重叠事务。如果您使用的数据存储支持事务(例如 Azure SQL 服务器),您无需使用两阶段提交就可以逃脱,并考虑实施发件箱模式

NServiceBus 将模式作为一项功能提供。您可以下载显示如何将它与 RabbitMQ 一起使用的发件箱示例。可以用Azure 服务总线传输替换传输以满足您的要求。

披露:我为 NServiceBus 做出了贡献。


推荐阅读