缓冲Spring集成发布 - 订阅频道

时间:2017-05-23 09:16:58

标签: spring-integration

我有一个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>

1 个答案:

答案 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