1

我想我理解MOMor背后的想法Message Queues,但我不确定下面的实现细节。
由于有一个元素充当调度程序,因此它必须具有到所有客户端的持久 TCP 连接(因为可靠性是一项要求)。
因此,对于客户端,即使当前没有通信,N我们也始终打开(N 任意高)连接。 这个对吗? 流行框架的健壮实现如何处理这个问题?N

4

2 回答 2

2

如果您有n 个客户端,则您有n 个连接。

可能还有其他的:如果您使用 JNDI 查找了队列/连接工厂等,那么还有另一个连接到 JNDI 端口和 RMI 注册表(使用 JBoss 6 观察)。

另一方面,如果消息传递服务器使用select()TCP 套接字,则仅使用一个线程处理大量连接非常有效。至于连接/套接字的数量,看看这个问题:有多少个套接字连接是可能的

我不知道使用 UDP(包括可靠性)的 JMS 实现。所以你无法真正解决它,因为 JMS 使用 TCP 特性来实现可靠和“有序”的分组传递。

  • 例如,如果延迟不是问题,客户端总是可以每分钟“连接、读取、断开”。

  • 至于 ActiveMQ,它提供 UDP 传输,请参见此处。在这种情况下,由您来处理可靠性问题。

  • 如果您担心连接/客户端的数量,您可以考虑使用自己的协议作为替代方案的“原始 UDP”。

相关:何时选择 JMS API over UDP

于 2013-07-31T17:52:10.567 回答
1

假设客户端想要实时接收消息,那么是的,需要与 JMS 服务器的主动且持续的连接。

独立 JMS 客户端使用专用连接,因此 1 个客户端=1 个连接。另一方面,在应用程序服务器内运行的消息驱动 bean 重用池中的连接和会话对象,该池通常可在应用程序服务器中配置以限制这些对象的数量,但是,连接是“持续”连接的到 JMS 服务器;在应用服务器中的实现方式因产品而异。因此,在应用服务器中,如果您有 20 个 MDB 的消费消息,但将池配置为最多使用 10 个连接,则可以确保只会打开 10 个连接。

非活动连接
队列客户端不必连接到服务器,但消息会累积在队列中,当客户端连接时,所有消息将按顺序传递。

连接
断开 如果连接断开,客户端(或容器;而不是 JMS 服务器)必须重新连接,然后才能再次使用消息。

您是否关心与 JMS 服务器的连接数?您指的是独立的 JMS 客户端还是 MDB?

于 2013-07-31T00:02:16.687 回答