在我的组织中,我们有许多Redis工作人员来完成我们的关键任务。通常,一天一次或两次,我们的工人会停止处理队列。
该代码基本上如下所示:
while ($item = $redis->blpop(array('someQueue', 'anotherQueue'), 3600)) { someFunction(); }
如果看到的话,就代码而言,发生的事情并不多,但是每隔一段时间,队列就会开始建立,并且工作程序不会从队列中弹出任何项目。为设置超时blpop根本没有用,因为我们假设问题出在Redis客户端连接上。
blpop
目前,我们已经建立了一些侦听器,这些侦听器会在队列建立时提醒我们,然后我们重新启动工作器,但问题仍然存在。我们还可以为我们的Redis客户端设置超时,但是同样,这也不是理想的解决方案。
我们的问题类似于使用redis实现消息队列中的错误,使用BLPOP中的错误,但我们没有得到任何错误。工人突然停了下来。
信息
Redis服务器:2.8.2
PHP Redis:phpredis
运行了很长时间的工作程序已停止处理队列。运行后,CLIENT LIST我们注意到这些工人与其他工人相比有较高的空闲时间,并且其标记设置为N而不是b。这可能是什么原因?
CLIENT LIST
N
b
问题出在哪里someFunction()。有一段代码导致该函数无法返回控制,这是由于客户端长时间处于空闲状态,因此在运行时显示“ N”标志CLIENT LIST。
someFunction()
我建议验证是否存在问题, 如果 发现服务器端, 则 将该问题作为问题报告给Redis项目。但是,即使在堆栈的其他部分中,以下步骤也将帮助您解决问题(这很可能,因为没有与上述类似的已知问题)。
检查发生了什么的步骤:
LLEN
随机说明: