rabbitMQ无法使用php amqplib获取心跳信号

rabbitMQ无法使用php amqplib获取心跳信号,rabbitmq,php-amqplib,Rabbitmq,Php Amqplib,我观察到RabbitMQ被未确认的消息“卡住”。队列显示了一个不再存在的使用者,我假设发生的是RabbitMQ正在继续向该使用者传递消息。它们表现为未确认消息的数量不断增加。我用PHP和PHP amqplib来做这件事 我可以通过终止使用者进程(命令行上的control-C)来产生问题 我尝试指定3秒的心跳,并尝试保持活动状态(true和false)。使用heartbeat,消费者最终将失败: Exception fwrite(): send of 573 bytes failed with e

我观察到RabbitMQ被未确认的消息“卡住”。队列显示了一个不再存在的使用者,我假设发生的是RabbitMQ正在继续向该使用者传递消息。它们表现为未确认消息的数量不断增加。我用PHP和PHP amqplib来做这件事

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

我尝试指定3秒的心跳,并尝试保持活动状态(true和false)。使用heartbeat,消费者最终将失败:

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)
异常fwrite():发送573字节失败,错误号为32的管道断裂
PhpAmqpLib\Wire\IO\StreamIO->error\u处理程序(8,'fwrite():send…',

php amqplib/PhpAmqpLib/Wire/IO/StreamIO.php(281):fwrite(资源id#176),\x01\x00\x01\x00\x00\x00\x15\x00在这种情况下,我们需要做的第一个也是更重要的事情是尝试“打印”您的内容消息,并且只向消费者返回true。如果您可以“消费”,请不要处理您的真实代码问题不在兔子身上,而是在我们的过程中,因为我们可能花了很多时间向兔子确认消息,兔子关闭了我们的连接

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

在我的例子中,我改变了解决这个问题的方法,因为我有很多产品ID(我的例子)用于每个消息,并且它花费了很长的时间来确认过程,因为它们到达数据库,我对我的消息进行了调整,然后它就可以正常工作了

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


您可以阅读更多关于检测心跳停止的TCP连接的信息

您的消费者中是否启用了自动确认功能?我没有。我需要能够在消息工作完成后通过确认进行节流。如果您使用lvs(带fullnat)或者其他负载平衡,但没有正确配置心跳,可能会出现问题。不幸的是,这无助于说明的问题。问题不是使用者花太长时间确认消息。消息在大约20毫秒内被确认。我相信,问题是使用者进程不再存在,而是RabbitMQ认为使用者仍然存在。我可以在RabbitMQ管理页面(到队列的使用者连接数)上看到这一点。RabbitMQ然后继续“传递”消息,但实际上没有任何东西接收到它们。我可以在管理页面上通过未确认消息的数量不断增加看到这一点。不是答案:(