防止消息进入 _error 队列(masstransit,rabbitmq)

Prevent messages from going into the _error queue (masstransit, rabbitmq)

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

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

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

非常感谢!

当消费者进程崩溃时,消息未被确认并保留在队列中,因此您的第一个场景无需执行任何操作。

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

暂时性故障

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

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

永久失败

有些邮件可能是有毒的,因此无论您重试多少次,它们都不会被处理。例如,如果您尝试在主键已经存在的 table 中插入一条记录。

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