【发布时间】:2014-10-07 21:17:25
【问题描述】:
我们有一个 SI 应用程序,用于路由消息、进行一些验证、转换和过滤。
本质上,它使用来自各种队列的 JMS 消息并将它们路由到预先注册的下游出站 JMS 队列。
我们通过 spring 配置管理所有这些。
在 1 个 JVM 中,我们有数百个(400-500)个队列通道和相关的轮询器。
我们注意到,随着我们扩大规模(添加新的入站 + 出站路由),我们的性能有所下降。
我们似乎没有对盒子产生影响(CPU、内存等),所有这些似乎都没有得到充分利用。
当分析应用程序看起来像这样,
- ~650 线程总数可运行
- 0-2 Blocked 0(有时会飙升到 10 左右,似乎找不到他们的阻塞点)
- 在 Net I/O ~100+(通常等待 JMS 接收)
- 等待 ~500
我们已经从容量的角度对应用程序进行了负载测试,但正在从入站 + 出站处理流程的扩展中查看它。
我们在机器上运行了其中的几个(都指向不同的外部 JMS 资源),但我们只看到其中一个 JVM(配置了最多入站 + 出站流的那个)运行缓慢。
从长远的角度来看,我们试图理解
- 在轮询器 + 队列通道方面,SI 是否有扩展限制?
- 大概有些限度,什么症状,怎么检测?
- 这里有什么限制,线程上下文切换?还有什么?
- 我们使用的是旧版本的 SI (1) 是否已针对此类架构进行了改进,或者是否需要重新设计?
- 在多个入站和出站通道之间的高并发、事件样式路由的替代架构?每个入站和出站通道仍然有一组可能运行的东西(转换、过滤、验证)
【问题讨论】: