Artemis 集群 - 多个接受器的负载均衡
Artemis cluster - load balancing with multiple acceptors
我有一个 4 个节点的 Artemis 集群(2 个主节点,2 个备份节点)。每个代理都有 2 个接受器 - 一个用于核心协议,一个用于 stomp 协议(因为 stomp 需要前缀 属性)。所以他们有不同的端口。
当我使用 jms-client 2.x 和 ConnectionFactory 从 Spring 引导应用程序连接到集群时,地址和消息在节点之间进行负载平衡。但是当我尝试与 stomp 客户端交互时,它根本没有负载平衡。似乎无法以某种方式识别集群连接。我不确定可能是什么问题。
The documentation 表示消息通过集群连接进行负载平衡:
These cluster connections allow messages to flow between the nodes of the cluster to balance load.
所以也许我需要更多的集群连接和连接器,它们在 broker.xml
?
中配置
我有一个 STOMP 客户端连接到端口 61613 的第一个主节点。当我将消息发送到第一个主节点时,我可以使用来自另一个节点的消息,我可以看到地址是在两个节点。一种是带有齿条轮的被动模式,另一种是带有文件夹符号的主动模式,可以扩展。从应用程序创建的地址每个都只在一个节点上。
以下显示了一个主代理和一个备份代理的代理配置片段:
大师:
<connectors>
<connector name="netty-connector">tcp://localhost:61616</connector>
</connectors>
<acceptors>
<acceptor name="artemis">tcp://localhost:61616?tcpSendBufferSize=1048576;tcpReceiveBufferSize=1048576;protocols=CORE,AMQP,HORNETQ,MQTT,OPENWIRE;useEpoll=true;amqpCredits=1000;amqpLowCredits=300;amqpDuplicateDetection=true</acceptor>
<acceptor name="stomp">tcp://localhost:61613?tcpSendBufferSize=1048576;tcpReceiveBufferSize=1048576;protocols=STOMP;useEpoll=true;anycastPrefix=/queue/;multicastPrefix=/topic/</acceptor>
</acceptors>
<!-- failover config -->
<ha-policy>
<replication>
<master>
<check-for-live-server>true</check-for-live-server>
</master>
</replication>
</ha-policy>
<broadcast-groups>
<broadcast-group name="my-broadcast-group">
<broadcast-period>5000</broadcast-period>
<jgroups-file>test-jgroups-jdbc_ping.xml</jgroups-file>
<jgroups-channel>active_broadcast_channel</jgroups-channel>
<connector-ref>netty-connector</connector-ref>
</broadcast-group>
</broadcast-groups>
<discovery-groups>
<discovery-group name="my-discovery-group">
<jgroups-file>test-jgroups-jdbc_ping.xml</jgroups-file>
<jgroups-channel>active_broadcast_channel</jgroups-channel>
<refresh-timeout>10000</refresh-timeout>
</discovery-group>
</discovery-groups>
<cluster-connections>
<cluster-connection name="my-cluster">
<connector-ref>netty-connector</connector-ref>
<retry-interval>500</retry-interval>
<use-duplicate-detection>true</use-duplicate-detection>
<message-load-balancing>ON_DEMAND</message-load-balancing>
<max-hops>1</max-hops>
<discovery-group-ref discovery-group-name="my-discovery-group"/>
</cluster-connection>
</cluster-connections>
备份:
<connectors>
<connector name="netty-connector">tcp://localhost:61617</connector>
<connector name="server1-netty-live-connector">tcp://localhost:61616</connector>
</connectors>
<acceptors>
<acceptor name="artemis">tcp://localhost:61617?tcpSendBufferSize=1048576;tcpReceiveBufferSize=1048576;protocols=CORE,AMQP,STOMP,HORNETQ,MQTT,OPENWIRE;useEpoll=true;amqpCredits=1000;amqpLowCredits=300;amqpDuplicateDetection=true</acceptor>
<acceptor name="stomp">tcp://localhost:61614?tcpSendBufferSize=1048576;tcpReceiveBufferSize=1048576;protocols=STOMP;useEpoll=true;anycastPrefix=/queue/;multicastPrefix=/topic/</acceptor>
</acceptors>
<cluster-user>user</cluster-user>
<cluster-password>pw</cluster-password>
<!-- failover config -->
<ha-policy>
<replication>
<slave>
<allow-failback>true</allow-failback>
</slave>
</replication>
</ha-policy>
<broadcast-groups>
<broadcast-group name="my-broadcast-group">
<broadcast-period>5000</broadcast-period>
<jgroups-file>test-jgroups-jdbc_ping.xml</jgroups-file>
<jgroups-channel>active_broadcast_channel</jgroups-channel>
<connector-ref>netty-connector</connector-ref>
</broadcast-group>
</broadcast-groups>
<discovery-groups>
<discovery-group name="my-discovery-group">
<jgroups-file>test-jgroups-jdbc_ping.xml</jgroups-file>
<jgroups-channel>active_broadcast_channel</jgroups-channel>
<refresh-timeout>10000</refresh-timeout>
</discovery-group>
</discovery-groups>
<cluster-connections>
<cluster-connection name="my-cluster">
<connector-ref>netty-connector</connector-ref>
<retry-interval>500</retry-interval>
<use-duplicate-detection>true</use-duplicate-detection>
<message-load-balancing>ON_DEMAND</message-load-balancing>
<max-hops>1</max-hops>
<discovery-group-ref discovery-group-name="my-discovery-group"/>
</cluster-connection>
</cluster-connections>
有人能帮忙吗?
根据您目前提供的所有信息,一切似乎都运行良好。您引用的文档说:
These cluster connections allow messages to flow between the nodes of the cluster to balance load.
当您将 STOMP 消息发送到一个节点时,您可以从另一个节点使用它,这意味着消息根据需要流经节点之间的集群连接以平衡负载。
您不需要任何额外的集群连接或连接器。
需要明确的是,集群中的每个代理都有自己的一组地址、队列和消息,具体取决于连接到它们的客户端正在做什么。您不一定期望在集群的所有不同节点上看到所有相同的地址或队列 - 特别是如果您依赖于自动创建地址和队列而不是在 broker.xml
中预先配置它们。
也就是说,您 将 看到使用 JMS 客户端的应用程序(例如您的 Spring 应用程序)和使用 STOMP 的应用程序的一些不同行为。这是因为 STOMP 协议没有定义任何与连接负载平衡、故障转移等高级概念相关的内容。STOMP 是一个非常简单的协议,客户端通常也非常简单。此外,Spring 应用程序通常会创建多个连接。这些连接以循环方式在集群中的节点之间进行平衡,这几乎可以肯定是为什么那些相关的地址和队列出现在所有节点上,而单个 STOMP 客户端的地址和队列却没有出现的原因。 the documentation.
中进一步讨论了客户端连接负载平衡
消息 由节点自己分发,与所使用的协议无关。这就是集群连接的全部目的——将消息转发到其他节点。
客户端连接不能由节点本身自动分发,因为这需要重定向,而且并非所有协议(例如 STOMP)都支持这些语义。
我有一个 4 个节点的 Artemis 集群(2 个主节点,2 个备份节点)。每个代理都有 2 个接受器 - 一个用于核心协议,一个用于 stomp 协议(因为 stomp 需要前缀 属性)。所以他们有不同的端口。
当我使用 jms-client 2.x 和 ConnectionFactory 从 Spring 引导应用程序连接到集群时,地址和消息在节点之间进行负载平衡。但是当我尝试与 stomp 客户端交互时,它根本没有负载平衡。似乎无法以某种方式识别集群连接。我不确定可能是什么问题。
The documentation 表示消息通过集群连接进行负载平衡:
These cluster connections allow messages to flow between the nodes of the cluster to balance load.
所以也许我需要更多的集群连接和连接器,它们在 broker.xml
?
我有一个 STOMP 客户端连接到端口 61613 的第一个主节点。当我将消息发送到第一个主节点时,我可以使用来自另一个节点的消息,我可以看到地址是在两个节点。一种是带有齿条轮的被动模式,另一种是带有文件夹符号的主动模式,可以扩展。从应用程序创建的地址每个都只在一个节点上。
以下显示了一个主代理和一个备份代理的代理配置片段:
大师:
<connectors>
<connector name="netty-connector">tcp://localhost:61616</connector>
</connectors>
<acceptors>
<acceptor name="artemis">tcp://localhost:61616?tcpSendBufferSize=1048576;tcpReceiveBufferSize=1048576;protocols=CORE,AMQP,HORNETQ,MQTT,OPENWIRE;useEpoll=true;amqpCredits=1000;amqpLowCredits=300;amqpDuplicateDetection=true</acceptor>
<acceptor name="stomp">tcp://localhost:61613?tcpSendBufferSize=1048576;tcpReceiveBufferSize=1048576;protocols=STOMP;useEpoll=true;anycastPrefix=/queue/;multicastPrefix=/topic/</acceptor>
</acceptors>
<!-- failover config -->
<ha-policy>
<replication>
<master>
<check-for-live-server>true</check-for-live-server>
</master>
</replication>
</ha-policy>
<broadcast-groups>
<broadcast-group name="my-broadcast-group">
<broadcast-period>5000</broadcast-period>
<jgroups-file>test-jgroups-jdbc_ping.xml</jgroups-file>
<jgroups-channel>active_broadcast_channel</jgroups-channel>
<connector-ref>netty-connector</connector-ref>
</broadcast-group>
</broadcast-groups>
<discovery-groups>
<discovery-group name="my-discovery-group">
<jgroups-file>test-jgroups-jdbc_ping.xml</jgroups-file>
<jgroups-channel>active_broadcast_channel</jgroups-channel>
<refresh-timeout>10000</refresh-timeout>
</discovery-group>
</discovery-groups>
<cluster-connections>
<cluster-connection name="my-cluster">
<connector-ref>netty-connector</connector-ref>
<retry-interval>500</retry-interval>
<use-duplicate-detection>true</use-duplicate-detection>
<message-load-balancing>ON_DEMAND</message-load-balancing>
<max-hops>1</max-hops>
<discovery-group-ref discovery-group-name="my-discovery-group"/>
</cluster-connection>
</cluster-connections>
备份:
<connectors>
<connector name="netty-connector">tcp://localhost:61617</connector>
<connector name="server1-netty-live-connector">tcp://localhost:61616</connector>
</connectors>
<acceptors>
<acceptor name="artemis">tcp://localhost:61617?tcpSendBufferSize=1048576;tcpReceiveBufferSize=1048576;protocols=CORE,AMQP,STOMP,HORNETQ,MQTT,OPENWIRE;useEpoll=true;amqpCredits=1000;amqpLowCredits=300;amqpDuplicateDetection=true</acceptor>
<acceptor name="stomp">tcp://localhost:61614?tcpSendBufferSize=1048576;tcpReceiveBufferSize=1048576;protocols=STOMP;useEpoll=true;anycastPrefix=/queue/;multicastPrefix=/topic/</acceptor>
</acceptors>
<cluster-user>user</cluster-user>
<cluster-password>pw</cluster-password>
<!-- failover config -->
<ha-policy>
<replication>
<slave>
<allow-failback>true</allow-failback>
</slave>
</replication>
</ha-policy>
<broadcast-groups>
<broadcast-group name="my-broadcast-group">
<broadcast-period>5000</broadcast-period>
<jgroups-file>test-jgroups-jdbc_ping.xml</jgroups-file>
<jgroups-channel>active_broadcast_channel</jgroups-channel>
<connector-ref>netty-connector</connector-ref>
</broadcast-group>
</broadcast-groups>
<discovery-groups>
<discovery-group name="my-discovery-group">
<jgroups-file>test-jgroups-jdbc_ping.xml</jgroups-file>
<jgroups-channel>active_broadcast_channel</jgroups-channel>
<refresh-timeout>10000</refresh-timeout>
</discovery-group>
</discovery-groups>
<cluster-connections>
<cluster-connection name="my-cluster">
<connector-ref>netty-connector</connector-ref>
<retry-interval>500</retry-interval>
<use-duplicate-detection>true</use-duplicate-detection>
<message-load-balancing>ON_DEMAND</message-load-balancing>
<max-hops>1</max-hops>
<discovery-group-ref discovery-group-name="my-discovery-group"/>
</cluster-connection>
</cluster-connections>
有人能帮忙吗?
根据您目前提供的所有信息,一切似乎都运行良好。您引用的文档说:
These cluster connections allow messages to flow between the nodes of the cluster to balance load.
当您将 STOMP 消息发送到一个节点时,您可以从另一个节点使用它,这意味着消息根据需要流经节点之间的集群连接以平衡负载。
您不需要任何额外的集群连接或连接器。
需要明确的是,集群中的每个代理都有自己的一组地址、队列和消息,具体取决于连接到它们的客户端正在做什么。您不一定期望在集群的所有不同节点上看到所有相同的地址或队列 - 特别是如果您依赖于自动创建地址和队列而不是在 broker.xml
中预先配置它们。
也就是说,您 将 看到使用 JMS 客户端的应用程序(例如您的 Spring 应用程序)和使用 STOMP 的应用程序的一些不同行为。这是因为 STOMP 协议没有定义任何与连接负载平衡、故障转移等高级概念相关的内容。STOMP 是一个非常简单的协议,客户端通常也非常简单。此外,Spring 应用程序通常会创建多个连接。这些连接以循环方式在集群中的节点之间进行平衡,这几乎可以肯定是为什么那些相关的地址和队列出现在所有节点上,而单个 STOMP 客户端的地址和队列却没有出现的原因。 the documentation.
中进一步讨论了客户端连接负载平衡消息 由节点自己分发,与所使用的协议无关。这就是集群连接的全部目的——将消息转发到其他节点。
客户端连接不能由节点本身自动分发,因为这需要重定向,而且并非所有协议(例如 STOMP)都支持这些语义。