1

4 つのコンシューマ A、B、C、D を持つジョブ スケジューラがあるとします。タイプ X のジョブはコンシューマ A にルーティングされ、タイプ Y はコンシューマ B にルーティングされる必要があります。コンシューマー A、B、C、および D は、ローカルでもリモートでも、依存関係のない独立したアプリケーションとして実行されます。

コンシューマーがジョブを完了するまでにかかる時間はさまざまです。ジョブはその後、集計のためにジョブ スケジューラにルーティングされます。

適格なジョブを共有するために、コンシューマーの 1 つのクローンも必要になる場合があります。ただし、ジョブは 1 回だけ処理する必要があります。

コンテンツベースのルーターはこれに最適なソリューションですか? カスタム ジョブ スケジューラが必要なのは、コンシューマー間でジョブを分割するためのインテリジェンスしかないためです。

または、これを処理するためのより良い方法はありますか? 障害が発生した場合に別のコンシューマーに自動的に切り替える (負荷分散) などのブローカーの機能は必要ありません。

4

1 に答える 1

2

私はあなたをフォローしているかどうか完全に確信が持てません。これは、非同期処理のかなり単純なシナリオのように思えます。

これらのジョブを Camel アプリケーションに送信する方法はわかりませんが、どこかでジョブを受信できることを考えると、おそらく単純なコンテンツ ベースのルーターを使用することができます。

コンシューマーの要件を考えると、JMS キュー (Apache ActiveMQ または同様のブローカー ミドルウェアを使用) を使用し、ジョブ タイプごとに 1 つのキューを使用します。これにより、コードを実際に変更することなく、コンシューマーをさまざまなマシンに簡単に配布できます。

// Central node routes
from("xxx:routeJob")
   .choice()
       .when(header("type").isEqualTo("x"))
           .to("jms:queue:processJobTypeX")
       .when(header("type").isEqualTo("y"))
           .to("jms:queue:processJobTypeY")
       .otherwise()
           .to("jms:queue:processJobTypeZ"); 

 from("jms:queue:aggregateJob")
    .bean(aggregate);

// different camel application (may be duplicated for multiple instances).
from("jms:queue:processJobTypeX")
  .bean(heavyProcessing)
  .to("jms:queue:aggregateJob");

// Yet another camel application
from("jms:queue:processJobTypeY")
  .bean(lightProcessing)
  .to("jms:queue:aggregateJob");

より良い答えを得るために、質問を再検討してください:)

于 2012-12-29T17:23:05.637 に答える