Ant*_*lev 21 transactions rabbitmq
想象一下情况:
var txn = new DatabaseTransaction();
var entry = txn.Database.Load<Entry>(id);
entry.Token = "123";
txn.Database.Update(entry);
PublishRabbitMqMessage(new EntryUpdatedMessage { ID = entry.ID });
// A bit more of processing
txn.Commit();
Run Code Online (Sandbox Code Playgroud)
现在,消费者EntryUpdatedMessage
可能会在提交事务之前获取此消息txn
,因此无法查看更新.
现在,我知道RabbitMQ本身就支持事务,但我们不能真正使用它们,因为我们IModel
为每个发布创建一个新的,并且在我们的场景(ASP.NET Web应用程序)中使用每线程模型非常麻烦.
我想到了在提交数据库事务时要发布的消息列表,但这是一个非常臭的解决方案.
处理这个问题的正确方法是什么?
Mik*_*low 44
RabbitMQ鼓励您使用发布者确认而不是交易.交易效果不佳.
在任何情况下,事务通常不能很好地与面向服务的体系结构一起工作.采用"最终一致"方法更好,可以在以后重试失败,并忽略重复的幂等消息.
在您的示例中,我将进行数据库更新并在发布消息之前提交它.当发布者确认返回时,我将更新数据库记录中的一个字段以指示该消息已被发送.然后,您可以稍后进行清扫程序,检查未发送的消息并将其发送给他们.如果消息确实通过,但由于某种原因确认或后续数据库写入失败,您将收到重复的消息.但这并不重要,因为你设计的信息是幂等的.
归档时间: |
|
查看次数: |
9479 次 |
最近记录: |