首页 > 解决方案 > 如何在 Kubernetes 网络中使用 Apache ActiveMQ Artemis

问题描述

我已经使用 jgroups 在 kubernetes 中设置了一个集群,并且集群似乎形成正确,每个节点都有一个本地 ip 和一个公共 ip,当我使用公共 ip 连接到其中一个节点时一切都很好,但是可用节点列表返回给客户端(wildfly实例)包含节点的本地ip而不是它们的公共ip,我已经定义了带有公共ip的连接器

<connectors>
     <connector name="netty-connector">tcp://{public ip}:61616</connector>
    </connectors>

然后将广播配置为

<broadcast-groups>
 <broadcast-group name="my-broadcast-group">
  <broadcast-period>5000</broadcast-period>
  <jgroups-file>jgroups-file_ping.xml</jgroups-file>
  <jgroups-channel>activemq_broadcast_channel</jgroups-channel>
  <connector-ref>netty-connector</connector-ref>
</broadcast-group>
</broadcast-groups>

然后将发现配置为

<discovery-groups>
 <discovery-group name="my-discovery-group">
  <jgroups-file>jgroups-file_ping.xml</jgroups-file>
  <jgroups-channel>activemq_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>STRICT</message-load-balancing>
        <max-hops>1</max-hops>
        <discovery-group-ref discovery-group-name="my-discovery-group"/>
     </cluster-connection>
  </cluster-connections>

每当我强制节点关闭客户端重新连接但失败并报告节点的本地 ip 时,我的印象是代理中定义的连接器用于向集群的其他成员广播但它使用本地 ip 是对吗?

Wildfly 运行并发送和接收消息,但每隔几分钟我就会收到以下日志

14:27:31,463 WARN  [org.apache.activemq.artemis.service.extensions.xa.recovery] (Periodic Recovery) AMQ122015: Can not connect to XARecoveryConfig [transportConfiguration=[TransportConfiguration(name=, factory=org-apache-activemq-artemis-core-remoting-impl-netty-NettyConnectorFactory) ?trustStorePassword=****&port=61616&sslEnabled=true&host=x-x-x-x&trustStorePath=client-ts], discoveryConfiguration=null, username=username, password=****, JNDI_NAME=java:/RemoteJmsXA] on auto-generated resource recovery: ActiveMQNotConnectedException[errorType=NOT_CONNECTED message=AMQ119007: Cannot connect to server(s). Tried with all available servers.]at org.apache.activemq.artemis.core.client.impl.ServerLocatorImpl.createSessionFactory(ServerLocatorImpl.java:797)
at org.apache.activemq.artemis.service.extensions.xa.recovery.ActiveMQXAResourceWrapper.connect(ActiveMQXAResourceWrapper.java:311)
at org.apache.activemq.artemis.service.extensions.xa.recovery.ActiveMQXAResourceWrapper.getDelegate(ActiveMQXAResourceWrapper.java:239)
at org.apache.activemq.artemis.service.extensions.xa.recovery.ActiveMQXAResourceWrapper.recover(ActiveMQXAResourceWrapper.java:69)
at org.apache.activemq.artemis.service.extensions.xa.ActiveMQXAResourceWrapperImpl.recover(ActiveMQXAResourceWrapperImpl.java:106)
at com.arjuna.ats.internal.jta.recovery.arjunacore.XARecoveryModule.xaRecoveryFirstPass(XARecoveryModule.java:634)
at com.arjuna.ats.internal.jta.recovery.arjunacore.XARecoveryModule.periodicWorkFirstPass(XARecoveryModule.java:226)
at com.arjuna.ats.internal.jta.recovery.arjunacore.XARecoveryModule.periodicWorkFirstPass(XARecoveryModule.java:171)
at com.arjuna.ats.internal.arjuna.recovery.PeriodicRecovery.doWorkInternal(PeriodicRecovery.java:770)
at com.arjuna.ats.internal.arjuna.recovery.PeriodicRecovery.run(PeriodicRecovery.java:382)

标签: networkingwildflyactivemq-artemis

解决方案


通过为每个 pod 创建一个服务并将公共 ip 放入每个节点的连接器定义中,最终让它工作


推荐阅读