【问题标题】:RabbitMQ & Spring amqp retry without blocking consumersRabbitMQ 和 Spring amqp 重试而不阻塞消费者
【发布时间】:2014-08-19 02:02:08
【问题描述】:

我正在使用 RabbitMQ 和 Spring amqp,我不希望丢失消息。通过使用指数回退策略进行重试,我可能会阻止我的消费者,他们可能正在处理他们可以处理的消息。我想给失败的消息几天以使用指数回退策略重试,但我不希望消费者阻止几天,我希望它继续处理其他消息。

我知道我们可以使用 ActiveMQ(Retrying messages at some point in the future (ActiveMQ)) 实现这种功能,但找不到用于 RabbitMQ 的类似解决方案。

有没有办法通过 Spring amqp 和 RabbitMQ 实现这一目标?

【问题讨论】:

    标签: rabbitmq spring-amqp spring-retry


    【解决方案1】:

    您可以通过死信交换来做到这一点。拒绝消息并将其路由到 DLE/DLQ,并拥有一个单独的侦听器容器,该容器从 DLQ 消费并根据需要停止/启动该容器。

    或者,您可以使用RabbitTemplatereceive(或receiveAndConvert)方法(按计划)轮询DLQ,而不是第二个容器,并将失败的消息路由回主队列。

    【讨论】:

    • 我更倾向于后一种解决方案。但在我的情况下,我只想在它是一个可重试的异常时重试,其他我会通过自定义恢复器将它们移动到 DLQ。当我轮询 DLQ 时,我会对那些由于可重试异常而失败的消息感兴趣。