Spring integration 缓冲Spring集成发布-订阅通道

Spring integration 缓冲Spring集成发布-订阅通道,spring-integration,Spring Integration,我有一个spring集成应用程序,它有一个带有两个订阅者的发布子频道——一个将消息发布到Kafka,另一个将消息写入文件。问题在于,将消息写入文件的服务激活器无法跟上向Kafka生成消息的其他服务激活器的速度。这会导致整体消息处理速度减慢。为了克服这个问题,我在发布子通道和写入文件的服务激活器之间添加了一个额外的层。作为转换器,只会使用消息并将消息放入filewriter使用的直接通道中。这在我的案例中提高了性能,但我想知道这是否是正确的方法?下面是配置示例: <int:publish-s

我有一个spring集成应用程序,它有一个带有两个订阅者的发布子频道——一个将消息发布到Kafka,另一个将消息写入文件。问题在于,将消息写入文件的服务激活器无法跟上向Kafka生成消息的其他服务激活器的速度。这会导致整体消息处理速度减慢。为了克服这个问题,我在发布子通道和写入文件的服务激活器之间添加了一个额外的层。作为转换器,只会使用消息并将消息放入filewriter使用的直接通道中。这在我的案例中提高了性能,但我想知道这是否是正确的方法?下面是配置示例:

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

首先,它不是直接的,因为它实际上是由您的配置所决定的

好吧,这真的是一种方法,你绝对不会阻止你的卡夫卡制作人(第一个订户)

你应该考虑队列和Pelever的无限配置:

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

...
这样,
directChannel
上的消费者将以最佳速度处理消息,而不会在其他地方造成延迟

另一种分发方式是
发布订阅频道的
任务执行器
——所有订阅服务器都将在一个线程中执行

但是,无论如何,你都应该记住,在卡夫卡和那个文件制作人之间,你总是会有一个滞后

顺便说一句,您不需要任何
DummyTransformer
。在这方面有一个特殊的
组件: