【问题标题】:Integrating RabbitMQ with database transactions将 RabbitMQ 与数据库事务集成
【发布时间】:2013-07-22 12:26:19
【问题描述】:

想象一下情况:

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();

现在EntryUpdatedMessage 的使用者可能会在事务txn 提交之前收到此消息,因此将无法看到更新。

现在,我知道 RabbitMQ 本身确实支持事务,但我们不能真正使用它们,因为我们为每次发布创建一个新的 IModel 并且在我们的场景中拥有每个线程模型确实很麻烦(ASP.NET web应用程序)。

我想过在提交数据库事务时发布一个消息列表,但这是一个非常糟糕的解决方案。

处理这个问题的正确方法是什么?

【问题讨论】:

    标签: transactions rabbitmq


    【解决方案1】:

    RabbitMQ 鼓励您使用发布者确认而不是事务。交易表现不佳。

    无论如何,事务在面向服务的架构中通常不能很好地工作。最好采用“最终一致”的方法,这样可以在以后重试失败并忽略重复的幂等消息。

    在您的示例中,我会在发布消息之前更新并提交数据库。当发布者确认返回时,我将更新数据库记录中的一个字段以指示消息已发送。然后,您可以稍后进行清扫程序,检查未发送的消息并在途中发送它们。如果消息确实通过了,但由于某种原因确认或后续数据库写入失败,您将收到重复消息。但这无关紧要,因为您已将消息设计为幂等的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-11
      • 1970-01-01
      • 2023-03-15
      • 2021-09-26
      • 1970-01-01
      • 1970-01-01
      • 2019-08-16
      • 1970-01-01
      相关资源
      最近更新 更多