防止消息进入 _error 队列(masstransit,rabbitmq)
Prevent messages from going into the _error queue (masstransit, rabbitmq)
我成功地使用 MassTransit(与 RabbitMQ)实现了竞争消费者拓扑:我可以在队列中有 0 个或多个消费者,每个消费者一次预取和消费 1 条消息(经典负载平衡场景)。
为了处理可能的故障,我可以想象 2 种情况:
- 消费者崩溃(消息上没有 ACK)=> 如果没有其他消费者注册,消息将保留在队列中,或者传递给下一个 运行一个
- 消费者在处理数据时抛出异常 => 消息进入 _error 队列 -> 我可以避免这种情况吗?我希望在这种情况下,消息遵循与上述步骤相同的规则:如果没有其他消费者或被传递给 运行 一个(即使它是之前失败的那个),则保留在队列中。
MassTransit 可以吗?这是一个糟糕的策略吗?优雅地处理消费者内部的处理并且“从不”抛出会更好吗?
非常感谢!
当消费者进程崩溃时,消息未被确认并保留在队列中,因此您的第一个场景无需执行任何操作。
错误队列是毒消息队列的 MassTransit 实现。当消费者抛出时,有两种选择:
暂时性故障
当消费者尝试访问其他基础设施(如数据库)时出现暂时性故障(网络中断、数据库中断、超时等)。此类故障是可恢复的。 MassTransit 允许您配置 retry policies 以在消费者抛出异常时通过重新处理消息来处理特定异常。
当重试策略超过配置的重试次数或策略未处理异常时,将视为永久失败。
永久失败
有些邮件可能是有毒的,因此无论您重试多少次,它们都不会被处理。例如,如果您尝试在主键已经存在的 table 中插入一条记录。
必须将此类邮件移至病毒队列。否则,整个消息处理将在无限重试循环中停止。这就是为什么这些消息被称为毒消息,这就是毒消息队列存在的原因。您可以查看此队列以了解消息到达那里的原因,以及是否需要修复此消息的生产者或消费者以更好地处理消息。
我成功地使用 MassTransit(与 RabbitMQ)实现了竞争消费者拓扑:我可以在队列中有 0 个或多个消费者,每个消费者一次预取和消费 1 条消息(经典负载平衡场景)。
为了处理可能的故障,我可以想象 2 种情况:
- 消费者崩溃(消息上没有 ACK)=> 如果没有其他消费者注册,消息将保留在队列中,或者传递给下一个 运行一个
- 消费者在处理数据时抛出异常 => 消息进入 _error 队列 -> 我可以避免这种情况吗?我希望在这种情况下,消息遵循与上述步骤相同的规则:如果没有其他消费者或被传递给 运行 一个(即使它是之前失败的那个),则保留在队列中。
MassTransit 可以吗?这是一个糟糕的策略吗?优雅地处理消费者内部的处理并且“从不”抛出会更好吗?
非常感谢!
当消费者进程崩溃时,消息未被确认并保留在队列中,因此您的第一个场景无需执行任何操作。
错误队列是毒消息队列的 MassTransit 实现。当消费者抛出时,有两种选择:
暂时性故障
当消费者尝试访问其他基础设施(如数据库)时出现暂时性故障(网络中断、数据库中断、超时等)。此类故障是可恢复的。 MassTransit 允许您配置 retry policies 以在消费者抛出异常时通过重新处理消息来处理特定异常。
当重试策略超过配置的重试次数或策略未处理异常时,将视为永久失败。
永久失败
有些邮件可能是有毒的,因此无论您重试多少次,它们都不会被处理。例如,如果您尝试在主键已经存在的 table 中插入一条记录。
必须将此类邮件移至病毒队列。否则,整个消息处理将在无限重试循环中停止。这就是为什么这些消息被称为毒消息,这就是毒消息队列存在的原因。您可以查看此队列以了解消息到达那里的原因,以及是否需要修复此消息的生产者或消费者以更好地处理消息。