【问题标题】:Prevent messages from going into the _error queue (masstransit, rabbitmq)防止消息进入 _error 队列(masstransit、rabbitmq)
【发布时间】:2021-11-20 08:22:17
【问题描述】:

我成功地使用 MassTransit(与 RabbitMQ)实现了竞争消费者拓扑:我可以在一个队列中有 0 个或多个消费者,每个消费者一次只预取和消费 1 条消息(经典负载平衡场景)。

为了处理可能的故障,我可以想象两种情况:

  • 消费者崩溃(消息上没有 ACK)=>如果没有其他消费者注册,消息将保留在队列中,或者传递给下一个正在运行的消费者
  • 消费者在处理数据时抛出异常 => 消息进入 _error 队列 -> 我可以避免这种情况吗?我希望在这种情况下,消息遵循与上述步骤相同的规则:如果没有其他消费者或被传递给正在运行的消费者(即使它是之前失败的消费者),则保留在队列中。

MassTransit 可以做到这一点吗?这是一个糟糕的策略吗?优雅地处理消费者内部的处理并“从不”抛出会更好吗?

非常感谢!

【问题讨论】:

    标签: rabbitmq load-balancing masstransit


    【解决方案1】:

    当消费者进程崩溃时,消息不会被确认并停留在队列中,因此对于您的第一个场景没有什么可做的。

    错误队列是有毒消息队列的 MassTransit 实现。当消费者抛出时,有两种选择:

    暂时性故障

    当消费者尝试访问其他基础设施时出现瞬时故障,例如数据库(网络故障、数据库故障、超时等)。此类故障是可以恢复的。 MassTransit 允许您配置retry policies 以在消费者抛出异常时通过重新处理消息来处理特定异常。

    当重试策略超过配置的重试次数或策略未处理异常时,失败被认为是永久性的。

    永久故障

    有些消息可能有毒,因此无论您重试多少次,它们都不会被处理。例如,如果您尝试在具有主键的表中插入一条记录。

    此类消息必须移至毒物队列。否则,整个消息处理将在无限重试循环中停止。这就是为什么这些消息被称为毒消息,这就是毒消息队列存在的原因。您可以查看此队列以了解消息到达那里的原因,以及是否需要修复此消息的生产者或消费者以更好地处理消息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-09
      • 1970-01-01
      相关资源
      最近更新 更多