1

Mule 2.0フレームワークで使用されるコレクションアグリゲーターは、次のように機能します。

  • インバウンドルーターはメッセージのコレクションを受け取り、それをいくつかの小さなメッセージに分割します-それぞれの小さなメッセージには、親メッセージに対応する相関IDがスタンプされます

  • これらのメッセージはさまざまなサービスを流れます

  • 最後に、これらのメッセージは、親メッセージの相関IDと予想されるメッセージの数に基づいてメッセージを収集するインバウンドアグリゲーターに到着します。予期されたすべてのメッセージが受信されると、集計関数が呼び出され、結果が返されます。

これで、グループ内のメッセージの数が適度に少ない場合にこれが正常に機能します。ただし、グループ内のメッセージの数が最大100kになると、後のメッセージが到着するのを待っているメッセージのグループを保持するために、多くのメモリが拘束されます。複数のグループが同時に集約されている場合、これはさらに悪化します。

この問題を回避する方法は、ストリーミングアグリゲーターを実装することです。私のユースケースでは、基本的にキーに基づいてさまざまなメッセージを要約しています。これは、グループ内のすべてのメッセージを同時に表示しなくても実行できます。結果をエンドポイントに転送する前に、すべてのメッセージが受信されたことを知りたいだけです。

これは問題の合理的な解決策のように聞こえますか?

これはすでにMuleのどこかに実装されていますか?

これを行うためのより良い方法はありますか?

4

1 に答える 1

2

これは合理的なアプローチのように思えます (私は決して Mule の専門家ではありません)。Mule のドキュメントをすべて読みましたが、このようなものは存在しないと思います (ストリーミングのサポートはいくつかのコネクタに限定されています)。およびトランスフォーマー - InputStream を渡すだけという点で非常に単純です)。Mule ストリームにはいくつかのものしかないため、他の変更されたトランスフォーマー (使用する場合) が必要になる場合があります。InputStream を提供するアグリゲーターを実装し、メッセージの連続したシーケンスを取得するとすぐにストリーミングを開始するだけです。

ただし、「...結果をエンドポイントに転送する前にすべてのメッセージが受信されました」という説明の 1 つの文は、問題になる可能性があります。これは、(おそらくサービス コンポーネントで) 処理された結果を転送する前にすべてを取得したことを追跡することを意味しない限り、本質的にストリーミングの目的を無効にします。

于 2009-12-11T16:49:44.690 に答える