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 をハッシュ化した後、ハッシュ化された値に対してモジュロ演算を行い、クライアント接続のターゲットブローカーを特定する整数値を返します。ブローカーは、返された整数値をブローカーで設定された一意の値と比較します。一致する場合、ブローカーは接続を受け入れます。値が一致しない場合、ブローカーは接続を拒否します。このプロセスは、一致するものが見つかり、ブローカーが接続を受け入れるまで、クラスター内の各ブローカーで繰り返されます。

手順

  1. 最初のブローカーの <broker_instance_dir>/etc/broker.xml 設定ファイルを開きます。
  2. 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 nameCONSISTENT_HASH_MODULO である必要があります。

  3. 2 番目のブローカーの <broker_instance_dir>/etc/broker.xml 設定ファイルを開きます。
  4. 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>
  5. この手順を繰り返し、クラスター内の追加のブローカーごとに一貫したハッシュフィルターを作成します。

14.7.1.2. 正規表現を使用したクライアント ID のフィルタリング

クライアント接続のクライアント ID の一部に正規表現フィルターを適用するようにブローカーを設定することで、クライアント接続をパーティション設定することができます。ブローカーは、正規表現フィルターの結果がブローカーに設定されたローカルターゲットフィルターと一致する場合にのみ、接続を受け入れます。一致するものが見つからない場合、ブローカーは接続を拒否します。このプロセスは、一致するものが見つかり、ブローカーが接続を受け入れるまで、クラスター内の各ブローカーで繰り返されます。

前提条件

  • 各クライアント ID に共通する文字列で、正規表現によるフィルタリングが可能です。

手順

  1. 最初のブローカーの <broker_instance_dir>/etc/broker.xml 設定ファイルを開きます。
  2. 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 文字の接頭辞がある接続に一致します。
  3. 2 番目のブローカーの <broker_instance_dir>/etc/broker.xml 設定ファイルを開きます。
  4. 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>
  5. この手順を繰り返し、クラスターの追加ブローカーごとに適切な接続ルーティングフィルターを作成します。

14.7.2. クライアント接続のパーティション設定によるデータ重力のサポート

データ重力をサポートするために、クライアント接続をパーティション設定して、クライアントのコンシューマーが消費する必要があるメッセージが生成されるブローカーに接続するようにすることができます。たとえば、プロデューサーアプリケーションとコンシューマーアプリケーションで使用される一連のアドレスがある場合、特定のブローカーでアドレスを設定できます。次に、それらのアドレスを使用するプロデューサーとコンシューマーの両方のクライアント接続をパーティション設定して、そのブローカーにのみ接続できるようにします。

クライアント接続は、接続ユーザーに割り当てられたロール、ユーザーのユーザー名、クライアントのホスト名または IP アドレスなどの属性に基づいて、パーティション設定することができます。このセクションでは、クライアントユーザーに割り当てられたユーザーロールをフィルタリングして、クライアント接続をパーティション設定する方法の例を示します。クライアントがブローカーに接続するために認証が必要な場合は、ロールをクライアントユーザーに割り当て、接続をフィルタリングして、ロール基準に一致するユーザーのみがブローカーに接続できるようにすることができます。

前提条件

  • クライアントは、ロードバランサーを使用したり、接続 URL にすべてのブローカーインスタンスを設定するなどして、クラスター内のすべてのブローカーに接続できるように設定されます。クライアントがそのブローカーに設定されたパーティション設定フィルターの基準に一致しないためにブローカーが接続を拒否した場合、クライアントはクラスター内の他のブローカーに接続し、そこからの接続を受け入れるブローカーを見つける必要があります。

手順

  1. 最初のブローカーの <broker_instance_dir>/etc/artemis-roles.properties ファイルを開いてください。broker1users ロールを追加し、そのロールにユーザーを追加します。
  2. 最初のブローカーの <broker_instance_dir>/etc/broker.xml 設定ファイルを開きます。
  3. 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 のロールを持っている場合、ブローカーはその接続を受け入れます。
  4. この手順を繰り返し、クラスターの他のブローカー上のクライアントをパーティション設定するために、フィルターに適切なロールを指定します。

14.7.3. アクセプターへの接続ルートの追加

ブローカーで接続ルートを設定した後、クライアント接続をパーティション設定するために、ブローカーの 1 つまたは複数のアクセプターにルートを追加する必要があります。アクセプターに接続ルートを追加すると、ブローカーは、接続ルートで設定されたフィルターをアクセプターが受信した接続に適用します。

手順

  1. 最初のブローカーの <broker_instance_dir>/etc/broker.xml 設定ファイルを開きます。
  2. パーティショニングを有効にするアクセプターごとに、router キーを追加し、connection-route name を指定します。次の例では、consistent-hash-routingconnection-route nameartemis アクセプターに追加されます。

    <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>
  3. この手順を繰り返して、クラスター内の各ブローカーに適切な接続ルートフィルターを指定します。
Red Hat logoGithubRedditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

© 2024 Red Hat, Inc.