集群 ActiveMQ 中的负载均衡
Load Balancing in Cluster ActiveMQ
假设我在一个集群中有 3 个 ActiveMQ Artemis 代理:
- Broker_01
- Broker_02
- Broker_03
在给定的时间点,每个代理都有多个消费者:
- Broker_01 有 50 个消费者
- Broker_02 有 10 个消费者
- Broker_03 有 10 个消费者
我们假设在这个给定时间点有 70 条消息要发送到该集群中的队列。
我们期望集群完成负载平衡,这样 Broker_01 将收到 50 条消息,Broker_02 10 条消息,Broker_03 也收到 10 条消息,但目前我们正在经历这 70 条消息通过所有 3 个代理随机分发。
是否可以进行任何配置以根据每个代理中的消费者数量分发消息?
我刚刚阅读 the documentation。因此,据我了解,如果我们配置集群连接,ActiveMQ 会基于循环法进行负载平衡。我们的 broker.xml 看起来像这样:
<cluster-connections>
<cluster-connection name="my-cluster">
<connector-ref>amq-v01_connector</connector-ref>
<min-large-message-size>524288</min-large-message-size>
<call-timeout>120000</call-timeout>
<retry-interval>500</retry-interval>
<retry-interval-multiplier>1.5</retry-interval-multiplier>
<max-retry-interval>2000</max-retry-interval>
<use-duplicate-detection>true</use-duplicate-detection>
<message-load-balancing>ON_DEMAND</message-load-balancing>
<max-hops>1</max-hops>
<notification-interval>800</notification-interval>
<notification-attempts>2</notification-attempts>
<static-connectors>
<connector-ref>amq-v02_connector</connector-ref>
</static-connectors>
</cluster-connection>
</cluster-connections>
此外,队列的地址设置如下所示:
<address-setting match="MyQueue">
<address-full-policy>BLOCK</address-full-policy>
<max-size-bytes>50Mb</max-size-bytes>
</address-setting>
我是不是遗漏了什么,所以负载平衡会完成?
下一点将如文档中所述,负载平衡始终基于循环进行,无法配置基于每个节点中消费者数量的负载平衡。
我假设我需要客户端连接负载平衡,因为我们希望根据每个代理中的消费者数量对到达 3 个代理的消息进行负载平衡。如文档中所述,我们可以使用 5 种开箱即用的策略(Round-Robin、First Element 等)。此外,我们可以通过实施 ConnectionLoadBalancingPolicy
来实施我们自己的政策。假设我想实施自己的政策,如何根据消费者的数量来实施?
生产者没有开箱即用的方法来了解每个代理上有多少消费者,然后相应地向这些代理发送消息。
您可以实现自己的 ConnectionLoadBalancingPolicy
。但是,为了确定队列负载平衡策略实现中存在多少消费者,需要知道集群中所有代理的 URL 以及您要向其发送消息的队列的名称,并且无法提供该信息。 ConnectionLoadBalancingPolicy
界面非常 简单。
如果每个节点上的消息太少,我鼓励您首先重新审视您对 3 节点集群的需求。在某些用例中,单个代理可以处理数百万条消息的吞吐量。如果每个节点处理的消息少于 50 条,那么您可能根本不需要集群。
假设我在一个集群中有 3 个 ActiveMQ Artemis 代理:
- Broker_01
- Broker_02
- Broker_03
在给定的时间点,每个代理都有多个消费者:
- Broker_01 有 50 个消费者
- Broker_02 有 10 个消费者
- Broker_03 有 10 个消费者
我们假设在这个给定时间点有 70 条消息要发送到该集群中的队列。
我们期望集群完成负载平衡,这样 Broker_01 将收到 50 条消息,Broker_02 10 条消息,Broker_03 也收到 10 条消息,但目前我们正在经历这 70 条消息通过所有 3 个代理随机分发。
是否可以进行任何配置以根据每个代理中的消费者数量分发消息?
我刚刚阅读 the documentation。因此,据我了解,如果我们配置集群连接,ActiveMQ 会基于循环法进行负载平衡。我们的 broker.xml 看起来像这样:
<cluster-connections>
<cluster-connection name="my-cluster">
<connector-ref>amq-v01_connector</connector-ref>
<min-large-message-size>524288</min-large-message-size>
<call-timeout>120000</call-timeout>
<retry-interval>500</retry-interval>
<retry-interval-multiplier>1.5</retry-interval-multiplier>
<max-retry-interval>2000</max-retry-interval>
<use-duplicate-detection>true</use-duplicate-detection>
<message-load-balancing>ON_DEMAND</message-load-balancing>
<max-hops>1</max-hops>
<notification-interval>800</notification-interval>
<notification-attempts>2</notification-attempts>
<static-connectors>
<connector-ref>amq-v02_connector</connector-ref>
</static-connectors>
</cluster-connection>
</cluster-connections>
此外,队列的地址设置如下所示:
<address-setting match="MyQueue">
<address-full-policy>BLOCK</address-full-policy>
<max-size-bytes>50Mb</max-size-bytes>
</address-setting>
我是不是遗漏了什么,所以负载平衡会完成?
下一点将如文档中所述,负载平衡始终基于循环进行,无法配置基于每个节点中消费者数量的负载平衡。
我假设我需要客户端连接负载平衡,因为我们希望根据每个代理中的消费者数量对到达 3 个代理的消息进行负载平衡。如文档中所述,我们可以使用 5 种开箱即用的策略(Round-Robin、First Element 等)。此外,我们可以通过实施 ConnectionLoadBalancingPolicy
来实施我们自己的政策。假设我想实施自己的政策,如何根据消费者的数量来实施?
生产者没有开箱即用的方法来了解每个代理上有多少消费者,然后相应地向这些代理发送消息。
您可以实现自己的 ConnectionLoadBalancingPolicy
。但是,为了确定队列负载平衡策略实现中存在多少消费者,需要知道集群中所有代理的 URL 以及您要向其发送消息的队列的名称,并且无法提供该信息。 ConnectionLoadBalancingPolicy
界面非常 简单。
如果每个节点上的消息太少,我鼓励您首先重新审视您对 3 节点集群的需求。在某些用例中,单个代理可以处理数百万条消息的吞吐量。如果每个节点处理的消息少于 50 条,那么您可能根本不需要集群。