2

我观察到 RabbitMQ 被未确认的消息“卡住”。队列显示了一个不再存在的消费者,我假设正在发生的事情是 RabbitMQ 正在继续向该消费者传递消息。它们显示为越来越多的未确认消息。我正在使用 php-amqplib 在 PHP 中执行此操作。

我可以通过终止消费者进程(命令行上的 control-C)来产生问题。

我尝试指定 3 秒的心跳并尝试保持真假。有了心跳,消费者最终会失败:

Exception fwrite(): send of 573 bytes failed with errno=32 Broken pipe
PhpAmqpLib\Wire\IO\StreamIO->error_handler(8, 'fwrite(): send ...',
php-amqplib/PhpAmqpLib/Wire/IO/StreamIO.php(281): fwrite(Resource id #176, '\x01\x00\x01\x00\x00\x00\x15\x00<\x00(\x00\x00\fb...', 8192)

问题 #374 可能相关:https ://github.com/php-amqplib/php-amqplib/issues/374

消费者正在从多个队列中消费,但我认为这无关紧要。

我试图解决的问题是,RabbitMQ 继续认为消费者存在,但实际上并不存在,结果 RabbitMQ 无法将这些消息传递到任何地方,并且它们未被确认。我正在寻找一种摆脱这种虚假连接的方法,以便可以将这些消息重新传递给实时消费者。我认为这就是心跳的用途,但我还没有让它发挥作用。

4

1 回答 1

1

在这种情况下,我们需要做的第一个也是更重要的想法是尝试“打印”您的内容消息,并且只向消费者返回 true。不要处理您的真实代码,如果您可以“消费”这些消息,那么问题不在于rabbit,而是在我们的过程中,因为可能我们花费了很多时间来向rabbit确认消息并且Rabbit关闭了我们的连接。

我并不是说这是你的情况,但我只是想帮助调试问题。

在我的情况下,我改变了这个问题的方法,因为每条消息我都有很多产品 ID(我的情况)并且它花费很长时间来 ACK 过程导致它们到达数据库,我适合我的消息并且在这样做之后效果很好。

我们可以改变方法,比如创建另一个队列来适应这些消息,我不知道,但 90% 的问题是它。

您可以在此处阅读有关使用心跳检测死 TCP 连接的更多信息

于 2016-10-14T21:16:40.317 回答