【发布时间】:2017-07-22 21:40:22
【问题描述】:
我们有一个 PHP 应用程序,它通过 WebSocket 连接将来自 RabbitMQ 的消息转发到连接的设备(PHP AMQP pecl 扩展 v1.7.1 和 RabbitMQ 3.6.6)。
消息从队列数组中消费(每个 websocket 连接 1 个),并在我们通过 websocket 收到消息已收到的确认时由消费者确认(因此我们可以重新排队未以可接受的方式传递的消息大体时间)。这是以非阻塞方式完成的。
在 99% 的情况下,这都能完美运行,但我们偶尔会收到错误“RabbitMQ PRECONDITION_FAILED - unknown delivery tag”。这会关闭通道。据我了解,此异常是以下情况之一的结果:
- 消息已经被确认或拒绝。
- 尝试通过未传递消息的通道进行确认。
- 在消息超时 (ttl) 到期后尝试确认。
我们已针对上述每种情况实施了保护措施,但问题仍然存在。
我知道有许多实施细节可能会影响这一点,但在概念层面上,是否还有其他我们没有考虑且应该处理的失败案例?还是有更好的方法来实现上述功能?
【问题讨论】: