gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 06:01:16 24 4
gpt4 key购买 nike

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

代码基本上是这样的:

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

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

目前,我们已经设置了一些监听器,当队列增加时会提醒我们,然后我们重新启动工作程序,但问题仍然存在。我们也可以为我们的 redis 客户端设置超时,但这也不是一个理想的解决方案。

  • 还有其他人遇到过这种情况吗?
  • 可能是什么问题?
  • 我们做错了什么吗?

我们的问题类似于Error in implementing message queue using redis, error in using BLPOP但我们没有收到任何错误。 worker 突然停下来。

信息

Redis 服务器:2.8.2

PHP Redis: phpredis

更新 #1

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

更新 #2

问题出在 someFunction() 上。有一段代码导致函数不返回控制权,由于客户端长时间空闲,因此在运行 CLIENT LIST 时出现“N”标志。

最佳答案

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

检查发生了什么的步骤:

  1. 等待一位客户停止。
  2. 使用 LLEN 命令验证列表中是否确实存在元素。
  3. 检查 CLIENT LIST 是否确实列出了您的客户端,执行阻塞弹出(您将看到命令名称),并检查回复的大小是多少,看看它是否是那是您的客户,它实际上并没有使用它收到的回复。

随机备注:

  1. Redis 2.8.2。太旧,建议升级。
  2. 如果 phpredis 和 Redis 服务器一样旧,它可能有导致这种情况的错误。

关于php - 一段时间后 blpop 停止处理队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27540147/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com