我有以下情况:
一个端点处理消息,并且消息处理将记录写入Azure SQL DB。 (这是本地内部端点)。在此之后,会发布一条事件,表明此记录已保存。 第二个端点接收该事件并从数据库中读取记录并自行完成。第一个端点是事务性的,因此应该是DB写入和事件发布都应该在同一个事务范围内发生。
现在有时会出现问题,即第二个端点找不到逻辑应该存在的记录。它在FLR中失败,但设法在SLR中恢复。
这只发生在我们的生产环境中,有时只会发生。我试图在本地重现这个没有任何成功,我有点迷失。任何人都面临类似的问题,可以分享一些见解?
答案 0 :(得分:0)
您使用什么交通工具?您是否在端点读/写SQL Azure DB的Azure VM上使用MSMQ?我认为这就是这种情况。
你提到第一个终点是交易性的。您的解决方案会创建两个单独的事务:
由于SQL Azure无法参与分布式事务,因此这些事务是分开的,不组合在一起。
您必须确保在MSMQ事务之前提交SQL Azure数据库事务,并且您的端点正在处理幂等消息。
目前尚不清楚订户为何成功进行单反。这没有多大意义。我只能假设在事件消息已经发送时尚未提交数据库事务,以便订阅者在提交数据之前尝试读取它。
我建议您进行以下细分:
这可确保在提交数据之前,任何订阅者都无法处理事件消息。
当事件在读取原始事件的同一事务中发送时,不会发生这种情况,因此请求检查端点上是否禁用了事务。