我正在写一个服务,它服务于无状态的传入请求。这些请求都是数学计算,执行时间不会很长(最多2ms)。
我使用Tibco EMS在客户端/服务器之间进行通信。提供了一个客户端库,该客户端库包装了客户端逻辑(例如,将数据转换为EMS消息等)并将请求发送到请求队列。服务器端处理请求,并将响应发送到单独的队列中。这很好。
服务器端是多线程的。收到新的传入请求时,将创建一个新线程。因此,请求是同时处理的。
服务器端使用一个单一的EMS连接到EMS服务器。但是,由于EMS会话不是线程安全的,因此,如果我希望能够将响应写入每个线程中的EMS队列,则必须使用connectionFactory为每个线程创建一个会话。这降低了性能。
花费在交通上的时间约为3-4毫秒,即发送请求和收到响应之间的时间约为5-6毫秒(运输为3-4毫秒,元组/非元组为2毫秒)。
有什么解决方案可以让我并发发送到EMS队列而无需创建两个太多的JMS对象?
我还需要遵循其他重要规则来进一步优化服务吗?已经遵循一些基本的优化准则:
使用CachedConnectionPool
以NON_PERSISTANT的形式发送JMS消息
对所有请求使用一个EMS连接。
非常感谢你。
最佳答案
您遇到的行为并不特定于EMS。该行为由JMS规范本身决定。这是JMS规范的2.8节的摘录:
限制对会话的并发访问有两个原因。首先,会话是支持事务的JMS实体。实现多线程事务非常困难。其次,会话支持异步消息使用。重要的是,JMS不需要用于异步消息使用的客户端代码能够处理多个并发消息。另外,如果已使用多个异步使用者建立了会话,则重要的是不要强制客户端处理这些独立使用者同时执行的情况。这些限制使JMS易于用于典型客户端。更复杂的客户端可以通过使用多个会话来获得所需的并发性。
如果要避免创建(和销毁)那么多对象,则可能需要预创建线程池,并为每个线程预先分配一个会话。