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

消息从队列队列中消耗(每个Websocket连接1个),并且当我们通过Websocket收到已收到消息的确认消息时,消费者将对其进行确认(因此我们可以重新排队未在可接受的时间范围内发送的消息)。这是以非阻塞方式完成的。

99%的情况下,它运行良好,但是偶尔我们会收到错误消息“RabbitMQ PRECONDITION_FAILED-未知的交付标签”。这将关闭 channel 。以我的理解,此异常是以下情况之一的结果:

  • 消息已经被确认或拒绝。
  • 尝试通过未传递消息的 channel 进行确认。
  • 消息超时(ttl)过期后,尝试进行确认。

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

    我意识到有许多实现细节可能会影响这一点,但是从概念上讲,还有其他我们尚未考虑并应处理的失败案例吗?还是有更好的方法来实现上述功能?

    最佳答案

    “PRECONDITION_FAILED-未知的传递标签”通常是由于两次确认,在错误的 channel 上确认或不应该确认的消息确认而发生的。

    因此,在相同情况下,您想执行两次basic.ack或使用另一个 channel 执行basic.ack

    09-25 17:38
    查看更多