0

我正在编写一个服务于无状态传入请求的服务。这些请求都是数学计算,执行时​​间不会很长(最多 2 毫秒)。

我使用 Tibco EMS 在客户端/服务器之间进行通信。提供了一个客户端库,它封装了客户端逻辑(例如将数据转换为 EMS 消息等)并将请求发送到请求队列。服务器端处理请求并将响应发送到单独的队列中。这工作正常。

服务器端是多线程的。当接收到新的传入请求时,将创建一个新线程。因此请求是同时处理的。

服务器端使用单个 EMS 连接到 EMS 服务器。但是,因为 EMS Session 不是线程安全的,如果我希望能够在每个线程中写入对 EMS 队列的响应,我必须使用 connectionFactory 为每个线程创建一个会话。这降低了性能。

在流量上花费的时间大约是 3-4ms,即从发送请求到收到响应之间的时间大约是 5-6ms。(3-4ms 用于传输,marshal/unmarshal,2ms 用于计算)。

是否有任何解决方案允许我在不创建两个 JMS 对象的情况下同时发送到 EMS 队列?

我是否需要遵循其他重要规则来进一步优化服务?已经遵循了一些基本的优化指南:

  1. 使用 CachedConnectionPool
  2. 以 NON_PERSISTANT 形式发送 JMS 消息
  3. 对所有请求使用一个 EMS 连接。

非常感谢。

4

1 回答 1

1

您遇到的行为并非 EMS 特有的。该行为由 JMS 规范本身规定。以下是 JMS 规范第 2.8 节的摘录:

限制对 Session 的并发访问有两个原因。首先,Sessions 是支持事务的 JMS 实体。实现多线程事务非常困难。其次,Sessions支持异步消息消费。重要的是,JMS 不要求用于异步消息消费的客户端代码能够处理多个并发消息。此外,如果一个 Session 已经设置了多个异步消费者,重要的是不要强迫客户端处理这些单独的消费者同时执行的情况。这些限制使 JMS 更易于用于典型客户端。更复杂的客户端可以通过使用多个会话来获得他们想要的并发性。

如果您想避免创建(和销毁)这么多对象,您可能需要预先创建一个线程池,并预先为每个线程分配一个会话。

于 2015-01-30T12:59:26.997 回答