检测哪个worker将ttl过期的作业返回到队列



我使用beanstalk-client-ruby在一个beanstald队列中处理多个worker请求。

为了测试的目的,工人从队列中取出一个作业后随机进入一个无限循环。

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

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

  1. 预留作业
  2. 用job_id
  3. 创建一个新管道
  4. 将您的PID在体内的作业推送到新管
  5. 当发现超时时间> 0的作业时,从job_id队列中弹出pid任务。
  6. 杀死工人

最新更新