Spring integration Spring集成线程限制
我们有一个SI应用程序,用于路由消息、执行一些验证、转换和过滤 本质上,它使用来自各种队列的JMS消息,并将它们路由到预先注册的下游出站JMS队列 我们通过spring配置管理所有这些 在1个JVM中,我们有几百(400-500)个队列通道和相关的轮询器 我们注意到,随着规模的扩大(添加新的入站+出站路由),我们的性能有所下降 我们似乎没有对机箱(CPU、内存等)产生影响,但似乎都没有得到充分利用 当分析应用程序时,看起来是这样的Spring integration Spring集成线程限制,spring-integration,Spring Integration,我们有一个SI应用程序,用于路由消息、执行一些验证、转换和过滤 本质上,它使用来自各种队列的JMS消息,并将它们路由到预先注册的下游出站JMS队列 我们通过spring配置管理所有这些 在1个JVM中,我们有几百(400-500)个队列通道和相关的轮询器 我们注意到,随着规模的扩大(添加新的入站+出站路由),我们的性能有所下降 我们似乎没有对机箱(CPU、内存等)产生影响,但似乎都没有得到充分利用 当分析应用程序时,看起来是这样的 总共可运行约650个线程 0-2阻隔0(有时峰值在10左右,似
- 总共可运行约650个线程
- 0-2阻隔0(有时峰值在10左右,似乎找不到阻隔的内容)
- 网络I/O~100+(通常等待JMS接收)
- 等待约500
为什么有这么多排队通道?在一个流中有多个异步切换(如果有)是不寻常的,而且通常是不必要的。通常根本不需要,尤其是在使用消息驱动的入站端点(如JMS消息驱动适配器)时 这是因为线程和并发可以完全由适配器的消息侦听器容器管理 最有效的配置是将入站适配器上的并发性(线程数)设置为所需的并发性,并在整个过程中使用直接通道
事实上,如果您希望没有丢失消息的可能性,这是必需的;一旦消息在队列通道中传递,JMS消息即被确认(默认情况下)。隔离需要几个队列通道(在当前设计中)。通常,入站消息会被复制并发送到多个下游通道。我们希望(我假设,是由其他人构建的)将消息侦听器和线程解耦,这样,如果一个订阅者出现问题(JMS关闭、消息转换错误等),它对其他订阅者的影响就会更小。这种隔离/解耦通常可以通过每个流中的单个队列(或执行器)通道实现(或者通常最多“几个”)正如你所说)。在我看来,“几百个”听起来像是对基本概念的误解。如果我们有几百个不同的流需要隔离呢?假设我们有一条信息需要传达给25个下游消费者。现在如果我们有大约一百种这样的配置,你可以看到事情很快就会失控。我们从什么时候开始将它们拆分为不同的JVM?还是我们以一种无法维持的方式进行?