小编典典

一段时间后blpop停止处理队列

redis

在我的组织中,我们有许多Redis工作人员来完成我们的关键任务。通常,一天一次或两次,我们的工人会停止处理队列。

该代码基本上如下所示:

while ($item = $redis->blpop(array('someQueue', 'anotherQueue'), 3600)) {
    someFunction();
}

如果看到的话,就代码而言,发生的事情并不多,但是每隔一段时间,队列就会开始建立,并且工作程序不会从队列中弹出任何项目。为设置超时blpop根本没有用,因为我们假设问题出在Redis客户端连接上。

目前,我们已经建立了一些侦听器,这些侦听器会在队列建立时提醒我们,然后我们重新启动工作器,但问题仍然存在。我们还可以为我们的Redis客户端设置超时,但是同样,这也不是理想的解决方案。

  • 有没有其他人面对过这个?
  • 可能是什么问题?
  • 我们做错什么了吗?

我们的问题类似于使用redis实现消息队列中的错误,使用BLPOP中的错误,但我们没有得到任何错误。工人突然停了下来。

信息

Redis服务器:2.8.2

PHP Redis:phpredis

更新#1

运行了很长时间的工作程序已停止处理队列。运行后,CLIENT LIST我们注意到这些工人与其他工人相比有较高的空闲时间,并且其标记设置为N而不是b。这可能是什么原因?

更新#2

问题出在哪里someFunction()。有一段代码导致该函数无法返回控制,这是由于客户端长时间处于空闲状态,因此在运行时显示“ N”标志CLIENT LIST


阅读 409

收藏
2020-06-20

共1个答案

小编典典

我建议验证是否存在问题, 如果 发现服务器端,
将该问题作为问题报告给Redis项目。但是,即使在堆栈的其他部分中,以下步骤也将帮助您解决问题(这很可能,因为没有与上述类似的已知问题)。

检查发生了什么的步骤:

  1. 等待一个客户端停止。
  2. 使用LLEN命令验证列表中是否确实有元素。
  3. 检查CLIENT LIST是否确实列出了您的客户端,执行阻止弹出窗口(您将看到命令名称),并检查回复的大小,以查看是否是您的客户端实际上没有消耗回复内容得到。

随机说明:

  1. Redis 2.8.2。太旧了,建议升级。
  2. 如果phpredis与Redis服务器一样旧,则可能存在可能导致此错误的错误。
2020-06-20