我有一个spring集成应用程序,它有一个带有两个订阅者的pub-sub通道 - 一个将消息发布到Kafka,另一个将消息写入文件。问题是将消息写入文件的服务激活器无法跟上生成Kafka的其他服务激活器的速度。这会导致整体邮件处理速度变慢。为了解决这个问题,我在pub-sub通道和写入文件的服务激活器之间添加了一个额外的层。变换器,它只消耗消息并将消息放入文件写入器消耗的直接通道中。这在我的情况下改善了性能,但我想知道这是否是正确的方法?以下示例配置:
<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)
首先,它不是直接,因为您的配置确实是<queue>
。
嗯,这真的是一种方式,你肯定不会阻止你的Kafka制作人(第一个用户)。
您应该考虑队列和轮询器的无限配置:
<int:channel id="directChannel">
<int:queue/>
<int:channel>
...
<int:poller fixed-delay="100" />
这样directChannel
上的消费者将以最佳速度处理消息,而不会在其他地方造成滞后。
另一种分发方式是task-executor
的{{1}} - 所有订阅者都将在他们的一个帖子中执行。
但是,是的,你应该记住,你总是会在Kafka和那个档案制作人之间有一段时间。
你不需要任何publish-subscribe-channel
,BTW。关于此问题有一个特殊的DummyTransformer
组件:http://docs.spring.io/spring-integration/reference/html/messaging-channels-section.html#bridge