Mule 中的 ActiveMQ 负载均衡

Posted

技术标签:

【中文标题】Mule 中的 ActiveMQ 负载均衡【英文标题】:ActiveMQ loadbalancing in Mule 【发布时间】:2012-08-19 01:11:17 【问题描述】:

我在使用 Mule 进行 ActiveMQ 负载平衡时遇到问题。我正在使用 Mule 3.2.0 和 ActiveMQ 5.5.1

我有一个 Mule FLow 应用程序,它使用 JMS 入站端点来监听 ActiveMQ 中的队列。 我有 2 个 AMQ 实例运行,每个实例都有一个名为“MyQueue”的队列。 让我们将它们命名为 AMQ1 和 AMQ2。 我还运行了 2 个 mule 实例——每个实例都有相同的应用程序。我们将它们命名为 Mule1 和 Mule2。

现在我希望每个 mule 实例从任一 AMQ 队列中获取消息。所以说消息发送者将消息发送到 AMQ1 或 AMQ2 中的队列 MyQueue (消息发送者使用 ActiveMQ 支持的故障转移传输进行负载平衡 - 并且该位工作正常)。假设它达到了 AMQ1。现在理想情况下,我希望在每个 AMQ 实例中注册 Mule1 和 Mule2 各有 10 个消费者。所以他们俩都在监听两个队列中的传入消息。其中一个应该从队列中取出消息并进行处理。

这是我在 Mule 中用来连接两个 AMQ 代理的配置。

  <jms:activemq-connector name="Active_MQ"  brokerURL="failover:tcp://10.0.64.158:61616,tcp://10.0.64.160:61616)?randomize=true"  eagerConsumer="true" numberOfConsumers="10" dynamicNotification="true" validateConnections="true" clientId="MuleInstance1"  doc:name="Active MQ">
      <reconnect count="5" frequency="3000" blocking="false"/>

  </jms:activemq-connector>

请注意,对于不同的 Mule 实例,clientId 是不同的。目前 AMQ 1 和 Mule1 共享同一台机器,AMQ2 和 Mule2 共享另一台机器。

但是我注意到一些随机行为。有时,所有消费者(Mule1 和 Mule2)只注册到一个 AMQ 实例。有时 Mule1 仅注册到 AMQ1,而 Mule 2 注册到 AMQ2。 理想情况下,我想要的是 Mule1 和 Mule2 的 cosnumers 都注册到 AM1 和 AMQ2 我按照这里的说明 http://www.mulesoft.org/documentation-3.2/display/MULE3USER/ActiveMQ+Integration

基本上我想使用代理架构的网络,这样无论 Mule 实例或 AMQ 实例出现故障还是必须重新启动,都不会丢失服务。 不确定 randomize=true 查询参数在这种情况下是否有帮助。

有人可以建议如何使用 Mule 3.2.0 和 Active MQ 5.5.1 实现上述目标吗?

遗憾的是,如果没有解决方案,我可能不得不让 Mule1 听 AMQ1,而 Mule2 只听 AMQ2,它不会真正被集群化:(

提前致谢。

【问题讨论】:

如果有帮助,我发现添加此链接。但是仍然没有回答上面提到的随机行为。有一个未完成的 jira 请求如下issues.apache.org/jira/browse/AMQ-816。仍在寻求 Mule/ActiveMQ 专家的帮助 这看起来不像是 Mule 问题。你见过这个:***.com/questions/2421198/…?另外,如果 Mule1 连接到 AMQ1 而 Mule2 连接到 AMQ2,为什么你说它不是集群的?代理网络存在于 AMQ1 和 AMQ2 之间,独立于消费者,所以是的,它是集群的。您可以拥有使用 AMQ1-failover-AMQ2 的 Mule1 和使用 AMQ2-failover-AMQ1 的 Mule2,并且是集群/HA。 谢谢大卫。是的,我在我的 Mule 应用程序中使用了相同的故障转移传输协议。我同意这可能不是 Mule 的问题,而更多地与 ActiveMQ 相关,但将其标记为两者,因为某些 mule 用户可能遇到过同样的问题。是的,它将被集群化,但仅适用于可以向 AMQ1 或 AMQ2 发送请求的消息生产者。但是对于 Mule 中的消费者来说,他们只监听一个 AMQ 实例。在这种情况下,如果说一个 Mule 实例(Mule2)出现故障或出现问题,所有发送到 AMQ2 的消息都不会被接收。如果 1 个 AMQ 例如AMQ2 宕机了,然后 Mule2 就完全不用了。 还有 Mule1 amq1-failover-amq2 - 如果 amq1 出现故障,则到 Mule1 amq2 成为主要的,即使 amq1 备份,仍将保持主要状态。所以你最终可能会遇到这样的情况,即 mule1 和 mule2 都只与 amq1 交谈,而到达 amq2 的消息根本没有被接收到。尽管可以使用 AMQ 5.6 中可用的 priorityBackup,但它总是尝试重新连接到本地备份或优先级备份,但不确定这是否会对服务产生影响。此外,我们正在使用 5.5.1,是的,我们可能必须为此升级到 5.6,但目前只是试图避免这种情况 顺便说一句在这里找到了priorityBackup信息..activemq.apache.org/failover-transport-reference.html 【参考方案1】:

搞定了。 对 Mule 论坛本身提出了建议。

http://forum.mulesoft.org/mulesoft/topics/activemq_loadbalancing_with_mule

所以基本上我没有为消费者使用 AMQ 负载平衡,而是使用了 2 个 AMQ 连接器,并在每个 mule 应用程序中使用了一个复合源来监听 2 个入站端点。它是一种享受。启动/关闭 Mule 和 AMQ 实例 - 一切都很好。这是配置

      <jms:activemq-connector  name="Active_MQ_1"  brokerURL="failover:  (tcp://10.0.64.158:61616)"  eagerConsumer="true"  numberOfConsumers="10"  dynamicNotification="true"  validateConnections="true"  clientId="MuleInstance1"  doc:name="Active MQ">
       <reconnect count="5" frequency="3000" blocking="false"/>

     </jms:activemq-connector>
     <jms:activemq-connector  name="Active_MQ_2"  brokerURL="failover:(tcp://10.0.64.160:61616)"  eagerConsumer="true"  numberOfConsumers="10"  dynamicNotification="true"  validateConnections="true"  clientId="MuleInstance1"  doc:name="Active MQ">
     <reconnect count="5" frequency="3000" blocking="false"/>

      </jms:activemq-connector>

现在使用复合源在您的流程中引用它

  <flow name="MyAutomationFlow" doc:name="MyAutomationFlow">
      <composite-source>
          <jms:inbound-endpoint queue="MyOrderQ" connector-ref="Active_MQ1" doc:name="JMS Inbound Endpoint"/>
          <jms:inbound-endpoint queue="MyOrderQ" connector-ref="Active_MQ2" doc:name="JMS Inbound Endpoint"/>
      </composite-source>
   ........

辛苦了!

【讨论】:

以上是关于Mule 中的 ActiveMQ 负载均衡的主要内容,如果未能解决你的问题,请参考以下文章

负载均衡 MessageQ (ActiveMQ)

ActiveMQ实现负载均衡+高可用部署方案(转)

ActiveMQ实现负载均衡+高可用部署方案

JMS之——ActiveMQ高可用+负载均衡集群

ActiveMQ 集群负载平衡

activeMQ能不能配置多个实例的负载均衡,并只连接一个MySQL,将消息持久化存入到一个数据库中?