JBoss EAP 7.2.0 中的负载平衡 ActimeMQ Artemis

Load Balancing ActimeMQ Artemis in JBoss EAP 7.2.0

我们正在开发一个使用 Spring Boot 和 Apache Camel 的应用程序,它正在读取来自 ActiveMQ Artemis 的消息,进行一些转换,然后将其发送到 ActiveMQ Artemis。我们的应用程序在本地 JBoss EAP 7.2.0 中部署为 war 文件。源应用程序和目标应用程序对于我们的应用程序都是远程​​的,它们也部署在 JBoss EAP 7.2.0 上。 Camel 连接到的远程队列是 ActiveMQ Artemis,它是在 JBoss 中创建的,并使用 http-remoting 协议连接。这些设置在每个应用程序只有一个节点时有效。

现在我们让源应用程序和目标应用程序各有 3 个节点(即它们将部署在多个 JBoss 服务器中)。为了访问源应用程序和目标应用程序的前端,我们正在通过负载均衡器配置和访问它们。

我们可以配置负载均衡器从 Camel 层访问源和目标代理吗?将有 3 个源代理和 3 个目标代理。还是在这种情况下将经纪人集群化是唯一的选择?

我们正在考虑队列之间的负载平衡,而不是集群。假设我们有三个队列 q1q2q3 以及相应的代理 b1b2b3。我将在 Camel 层中配置负载平衡器 url,如 http-remoting://<load-balancer-url>:<port>(就像我们在负载平衡 HTTP API 请求时所做的一样)。任何传入的消息都会命中负载均衡器,负载均衡器将决定将消息路由到哪个队列。

您需要您的客户端不使用拓扑,您可以通过在您的 AMQConnectionFactory 上使用“setUseTopologyForLoadBalancing”来实现。如果您从 EAP 获得连接工厂,我认为自 EAP 7.3 以来,这是可在连接工厂上配置的。

JMS 连接是有状态的。当客户端创建连接时,没有指示它将向其发送消息的 queues。 load-balancer 必须将该客户端的连接定向到 b1b2b3,并且它无法确定它应该去哪里。 load-balancer 使用消息传递几乎肯定只能平衡 连接 ,而不是消息。听起来您希望 load-balancing 改为在消息级别。也许你应该看看 Qpid Dispatch Router.

之类的东西

消息传递不使用 HTTP,因此像使用 HTTP API(s) 那样使用 HTTP 负载平衡器将不起作用。 load-balancer 检查 HTTP headers 和路由请求很容易,尤其是因为 HTTP 是无状态的。然而,消息连接是有状态的,协议通常比 HTTP 复杂得多。我不知道有任何 load-balancer 可以按照您想要的消息传递方式工作。