3

アップロードされるファイルを処理する必要があり、1 秒から 10 分ほどかかる場合があります。現在、私の解決策は、30秒のタイマーでクォーツジョブを作成し、ヒットするたびに任意のジョブを処理することです。これにはいくつかの問題があります。

1: ジョブが数秒もかからない場合、ジョブ キューを 30 秒待たせるのは無駄です。

2: キューに長いジョブが 1 つしかない場合、それを 2 回実行しようとする可能性があります。

私が欲しいのは、時代を超越したキューです。物が追加されると、空いているワーカーがあればすぐに開始されます。これに対する解決策はありますか?私はjesqueを見ていましたが、これができるかどうかわかりませんでした。

4

2 に答える 2

2

探しているのは、基本的なメッセージ キューです。選択肢はたくさんありますが、Grails で私のお気に入りは RabbitMQ です。そのための Grails プラグインは非常に優れており、私の経験ではうまく機能します。

一般に、メッセージ キューを使用すると、N 個のプロデューサー (ジョブを作成するもの) が作業メッセージをキューに追加し、M 個のコンシューマーがジョブをキューから取り出して処理することができます。ワーカーがジョブを完了すると、単にキューに要求します処理する次のジョブがない場合は、キューが何かを与えるのを待つだけです. キューはまた、メッセージ処理の成功/失敗を追跡します (これは制御できます)。複数のワーカーへの同じメッセージ。

これには、ポーリングに依存しないという利点があり (そのため、何かが入ってきたらすぐに処理を開始できます)、さらにスケーラブルです。プロデューサーとコンシューマーの両方を必要に応じてスケールアップまたはスケールダウンし、入力を出力から分離して、トラフィックのスパイクを処理し、リソース (ワーカー) が利用可能になったときに処理を進めることができます。

于 2012-03-01T22:39:57.587 に答える
-1

問題 1 を解決するには、5 秒 (または 3 秒、または 1 秒) ごとにジョブが新しくアップロードされたファイルをチェックするようにします。アップロードされたファイルのチェックが迅速であれば、頻繁に実行できない理由はありません。

問題 2 については、ファイルの処理を開始した時点を記録して、ファイルが 2 回取得されないようにする必要があります。データベースにテーブルを作成するか、情報をメモリのどこかに保存することができます。

于 2012-03-01T22:38:04.873 に答える