0

データベースから100個のレコードを選択してタスクを実行するRubyデーモンがあります。

高速化するために、通常は同じデーモンの 3 つのインスタンスを作成します。そして、それぞれが mysqlLIMITとを使用して異なるデータを選択しOFFSETます。

問題は、同じデータ レコードに対してタスクが 2 回または 3 回実行される場合があることです。

LIMITしたがって、データベースのみを信頼するだけでは十分ではないと思いますOFFSET... 2つ以上のデーモンが実際に同時に同じデータを収集できる場合があるためです。

どうすれば安全に行うことができますか?2 つのインスタンスを回避して同じデータを選択する

  • デーモン 1 => 1 から 100 までのレコードを選択
  • Daemon 2 => 101 から 200 までのレコードを選択
  • Daemon 3 => 201 から 300 までのレコードを選択
4

1 に答える 1

3

独自のソリューションを展開するのではなく、Resque (個人的なお気に入り) のようなバックグラウンド ジョブを処理するための既存のソリューションを検討することをお勧めします。Resque では、Web サイトのリンクなど、アプリケーションで意味のあるトリガーを使用して、各行のジョブをキューに入れます (コンテキストがないと言いにくいです)。常に X 個のワーカー (この場合は 3 個) を実行しておくと、Resque がキュー管理作業を行います。Resque は Redis をバックエンドとして使用するため、ゲートからのアトミック プッシュ/ポップ アウトをサポートします (二重処理はもう必要ありません)。

Resque には、ジョブとワーカーを監視するための非常に直感的で使いやすい Web インターフェイスも付属しています。

于 2011-04-27T03:39:15.507 に答える