2017-05-23 7 views
0

2人のサブスクライバを持つpub-subチャネルを持つSpring統合アプリケーションがあります.1人はKafkaにメッセージを公開し、もう1人はメッセージをファイルに書き込みます。問題は、ファイルにメッセージを書き込むサービスアクチベータが、カフカに生産する他のサービスアクティベータの速度に追いつくことができないことです。これにより、メッセージ処理速度全体が遅くなります。これを克服するために、pub-subチャネルとファイルに書き込むservice-activatorの間に余分なレイヤーを追加しました。トランスフォーマーは、何もしませんが、メッセージを消費し、メッセージをファイルライターが消費する直接チャネルに入れます。私の場合、これはパフォーマンスが向上しましたが、これが正しい方法であるかどうか疑問に思っていましたか?以下の設定例:それは本当にあなたの設定によって<queue>であるため、すべてのバッファリングSpring統合publish-subscribeチャネル

<int:publish-subscribe-channel id="pschannel"/> 
<int:service-activator id="kafkaSA" ref="producer" input- channel="pschannel" method="publish"/> 
<int:transformer input-channel="pschannel" ref="dummytransformer" method="doNothing" output-channel="directChannel"/> 
<bean id="dummytransformer" class="org.test.DummyTransformer"/> 
<int:channel id="directChannel"> 
    <int:queue capacity="200000" /> 
<int:channel> 
<int:service-activator id="fileSA" ref="filewriter" input-channel="directChannel" method="publish" > 
    <int:poller max-messages-per-poll="10000" fixed-delay="100" /> 
</int:service-activator> 

答えて

0

まず、それは直接ではありません。

これは本当に1つの方法であり、あなたは間違いなくあなたのKafkaプロデューサー(最初のサブスクライバ)をブロックしません。そのdirectChannel上の消費者がその最高のペースは他の場所に遅れが生じないでメッセージを処理します

<int:channel id="directChannel"> 
    <int:queue/> 
<int:channel> 
... 
<int:poller fixed-delay="100" /> 

この方法:

あなたがキューとポーラーのための無限の設定を検討すべきです。

publish-subscribe-channelの配信を行う別の方法は、publish-subscribe-channeltask-executorです。すべてのサブスクライバが1つのスレッドで実行されます。

しかし、ええ、あなたはいつもカフカとそのファイルプロデューサーの間に遅れがあることを心に留めておくべきです。

DummyTransformer、BTWは必要ありません。問題には特別な<bridge>コンポーネントがあります。http://docs.spring.io/spring-integration/reference/html/messaging-channels-section.html#bridge

関連する問題