我观察过RabbitMQ"卡住"没有消息的消息。队列显示不再存在的消费者,我假设发生的事情是RabbitMQ继续向该消费者传递消息。它们显示出越来越多的未经处理的消息。我在php中使用php-amqplib进行此操作。
我可以通过终止使用者进程(命令行上的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无法传递这些消息,并且他们没有得到承认。我正在寻找摆脱虚假连接的方法,以便将这些消息重新传递给现场消费者。我认为这是心跳的目的,但我还没有让它发挥作用。
答案 0 :(得分:2)
在这种情况下我们需要做的第一个也是更重要的想法是尝试打印&#34;如果你可以消费&#34;你内容消息并且只返回真实的消费者,不要处理你的真实代码。消息问题不在兔子身上,而是在我们的过程中,因为可能我们花了很多时间来向兔子和兔子发出信息,关闭我们的联系。
在我的情况下,我改变了这个问题的方法,因为我为每条消息都有很多产品ID,并且它花费很长时间来确认处理,所以,我适合我的消息,并且在这样做之后效果很好。
我们可以改变方法,例如创建另一个队列以适应这些消息,我不知道,但90%的问题都是它。
您可以阅读有关使用检测信号检测死TCP连接的更多信息here