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
4

1 回答 1

0

自己找到了一个可行的解决方案:

  1. 预约工作
  2. 使用 job_id 设置新管
  3. 将您体内 PID 的工作推送到新管中
  4. 当找到超时 > 0 的作业时,从 job_id 队列中弹出 PID 任务。
  5. 杀死工人
于 2011-09-14T20:16:59.097 回答