14.7. クライアント接続のパーティション設定
クライアント接続のパーティション設定では、クライアントが接続を開始するたびに、個々のクライアントの接続を同じブローカーにルーティングします。
クライアント接続のパーティション設定には、以下の 2 つのユースケースがあります。
- 永続サブスクリプションのクライアントでパーティション設定を行い、サブスクライバーが永続サブスクライバーキューが置かれているブローカーに常に接続するようにします。
- 元のデータにクライアントを引き付けること (データ重力とも呼ばれる) により、データを移動する必要性を最小限に抑えます。
永続サブスクリプション
永続サブスクリプションはブローカー上のキューとして表され、永続サブスクライバーが最初にブローカーに接続したときに作成されます。このキューはブローカー上に残り、クライアントがサブスクライブを解除するまでメッセージを受信します。したがって、クライアントが同じブローカーに繰り返し接続して、サブスクライバーキューにあるメッセージを消費する必要があります。
クライアントを永続的なサブスクリプションキューにパーティション設定するには、クライアント接続でクライアント ID をフィルタリングすることができます。
データ重力
データ重力を考慮せずに環境内のブローカー数をスケールアップすると、ブローカー間でメッセージを移動する必要があるため、パフォーマンス上の利点の一部が失われます。データ重力をサポートするために、クライアント接続をパーティション設定して、クライアントコンシューマーが消費する必要があるメッセージが生成されたブローカーに接続するようにする必要があります。
データ重力をサポートするためにクライアント接続をパーティション設定するには、クライアント接続の次の属性のいずれかをフィルタリングすることができます。
- 接続ユーザーに割り当てられたロール (ROLE_NAME)
- ユーザーのユーザー名 (USER_NAME)
- クライアントのホスト名 (SNI_HOST)
- クライアントの IP アドレス (SOURCE_IP)
14.7.1. クライアント接続のパーティション設定による永続サブスクリプションのサポート
永続サブスクリプションのためにクライアントをパーティション設定するには、一貫したハッシュアルゴリズムまたは正規表現を使用して、受信接続のクライアント ID をフィルタリングすることができます。
前提条件
クライアントは、ロードバランサーを使用したり、接続 URL にすべてのブローカーインスタンスを設定するなどして、クラスター内のすべてのブローカーに接続できるように設定されます。クライアントの詳細がそのブローカーのパーティション設定に一致しないためにブローカーが接続を拒否した場合、クライアントはクラスター内の他のブローカーに接続し、そこからの接続を受け入れるブローカーを見つける必要があります。
14.7.1.1. 一貫したハッシュアルゴリズムを使用したクライアント ID のフィルタリング
クラスターの各ブローカーは、各クライアント接続のクライアント ID をハッシュ化するために一貫したハッシュアルゴリズムを使用するように設定することができます。ブローカーはクライアント ID をハッシュ化した後、ハッシュ化された値に対してモジュロ演算を行い、クライアント接続のターゲットブローカーを特定する整数値を返します。ブローカーは、返された整数値をブローカーで設定された一意の値と比較します。一致する場合、ブローカーは接続を受け入れます。値が一致しない場合、ブローカーは接続を拒否します。このプロセスは、一致するものが見つかり、ブローカーが接続を受け入れるまで、クラスター内の各ブローカーで繰り返されます。
手順
-
最初のブローカーの
<broker_instance_dir>/etc/broker.xml
設定ファイルを開きます。 connection-routers
要素を作成し、一貫したハッシュアルゴリズムを使用してクライアント ID をフィルタリングするconnection-route
を作成します。以下に例を示します。<configuration> <core> ... <connection-routers> <connection-route name=”consistent-hash-routing”> <key>CLIENT_ID</target-key> <local-target-filter>NULL|0</local-target-filter> <policy name="CONSISTENT_HASH_MODULO"> <property key="modulo" value="<number_of_brokers_in_cluster>"> </property> </policy> </connection-route> </connection-routers> ... </core> </configuration>
connection-route
-
connection-route name
には、この接続ルーティング設定を識別する文字列を指定します。この名前は、一貫したハッシュフィルターを適用したい各ブローカーアクセプターに追加する必要があります。 鍵 (key)
-
フィルターを適用するキーの種類。クライアント ID をフィルタリングする場合は、
key
フィールドにCLIENT_ID
を指定します。 local-target-filter
-
ブローカーが modulo 操作で返された整数値と比較して、一致するかどうか、ブローカーが接続を受け入れることができるかどうかを決定する値。この例の
NULL|0
の値は、クライアント ID (NULL) を持たない接続と、モジュロ演算によって返される数が0
である接続に一致します。 policy
modulo
プロパティーキーを受け入れます。これは、ハッシュ化されたクライアント ID に対してモジュロ演算を実行して、ターゲットブローカーを識別します。modulo
プロパティーキーの値は、クラスター内のブローカー数と同じでなければなりません。重要policy name
はCONSISTENT_HASH_MODULO
である必要があります。
-
2 番目のブローカーの
<broker_instance_dir>/etc/broker.xml
設定ファイルを開きます。 connection-routers
要素を作成し、一貫したハッシュアルゴリズムを使用してクライアント ID をフィルタリングするためのconnection route
を作成します。次の例では、
local-target-filter
の値NULL|1
により、クライアント ID を持たない (NULL) 接続と、モジュロ演算によって返される値が1
である接続が一致します。<configuration> <core> ... <connection-routers> <connection-route name=”consistent-hash-routing”> <key>CLIENT_ID</target-key> <local-target-filter>NULL|1</local-target-filter> <policy name="CONSISTENT_HASH_MODULO"> <property key="modulo" value="<number_of_brokers_in_cluster>"> </property> </policy> </connection-route> </connection-routers> ... </core> </configuration>
- この手順を繰り返し、クラスター内の追加のブローカーごとに一貫したハッシュフィルターを作成します。
14.7.1.2. 正規表現を使用したクライアント ID のフィルタリング
クライアント接続のクライアント ID の一部に正規表現フィルターを適用するようにブローカーを設定することで、クライアント接続をパーティション設定することができます。ブローカーは、正規表現フィルターの結果がブローカーに設定されたローカルターゲットフィルターと一致する場合にのみ、接続を受け入れます。一致するものが見つからない場合、ブローカーは接続を拒否します。このプロセスは、一致するものが見つかり、ブローカーが接続を受け入れるまで、クラスター内の各ブローカーで繰り返されます。
前提条件
- 各クライアント ID に共通する文字列で、正規表現によるフィルタリングが可能です。
手順
-
最初のブローカーの
<broker_instance_dir>/etc/broker.xml
設定ファイルを開きます。 connection-routers
要素を作成し、connection-route
を作成して、クライアント ID の一部をフィルタリングします。以下に例を示します。<configuration> <core> ... <connection-routers> <connection-route name=”regex-routing”> <key>CLIENT_ID</target-key> <key-filter>^.{3}</key-filter> <local-target-filter>NULL|CL1</local-target-filter> </connection-route> </connection-routers> ... </core> </configuration>
connection-route
-
connection-route name
には、このルーティング設定の識別する文字列を指定します。この名前は、正規表現フィルターを適用したい各ブローカーアクセプターに追加する必要があります。 鍵 (key)
-
フィルターを適用するキー。クライアント ID をフィルタリングする場合は、
key
フィールドにCLIENT_ID
を指定します。 key-filter
クライアント ID の文字列のうち、キー値を抽出するために正規表現を適用する部分。上記の最初のブローカーの例では、ブローカーはクライアント ID の最初の 3 文字であるキー値を抽出します。たとえば、クライアント ID 文字列が
CL100.consumer
の場合、ブローカーはCL1
のキー値を抽出します。ブローカーはキー値を抽出した後、それをlocal-target-filter
の値と比較します。受信接続がクライアント ID を持たない場合、あるいはブローカーが
key-filter
に指定された正規表現を用いてキー値を抽出できない場合、キー値は NULL に設定されます。local-target-filter
-
ブローカーがキー値と比較して、一致するかどうか、ブローカーが接続を受け入れることができるかどうかを判断するための値。
NULL|CL1
の値は、上記の最初のブローカーの例に示されているように、クライアント ID を持たない (NULL) 接続か、クライアント ID にCL1
の 3 文字の接頭辞がある接続に一致します。
-
2 番目のブローカーの
<broker_instance_dir>/etc/broker.xml
設定ファイルを開きます。 connection-routers
要素を作成し、クライアント ID の一部に基づいて接続をフィルタリングするためのconnection route
を作成します。次のフィルターの例では、ブローカーは正規表現を使用して、クライアント ID の最初の 3 文字であるキー値を抽出しています。ブローカーは
NULL
およびCL2
の値をキー値と比較し、一致するかどうか、ブローカーが接続を受け入れることができるかどうかを判断します。<configuration> <core> ... <connection-routers> <connection-route name=”regex-routing”> <key>CLIENT_ID</target-key> <key-filter>^.{3}</key-filter> <local-target-filter>NULL|CL2</local-target-filter> </connection-route> </connection-routers> ... </core> </configuration>
- この手順を繰り返し、クラスターの追加ブローカーごとに適切な接続ルーティングフィルターを作成します。
14.7.2. クライアント接続のパーティション設定によるデータ重力のサポート
データ重力をサポートするために、クライアント接続をパーティション設定して、クライアントのコンシューマーが消費する必要があるメッセージが生成されるブローカーに接続するようにすることができます。たとえば、プロデューサーアプリケーションとコンシューマーアプリケーションで使用される一連のアドレスがある場合、特定のブローカーでアドレスを設定できます。次に、それらのアドレスを使用するプロデューサーとコンシューマーの両方のクライアント接続をパーティション設定して、そのブローカーにのみ接続できるようにします。
クライアント接続は、接続ユーザーに割り当てられたロール、ユーザーのユーザー名、クライアントのホスト名または IP アドレスなどの属性に基づいて、パーティション設定することができます。このセクションでは、クライアントユーザーに割り当てられたユーザーロールをフィルタリングして、クライアント接続をパーティション設定する方法の例を示します。クライアントがブローカーに接続するために認証が必要な場合は、ロールをクライアントユーザーに割り当て、接続をフィルタリングして、ロール基準に一致するユーザーのみがブローカーに接続できるようにすることができます。
前提条件
- クライアントは、ロードバランサーを使用したり、接続 URL にすべてのブローカーインスタンスを設定するなどして、クラスター内のすべてのブローカーに接続できるように設定されます。クライアントがそのブローカーに設定されたパーティション設定フィルターの基準に一致しないためにブローカーが接続を拒否した場合、クライアントはクラスター内の他のブローカーに接続し、そこからの接続を受け入れるブローカーを見つける必要があります。
手順
-
最初のブローカーの
<broker_instance_dir>/etc/artemis-roles.properties
ファイルを開いてください。broker1users
ロールを追加し、そのロールにユーザーを追加します。 -
最初のブローカーの
<broker_instance_dir>/etc/broker.xml
設定ファイルを開きます。 connection-routers
要素を作成し、ユーザーに割り当てられたロールに基づいて接続をフィルタリングするためのconnection-route
を作成します。以下に例を示します。<configuration> <core> ... <connection-routers> <connection-route name=”role-based-routing”> <key>ROLE_NAME</target-key> <key-filter>broker1users</key-filter> <local-target-filter>broker1users</local-target-filter> </connection-route> </connection-routers> ... </core> </configuration>
connection-route
-
connection-route name
には、このルーティング設定の識別する文字列を指定します。この名前は、ロールフィルターを適用したい各ブローカーアクセプターに追加する必要があります。 鍵 (key)
-
フィルターを適用するキー。ロールベースのフィルタリングを設定するには、
key
フィールドにROLE_NAME
を指定します。 key-filter
-
ブローカーがユーザーのロールをフィルタリングし、キー値を抽出するために使用する文字列または正規表現。ブローカーが一致するロールを見つけた場合、そのロールにキー値を設定します。一致するロールが見つからない場合、ブローカーはキー値を NULL に設定します。上記の例では、ブローカーは、
broker1users
のフィルターをクライアントユーザーのロールに適用します。ブローカーはキー値を抽出した後、それをlocal-target-filter
の値と比較します。 local-target-filter
-
ブローカーがキー値と比較して、一致するかどうか、ブローカーが接続を受け入れることができるかどうかを判断するための値。この例では、ブローカーは
broker1users
の値をキー値と比較しています。一致した場合、つまりそのユーザーがbroker1users
のロールを持っている場合、ブローカーはその接続を受け入れます。
- この手順を繰り返し、クラスターの他のブローカー上のクライアントをパーティション設定するために、フィルターに適切なロールを指定します。
14.7.3. アクセプターへの接続ルートの追加
ブローカーで接続ルートを設定した後、クライアント接続をパーティション設定するために、ブローカーの 1 つまたは複数のアクセプターにルートを追加する必要があります。アクセプターに接続ルートを追加すると、ブローカーは、接続ルートで設定されたフィルターをアクセプターが受信した接続に適用します。
手順
-
最初のブローカーの
<broker_instance_dir>/etc/broker.xml
設定ファイルを開きます。 パーティション設定を有効にしたい各アクセプターの場合は、
router
キーを追加し、connection-route name
を指定します。次の例では、consistent-hash-routing
のconnection-route name
がartemis
アクセプターに追加されます。<configuration> <core> ... <acceptors> ... <!-- Acceptor for every supported protocol --> <acceptor name="artemis">tcp://0.0.0.0:61616?tcpSendBufferSize=1048576;tcpReceiveBufferSize=1048576;protocols=CORE,AMQP,STOMP,HORNETQ,MQTT,OPENWIRE;useEpoll=true;amqpCredits=1000;amqpLowCredits=300;router="consistent-hash-routing" </acceptor> </acceptors> ... </core> </configuration>
- この手順を繰り返して、クラスター内の各ブローカーに適切な接続ルートフィルターを指定します。