我观察到 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 无法将这些消息传递到任何地方,并且它们未被确认。我正在寻找一种摆脱这种虚假连接的方法,以便可以将这些消息重新传递给实时消费者。我认为这就是心跳的用途,但我还没有让它发挥作用。