消息从一组队列(每个WebSocket连接1个)中消耗,并在我们通过WebSocket接收到确认消息已被接收时由使用者进行确认(因此,我们可以重新排队在可接受的时间内未传递的消息)。这是以非阻塞方式完成的。
99%的时间,这种方法完美地运行,但很少出现错误“RabbitMQ PRECONDITION_FAILED - unknown delivery tag”,这会关闭通道。据我理解,此异常是以下条件之一的结果:
1. 消息已经被确认或拒绝。 2. 在不传递消息的情况下尝试在通道上进行确认。 3. 在消息超时(ttl)后尝试确认。
我们已为上述每种情况实施了保护措施,但问题仍然存在。
我意识到有许多可能影响此问题的实现细节,但是在概念层面上,是否还有我们没有考虑并且应该处理的其他故障情况?或者是否有更好的方法来实现上述功能?
auto_ack
是否被设置为False
。如果是True
,那么手动确认时就会出现相同的错误。 - Venkatesh Dharavath