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