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 に答える