检测哪个工作人员将 TTR 过期的作业返回到队列?

发布于 2024-12-04 08:40:42 字数 658 浏览 2 评论 0原文

我有多个工作人员使用 beanstalk-client-ruby 处理 beanstalkd 队列中的请求。

出于测试目的,工作人员从队列中获取作业后随机进入无限循环。

Beanstalk 注意到某个作业已保留太长时间,并将其返回到队列中以供其他工作人员处理。

我怎样才能检测到这种情况已经发生,以便我可以杀死发生故障的工人?

看起来我可以检测到发生了超时:

> job.timeouts
 => 0
> sleep 10
 => nil
> job.timeouts
 => 1

现在我怎样才能做到:

> job=queue.reserve
 => 189
> job.MAGICAL_INFO_STORE[:previous_worker_pid] = $$
 => extraordinary magic happened
> sleep 10
 => nil
> job=queue.reserve
 => 189
> job.timeouts
 => 1
> kill_the_sucker(job.MAGICAL_INFO_STORE[:previous_worker_pid])
 => nil

I have multiple workers processing requests in a beanstalkd queue using beanstalk-client-ruby.

For testing purposes, the workers randomly dive into an infinite loop after picking up a job from the queue.

Beanstalk notices that a job has been reserved for too long and returns it to the queue for other workers to process.

How could I detect that this has happened, so that I can kill the malfunctioning worker?

Looks like I can get detect that a timeout has happened :

> job.timeouts
 => 0
> sleep 10
 => nil
> job.timeouts
 => 1

Now how can I something like:

> job=queue.reserve
 => 189
> job.MAGICAL_INFO_STORE[:previous_worker_pid] = $
 => extraordinary magic happened
> sleep 10
 => nil
> job=queue.reserve
 => 189
> job.timeouts
 => 1
> kill_the_sucker(job.MAGICAL_INFO_STORE[:previous_worker_pid])
 => nil

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

GRAY°灰色天空 2024-12-11 08:40:42

我自己找到了一个有效的解决方案:

  1. 保留工作
  2. 设置一个新的管子,而乔布(Job_ID)
  3. 将您的PID在体内将工作推到新的管子上,
  4. 当时有超时的工作。发现0,从Job_ID队列中弹出PID任务。
  5. 杀死工人

Found a working solution myself:

  1. Reserve a job
  2. Setup a new tube with the job_id
  3. Push a job with your PID in the body to the new tube
  4. When a job with timeouts > 0 is found, pop the PID-task from the job_id queue.
  5. Kill the worker
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文