【问题标题】:Spring Boot + RabbitMQ messages lost on delayed exchangeSpring Boot + RabbitMQ 消息在延迟交换时丢失
【发布时间】:2021-11-10 14:19:55
【问题描述】:

我正在使用 spring boot convertAndSend() 在延迟交换上发布消息,但该消息从未在队列上发布,也没有引发任何异常

【问题讨论】:

  • 检查消息是否进入延迟交换。您可以在管理界面 -> Exchanges 中看到这一点。您还可以检查“未路由丢弃”指标,看看它是否无法路由。
  • 由于某种原因,因为我使用延迟交换,所有消息都被标记为未路由。另一方面,我不会丢失每种情况下的消息,我有一个重试机制,可以用新的尝试次数重新排队消息

标签: java spring spring-boot rabbitmq spring-rabbit


【解决方案1】:

永远不会在队列上发布,也不会抛出任何异常

当系统想要通过消息代理进行通信时,开发人员需要清楚地了解传递语义。首先需要知道是否以及多久将消息传递给代理(和潜在消费者):

  1. 最多一次 - 消息最多发送一次,但也根本不发送。
  2. 至少一次 - 消息保证会送达,但可以多次送达。
  3. Exactly once - 保证消息只传递一次。

您的消息丢失的原因可能是因为您使用了at most once 语义。

如果你遵循这个guide,你可以配置at least once传递语义

这能解决您的问题吗?在 cmets 中告诉我。

【讨论】:

  • 不是我添加了发布者确认和发布者返回,但我仍然丢失消息而没有任何错误