RabbitMQ PRECONDITION_FAILED - 未知的交付标签
我们有一个PHP应用程序,它通过WebSocket连接将消息从RabbitMQ转发到连接的设备(PHP AMQP pecl扩展v1.7.1和RabbitMQ 3.6.6)。
消息从队列数组(每个 websocket 连接 1 个)使用,当我们通过 websocket 收到消息已接收的确认时,使用者会确认消息(因此我们可以将未在可接受的时间范围内传递的消息重新排队)。这是以非阻塞方式完成的。
99%的情况下,这很完美,但偶尔我们会收到错误“RabbitMQ PRECONDITION_FAILED - 未知的交付标签”。这将关闭通道。在我的理解中,此异常是以下条件之一的结果:
- 邮件已被确认或拒绝。
- 尝试通过未传递消息的通道进行 ack。
- 在消息超时 (ttl) 过期后尝试进行 ack。
我们已经为上述每种情况实施了保护措施,但问题仍然存在。
我意识到有许多实现细节可能会影响这一点,但是在概念层面上,是否有任何其他失败案例我们没有考虑过,应该处理?还是有更好的方法来实现上述功能?