2012-03-01 14 views
3

アップロードされるファイルを処理する必要があります。わずか1秒か10分かかります。現在のところ私の解決策は、30秒のタイマーでクォーツジョブを作成し、それがヒットするたびに処理して任意のジョブを実行することです。これにはいくつかの問題があります。Grailsの非時間ベースのキューイング

1:ジョブが数秒未満で済む場合、ジョブキューの待機時間を30秒にするのは無駄です。

2つ:待ち行列に長いジョブが1つしかない場合、実行可能性が2倍になる可能性があります。

私が望むのは、時代を超越したキューです。物事が追加されると、無料の労働者がいる場合はすぐに開始されます。これには解決策がありますか?私はジェスケを見ていたが、それができるかどうかは分からなかった。

+0

これは間違いなく可能です。これはメッセージキューの背後にある基本的な考え方です(実際にはキューではないQuartzのようなジョブスケジューラとは対照的です)。 – cdeszaq

答えて

2

あなたが探しているのは、基本的なメッセージキューです。そこにはたくさんのオプションがありますが、Grailsの私のお気に入りはRabbitMQです。 Grailsのプラグインはかなりいいですし、私の経験ではうまくいきます。

一般に、メッセージキューを使用すると、N個のプロデューサ(ジョブを作成するもの)をキューに追加し、M個のコンシューマがジョブをキューから取り出して処理することができます。キューに次のジョブを処理するかどうかを問い合わせ、存在しない場合は、キューに何かを与えるのを待ちます。キューはメッセージ処理の成功/失敗を追跡します(これを制御することができます)。

これは、ポーリングに頼らないという利点があります(これにより、作業が開始されるとすぐに処理を開始できます)。また、スケーラビリティも大幅に向上します。生産者と消費者を必要に応じて上下に動かし、入力を出力から切り離すあなたはリソース(労働者)が利用できるようにトラフィックスパイクを取得し、それを通って作業を進めることができます。

-1

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

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

+0

ポーリングはあまりスケーリングできず、データベースをループに追加するだけで追加のリソース競合が作成されます。特に、アプリケーションがよりリアルタイム処理に移行するにつれて、ポーリングは非常に迅速に機能します。 – cdeszaq

+0

これは私の問題は、処理がハングするケースを解決するために、その2番目のフラグに対してあらゆる種類のチェックを行う必要があることです。 – Mikey

+0

@Mikey - 心配はいりません。しかし、私が何かを見逃していない限り、キューを使ってスケジュールを立ててもハングするジョブを処理するコードが必要になります。 – David

関連する問題