2012-03-21 18 views
4

私はCelery/AMQPをかなり使い慣れており、以下の要件を満たすためにタスク/キュー/ワーカーの設計を考えています。Celeryの設計の助け:同時に実行するタスクを防ぐ方法

私は、複数の種類の「ユーザー単位」のタスクを持っています。たとえば、TaskA、TaskB、TaskCなどです。これらの「ユーザごとの」タスクはそれぞれ、システム内の特定の1人のユーザのデータを読み書きします。だから、いつでも私はタスクUser1_TaskA、User1_TaskB、User1_TaskC、User2_TaskA、User2_TaskB、などを作成する必要があります。の、すべてのタスクタイプの2つのタスクが同時に実行されないようにする必要があります。他のワーカーがUser1_TaskBまたはUser1_TaskCを実行しているときに、同時に他のワーカーがUser1_TaskAを実行することはできませんが、User1_TaskAが実行されている間は他のワーカーを同時にブロックしてUser2_TaskA、User3_TaskAなどをブロックしてはいけません。

これは、外部ロック機構(DBなど)を使用して実装できることを認識していますが、より洗練されたタスク/キュー/ワーカーの設計がうまくいくことを期待しています。

私は、ワーカーが起動すると作成するバケットの数を指定し、それぞれのバケットワーカーが正確に1つのバケットにバインドされているように、キューをユーザーバケットとして実装することを考えています。次に、「中間作業者」は、メインタスクキューからタスクを引き出し、ハッシュ/モデムスキームなどを介してバケットキューに割り当てます。そのため、UserAのタスクは常に同じキューで終了し、UserAの複数のタスクが互いに背後にあることになります。バケットの数を事前に定義する必要があり、(簡単に)労働者を動的に追加することを妨げるように見えるので、私はこのアプローチが大好きではありません。もっと良い方法があるはずだと私には思われます - 提案は大いに感謝されるでしょう。

答えて

2

外部ロック機構を使用するとどうなりますか?シンプルで、簡単で、効率的です。分散タスクロックの例はCelery hereにあります。ユーザーごとにロックを作成することでそれを拡張すると、完了です!

+0

Roger that - thanks! – Matt

+0

更新リンク:http://docs.celeryproject.org/ja/latest/tutorials/task-cookbook.html#ensuring-a-task-is-only-executed-one-at-a-time – Altaisoft

関連する問題