ActiveMQ Artemis配置双连接路由器至不同集群遇ROUND_ROBIN重复ID报错求助
ActiveMQ Artemis 连接路由器配置问题
问题背景
使用ActiveMQ Artemis 2.35.0版本,尝试配置一个Broker包含两个连接路由器,分别指向不同集群,且均采用ROUND_ROBIN策略。启动Broker时出现以下错误:
AMQ214019: Invalid configuration Caused by: org.xml.sax.SAXParseException; cvc-id.2: There are multiple occurrences of ID value 'ROUND_ROBIN'.
将策略名称改为非重复值后,Broker可正常启动。相关配置片段如下:
<acceptors> <acceptor name="artemis-dsv">tcp://0.0.0.0:61616?router=evenly-balance;tcpSendBufferSize=1048576;tcpReceiveBufferSize=1048576;amqpMinLargeMessageSize=102400;protocols=CORE,AMQP,STOMP,HORNETQ,MQTT,OPENWIRE;useEpoll=true;amqpCredits=1000;amqpLowCredits=300;amqpDuplicateDetection=true;supportAdvisory=false;suppressInternalManagementObjects=false</acceptor> <acceptor name="artemis-hmg">tcp://0.0.0.0:62626?router=router-hmg;tcpSendBufferSize=1048576;tcpReceiveBufferSize=1048576;amqpMinLargeMessageSize=102400;protocols=CORE,AMQP,STOMP,HORNETQ,MQTT,OPENWIRE;useEpoll=true;amqpCredits=1000;amqpLowCredits=300;amqpDuplicateDetection=true;supportAdvisory=false;suppressInternalManagementObjects=false</acceptor> </acceptors> <connection-routers> <connection-router name="evenly-balance"> <key-type>CLIENT_ID</key-type> <key-filter>^.{3}</key-filter> <policy name="ROUND_ROBIN"/> <pool> <username>xxx</username> <password>yyy</password> <static-connectors> <connector-ref>server1</connector-ref> <connector-ref>server2</connector-ref> </static-connectors> </pool> </connection-router> <connection-router name="router-hmg"> <key-type>CLIENT_ID</key-type> <key-filter>^.{3}</key-filter> <policy name="ROUND_ROBIN"/> <pool> <username>zzz</username> <password>ccc</password> <static-connectors> <connector-ref>server3</connector-ref> <connector-ref>server4</connector-ref> </static-connectors> </pool> </connection-router> </connection-routers>
核心疑问:是否可以使用一个连接路由器Broker对接不同集群?
解答
错误原因
报错cvc-id.2是因为XML Schema将<policy>元素的name属性定义为全局唯一ID,两个连接路由器均使用name="ROUND_ROBIN"违反了ID唯一性约束,导致配置校验失败。
核心结论
完全可以用一个ActiveMQ Artemis Broker对接不同集群,只需调整配置解决策略名称重复问题,以下是两种可行方案:
方案1:定义全局共享策略
单独定义一个全局的ROUND_ROBIN策略,然后在两个连接路由器中引用该策略,避免重复ID:
<policies> <policy name="ROUND_ROBIN" type="ROUND_ROBIN"/> </policies> <connection-routers> <connection-router name="evenly-balance"> <key-type>CLIENT_ID</key-type> <key-filter>^.{3}</key-filter> <policy-ref name="ROUND_ROBIN"/> <pool> <username>xxx</username> <password>yyy</password> <static-connectors> <connector-ref>server1</connector-ref> <connector-ref>server2</connector-ref> </static-connectors> </pool> </connection-router> <connection-router name="router-hmg"> <key-type>CLIENT_ID</key-type> <key-filter>^.{3}</key-filter> <policy-ref name="ROUND_ROBIN"/> <pool> <username>zzz</username> <password>ccc</password> <static-connectors> <connector-ref>server3</connector-ref> <connector-ref>server4</connector-ref> </static-connectors> </pool> </connection-router> </connection-routers>
方案2:给内嵌策略设置唯一名称并指定类型
保留每个连接路由器内的内嵌策略,给它们设置不同的name作为唯一ID,同时通过type属性指定ROUND_ROBIN策略类型:
<connection-routers> <connection-router name="evenly-balance"> <key-type>CLIENT_ID</key-type> <key-filter>^.{3}</key-filter> <policy name="round-robin-dsv" type="ROUND_ROBIN"/> <pool> <username>xxx</username> <password>yyy</password> <static-connectors> <connector-ref>server1</connector-ref> <connector-ref>server2</connector-ref> </static-connectors> </pool> </connection-router> <connection-router name="router-hmg"> <key-type>CLIENT_ID</key-type> <key-filter>^.{3}</key-filter> <policy name="round-robin-hmg" type="ROUND_ROBIN"/> <pool> <username>zzz</username> <password>ccc</password> <static-connectors> <connector-ref>server3</connector-ref> <connector-ref>server4</connector-ref> </static-connectors> </pool> </connection-router> </connection-routers>
两种方案均可让Broker正常启动,同时实现两个连接路由器分别对接不同集群并使用ROUND_ROBIN负载均衡策略。
内容的提问来源于stack exchange,提问作者Felipe Pereira
相关产品推荐
相关产品推荐

