0

それぞれが異なる物理サーバーで実行されている一連の複製されたコンシューマー アプリケーションの負荷を分散する必要がある典型的なシナリオがあります。ここでは、スケーラビリティのためにサーバーを動的に追加できるはずです。

ここでは、ラウンド ロビンの負荷分散を使用することを考えていました。しかし、サーバーで実行時間の長いジョブが原因で、メッセージが消費のためにキューで待機することは望ましくありません。

これを解決するために、サーバー アプリケーションごとに 2 つの concurrentConsumers を構成することを考えました。古いメッセージがスレッドによって処理され、新しいメッセージが到着すると、後者は 2 番目のスレッドによってキューから消費されます。新しいメッセージの処理中に、2 番目のスレッドは、スレッドによって共有されるクラス (グローバル) 変数をチェックする必要があります。「ON」の場合、1 つのスレッドがアクティブであると想定できます (つまり、ジョブは既に進行中です)。その場合、メッセージをソース キューに再ルーティングします。ただし、クラス変数が「OFF」の場合は、メッセージ データでジョブを開始できます。

ジョブ自体が重いため、一度に 1 つのジョブのみを処理する必要があります。そのため、別のスレッドがアクティブな場合、2 番目のスレッドがメッセージを再ルーティングします。

そこで、質問は「同時利用者が Camel でデータを共有できる簡単な方法はありますか?」ということです。または、この問題をまったく別の方法で解決できますか?

4

1 に答える 1

0

ActiveMQ のような JMS ブローカーの場合、同じキューで同時リスナーを単純に使用できるはずです。ラウンド ロビンを実行する必要がありますが、アイドル状態のコンシューマーに対してのみ実行する必要があります。したがって、基本的にこれはうまくいくはずです。最終的には、プリフェッチ サイズを 1 に設定する必要があります。これは、長時間実行されているプロセスによってメッセージがブロックされる場合でも、プリフェッチによってコンシューマーがメッセージを取得する可能性があるためです。

于 2013-01-24T08:50:45.780 に答える