2012-03-04 13 views
0

私は毎分一定の基準で実行する必要がある約1000-10000のジョブを持っています。時々新しい仕事が入ったり、他の仕事をキャンセルする必要がありますが、まれな出来事です。ジョブはタグ付けされており、それぞれが特定の種類のジョブだけを処理するワーカーに妨害されなければならない。無限ループの作業キューを整理する最適な方法は何ですか?

今のところ私はいくつかのブローカー - RabbitMQまたはbeanstalkd(どれを使用するか決定していない)でジョブのデータベース全体を読み込んでcronを使用したいと思います。

しかし、この方法は、(無限をシミュレートするためにタイマを使用して、データベース全体をロードするなど)醜いようであり、いくつかの種類のジョブがキューに追加されるよりも遅く処理された場合、圧倒される可能性があります。メッセージブローカーはすべてのラムを食べ、スワップして停止します。

その他の可能性はありますか?私は仕事に正しいパターンを使用していませんか? (私はキューや何かを必要としないかもしれません..)

p.s.これが重要なのであれば私はpythonを使っています。

答えて

1

ジョブの初期バッチを作成し、キューに追加します。 それぞれジョブを実行しているキューのn-consumerがあります。コンシューマをキューに追加するだけで、各リスニングコンシューマにジョブの配信をラウンドロビンするだけで、任意の水平スケーラビリティを実現します。

各ジョブは、完了後に自分自身をキューに戻すことができます。つまり、ジョブキューは、初期化したときの長さを超えて拡大することはありません。 マスタジョブは、必要に応じて、サブジョブを生成してキューに追加することができます。

異なる種類のジョブでは、異なるキューを使用することをお勧めします。そうすれば、異なるキューからジョブを実行している労働者の数量/馬力を変えることで、負荷をより効果的にバランスさせることができます。

ここではPythonを実行しているということは重要ではありませんが、パターンであり、最初に釘付けする必要のある言語ではありません。

+0

私は参照してください。そして、もし私が数百万のジョブを持っていたら、それらを一度にキューにロードすることはできません。どのパターンをキューに入れるべきですか? – Moonwalker

+0

何百万のジョブをキューに入れられないのはなぜですか?ウサギは気にしない。ちょうどそこにあなたの仕事をポンプして、彼らが飛ぶことができます。 –

+0

ありがとうございます。今はすべてが明らかです。 – Moonwalker

0

非同期フレームワークを使用できます。 Twisted

私は毎分cronデーモンでスクリプトを実行するのは良いとは思っていません。スケジューリングの利点はありませんが、プロセス管理とメモリ共有に柔軟性があります

+0

あなたは、おそらくあなたの答えよりも少し詳細を提供することができます! –

+0

私はそれを理解しようとしましたが、それは私にとっては難しいと思われます。そして、正しく理解されていれば、非同期はIO感覚ですよね?スケジューリングの利点はありませんか? – Moonwalker

関連する問題