我最近阅读了很多关于JMS,Spring(和TIBCO EMS)关于连接,会话,消费者和安全的最佳实践。生产者
在春天的世界里工作时,流行的智慧似乎是
AbstractMessageListenerContainer
。CachingConnectionFactory
下的JmsTemplate
来维护与代理的单一连接,然后缓存会话和生产者。对于生成/发布,这是我的(大型)服务器应用程序现在正在做的事情,之前它正在为它发布的每条消息创建一个新的连接/会话/生成器(坏!),因为使用了raw JmsTemplate
下的连接工厂。旧行为有时会导致在高峰时段在短时间内在代理上创建和关闭1,000个连接,甚至会导致套接字/文件句柄限制。
但是,当切换到此模型时,我无法理解使用与代理的单个TCP连接的性能限制/注意事项。我理解JMS提供程序应该确保它可以以多线程方式使用 - 但从实际角度来看
假设我有点走上正轨
非常感谢任何有关该主题或更多阅读经验的想法或指示,即使与其他经纪人也是如此。
答案 0 :(得分:3)
在考虑瓶颈时,请记住两个事实:
TCP是一种流媒体协议,几乎所有JMS提供商都使用基于TCP的协议
TIBCO EMS客户端向EMS服务器的许多操作都是请求/回复。例如,当您发布消息/确认接收消息/提交事务会话时,底层发生的事情是某些TCP数据包是从客户端发出的,服务器也会响应一些数据包。由于TCP流的性质,如果它们是从同一个连接启动的,那么这些动作必须被序列化 - 否则说是从一个线程发布消息,并且在同一时间从另一个线程提交会话,这些数据包将在线路上混合,服务器无法从数据包中解释正确的消息。 [注意:同步是从EMS客户端库级别完成的,因此用户可以随意与多个线程/会话/消费者/生产者共享一个连接]
我自己的经验是多个连接始终输出执行单个连接。在有损网络情况下,绝对必须使用多个连接。在最佳网络条件下,通过多个连接,单个客户端几乎可以使客户端和服务器之间的网络带宽饱和。
也就是说,这实际上取决于您的客户的性能要求,良好网络下的单一连接已经可以提供足够好的性能。
答案 1 :(得分:0)
即使你使用一个连接和100个会话,它最终意味着你 正在使用100threads,它与使用10个连接* 10 sessions =相同 100threads。
在达到系统资源限制
之前,你很好