2011-09-14 51 views
0

我有多個worker使用beanstalk-client-ruby處理beanstalkd隊列中的請求。檢測哪個工作人員將TTR過期作業返回隊列?

出於測試目的,工作人員在從隊列中提取作業後隨機進入無限循環。

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 

回答

0

找到一個可行的解決方案自己:

  1. 儲備一份工作
  2. 用job_id建立一個新管
  3. 用身體中的PID將工作推送到新管
  4. 找到超時時間> 0的作業時,從job_id隊列中彈出PID任務。
  5. 殺死工人
相關問題