RabbitMQ PRECONDITION_FAILED - 未知的交付标签

新手上路,请多包涵

我们有一个 PHP 应用程序,它通过 WebSocket 连接将消息从 RabbitMQ 转发到连接的设备(PHP AMQP pecl 扩展 v1.7.1 和 RabbitMQ 3.6.6)。

消息从一组队列中使用(每个 websocket 连接一个),并在我们通过 websocket 收到消息已收到的确认时由消费者确认(因此我们可以重新排队未在可接受的时间范围内传递的消息)。这是以非阻塞方式完成的。

在 99% 的情况下,这工作得很好,但偶尔我们会收到错误“RabbitMQ PRECONDITION_FAILED - 未知的交付标签”。这将关闭通道。据我了解,此异常是以下情况之一的结果:

  1. 该消息 被确认或拒绝。
  2. 尝试通过未传递消息的通道进行确认。
  3. 在消息超时 (ttl) 到期后尝试确认。

我们已针对上述每种情况实施了保护措施,但问题仍然存在。

我意识到有许多实施细节可能会影响这一点,但在概念层面上,是否还有我们没有考虑但应该处理的其他失败案例?还是有更好的方法来实现上述功能?

原文由 Matt Renner 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1k
2 个回答

“PRECONDITION_FAILED - unknown delivery tag”通常是由于双重确认、在错误的频道上确认或确认不应确认的消息而发生。

所以在同样的情况下你要执行 basic.ack 两次或 basic.ack 使用另一个通道

原文由 Gabriele Santomaggio 发布,翻译遵循 CC BY-SA 3.0 许可协议

(下面的解决方案)

从他的博客中引用 Jan Grzegorowski:

如果您正在为本文标题中包含的 406 错误消息而苦恼,您可能有兴趣阅读整个故事。

问题

我使用 amqplib 将基于 NodeJS 的消息处理器与 RabbitMQ 代理连接起来。一切似乎都工作正常,但有时 406 (PRECONDINTION-FAILED) 消息会出现在日志中:

 "Error: Channel closed by server: 406 (PRECONDITION-FAILED) with message "PRECONDITION_FAILED - unknown delivery tag 1"

解决方案 <–

保持简单:

  • 您必须在消息到达您的系统时以相同的顺序确认消息
  • 你不能在不同的频道上确认消息,如果你违反了这些规则中的任何一条,你将面临 406 (PRECONDITION-FAILED) 错误消息。

原答案

原文由 Mercury 发布,翻译遵循 CC BY-SA 4.0 许可协议

推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏