一部の JMS クライアントを、クラスター構成で実行されている ActiveMQ Artemis (v2.14.0) ブローカーに接続しています。今日、クライアントがクラスター通信専用のアクセプターに接続していることに気付き、なぜそうなるのか疑問に思っています。
関連するスニペットは次のとおりですbroker.xml
。
<configuration xmlns="urn:activemq" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:activemq /schema/artemis-configuration.xsd">
<core xmlns="urn:activemq:core" xsi:schemaLocation="urn:activemq:core ">
[…]
<connectors>
<connector name="netty-connector">tcp://${ipv4addr:localhost}:61618?tcpSendBufferSize=1048576;tcpReceiveBufferSize=1048576;useEpoll=true</connector>
</connectors>
<acceptors>
<!-- Acceptor for every supported protocol -->
<acceptor name="artemis">tcp://0.0.0.0:61616?tcpSendBufferSize=1048576;tcpReceiveBufferSize=1048576;amqpMinLargeMessageSize=102400;protocols=CORE,AMQP,STOMP,HORNETQ,MQTT,OPENWIRE;useEpoll=true;amqpCredits=1000;amqpLowCredits=300;amqpDuplicateDetection=true;connectionsAllowed=10000</acceptor>
<!-- AMQP Acceptor. Listens on default AMQP port for AMQP traffic.-->
<acceptor name="amqp">tcp://0.0.0.0:5672?tcpSendBufferSize=1048576;tcpReceiveBufferSize=1048576;protocols=AMQP;useEpoll=true;amqpCredits=1000;amqpLowCredits=300;amqpMinLargeMessageSize=102400;amqpDuplicateDetection=true</acceptor>
<!-- STOMP Acceptor. -->
<acceptor name="stomp">tcp://0.0.0.0:61613?tcpSendBufferSize=1048576;tcpReceiveBufferSize=1048576;protocols=STOMP;useEpoll=true</acceptor>
<!-- HornetQ Compatibility Acceptor. Enables HornetQ Core and STOMP for legacy HornetQ clients. -->
<acceptor name="hornetq">tcp://0.0.0.0:5445?anycastPrefix=jms.queue.;multicastPrefix=jms.topic.;protocols=HORNETQ,STOMP;useEpoll=true</acceptor>
<!-- MQTT Acceptor -->
<acceptor name="mqtt">tcp://0.0.0.0:1883?tcpSendBufferSize=1048576;tcpReceiveBufferSize=1048576;protocols=MQTT;useEpoll=true</acceptor>
<acceptor name="netty-acceptor">tcp://0.0.0.0:61618?tcpSendBufferSize=1048576;tcpReceiveBufferSize=1048576;useEpoll=true</acceptor>
<acceptor name="artemis-tls">tcp://0.0.0.0:61617?tcpSendBufferSize=1048576;tcpReceiveBufferSize=1048576;amqpMinLargeMessageSize=102400;protocols=CORE,AMQP,STOMP,HORNETQ,MQTT,OPENWIRE;useEpoll=true;amqpCredits=1000;amqpLowCredits=300;amqpDuplicateDetection=true;sslEnabled=true;keyStorePath=/var/lib/artemis/certs/keystore.jks;keyStorePassword=${keyStorePassword};enabledProtocols=TLSv1.2</acceptor>
</acceptors>
<broadcast-groups>
<broadcast-group name="cluster-broadcast-group">
<broadcast-period>5000</broadcast-period>
<jgroups-file>jgroups.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="cluster-discovery-group">
<jgroups-file>jgroups.xml</jgroups-file>
<jgroups-channel>active_broadcast_channel</jgroups-channel>
<refresh-timeout>10000</refresh-timeout>
</discovery-group>
</discovery-groups>
<cluster-connections>
<cluster-connection name="artemis-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>
<!-- <address>jms</address> -->
<max-hops>1</max-hops>
<discovery-group-ref discovery-group-name="cluster-discovery-group"/>
<!-- <forward-when-no-consumers>true</forward-when-no-consumers> -->
</cluster-connection>
</cluster-connections>
</core>
</configuration>
意図としては、クライアント接続にポート 61616 (プレーン TCP、アクセプタartemis
) と 61617 (TLS、アクセプタartemis-tls
) を使用することです。ブローカーは、netty-acceptor
クラスター内部通信にポート 61618 (アクセプタ) を使用します。ただし、トポロジ検出中に、ブローカーはポート 61618 をクライアントに返します (予想されるポート 61616 ではなく)。これは、すべての通信がプレーン TCP の場合は機能しますが、netty-acceptor
クライアント接続が TLS 用に構成されている場合はおかしなことになります。クライアントは次のようなメッセージを表示します。
2020-08-24 17:58:13,833 | WARN | Thread-1 (ActiveMQ-client-netty-threads) | i.n.c.ChannelInitializer | Failed to initialize a channel. Closing: [id: 0x5bb533bc]
java.lang.Exception: Failed to find a store at /var/lib/artemis/certs/truststore.jks
at org.apache.activemq.artemis.core.remoting.impl.ssl.SSLSupport.validateStoreURL(SSLSupport.java:278)
したがって、ブローカーは内部構成をクライアントに渡します。( /var/lib/artemis/certs/truststore.jks
Artemis コンテナ内にのみ存在します。)
ブローカーを専用のクライアントおよびクラスター接続用に構成し、クライアントがクラスター エンドポイントを受信しないようにするにはどうすればよいですか? また、クライアントおよびクラスター接続に対して TLS を個別に構成できますか? ここではドキュメントはあまり役に立ちません。
編集
この問題を再考すると、関連する質問が生まれます。TCP 経由で接続するクライアントが検出中に常に TCP ポートを受信し、TLS 経由で接続するクライアントが TLS ポートを受信するようにするにはどうすればよいでしょうか。
アップデート
詳しく見てみましょうアルテミスドキュメント次のような説明が明らかになる。
この値はサーバー上で構成できますが、クライアントによってダウンロードされて使用されます。
わかりました。少し説明がつきました。しかし、どのコネクタを使用するかをクライアントに伝える方法がまだわかりません。RedHat AMQ 7.2ドキュメントの第6.3章にはこう書かれている
上記のコネクタは、指定された IP とポート 10.10.10.2:61617 に TCP 接続するときに、クライアントまたはブローカー自体によって参照されます。
クライアントが IP アドレスとポートを照合して適切なコネクタを見つけるように提案します。ただし、これは Artemis v2.14.0 では機能しないようです。