2016-09-27 5 views
1

私が達成しようとしているものは、ユーザーが従業員が処理するバッチ処理を動的に実行できるマルチテナントアプリケーションを構築しています。RabbitMqでワーカーのプールを共有する

私たちは、一人のユーザからの単一のバッチを持っている場合
  • は、すべての労働者は、この単一のユーザー
  • からのメッセージ上で動作している別のユーザーがバッチジョブを送信する場合、各ユーザーは、労働者の半分を取得します(最初のユーザーはあるように現在遅い速度で作業していますが、後のユーザーは最初のユーザーが長時間の仕事をすべて完了するまで待つ必要はありません)

は作業キューで可能なことですか? (何らかの理由で、それはFIFOにねじれやキューのアイデアのように感じるが、それはとにかく私のユースケースです:D)

答えて

0
あなたはプライオリティキューの実装を見て可能性があり

:それがない場合https://www.rabbitmq.com/priority.html

トピック交換に100のキューをバインドし、ルーティングキーをユーザーID%100のハッシュに設定することができます。つまり、各タスクには1〜100のキーと同じユーザーのタスクは同じキーを持ちます。各キューは、1から100までの一意のパターンでバインドされています。次に、ランダムなキュー番号で始まり、各ジョブの後でそのキュー番号をインクリメントします。

あなたのワーカーは最大100人の一意のユーザーを並行して処理できます。他の作業がない場合は、すべてのワーカーが1人のユーザーに集中できます。各ジョブの間に100個のキューをすべて循環させる必要がある場合、1人のユーザーだけが1つのキューに多くのジョブを持っているというシナリオでは、各ジョブ間にある程度のオーバーヘッドが発生します。より少ない数のキューがこれに対処する1つの方法です。各作業者に各キューへの接続を保持させ、それぞれから未確認のメッセージを最大1つ消費することもできます。ワーカーは、未確認のメッセージタイムアウトが十分に高く設定されていれば、メモリ内のペンディングメッセージをずっと早く循環させることができます。

また、バインドキューを持つ2つの交換を作成することもできます。すべての作業は最初の交換とキューに行われ、作業者のプールが消費します。作業単位が長すぎる場合、作業者はそれを取り消して2番目のキューにプッシュすることができます。労働者は、第1の待ち行列に何もないときに第2の待ち行列を処理するだけである。逆の待ち行列の優先順位付けをしている2人の作業者に、短時間のタスクが到着することのない終わりのないストリームがあるときに、長時間実行されているタスクが処理されるようにして、ユーザーバッチが常に処理されるようにすることもできます。これは本当にすべてのタスクに渡ってあなたのワーカーを派遣するわけではありませんが、従業員を待っている1人のユーザーから長時間実行されているタスクは、その同じユーザーまたは別のユーザーに対して短期間の作業を実行するのを止めます。また、ジョブをキャンセルして後で問題なく再実行できることを前提としています。また、タイムアウトして再実行する必要のあるタスクからのリソースが無駄になることを意味します。高速で遅いタスクを事前に特定できない限り、

単一のユーザーに対して100個の低速なタスクがある場合は、100個のキューの最初の提案にも問題が発生する可能性があります。これらのタスクは、遅いタスクの1つが終了するまで見られません。これが正当な問題であると判明した場合は、2つのソリューションを組み合わせる可能性があります。

関連する問題