搜索

14.7. 分区客户端连接

download PDF

分区客户端连接涉及在客户端启动连接时,各个客户端到同一代理的路由连接。

分区客户端连接的两个用例是:

  • 对持久订阅进行分区,以确保订阅者始终连接到位于 durable subscriber 队列所在代理。
  • 通过吸引客户到源自数据的数据(也称为数据信息)来最大程度地减少将数据移至移至数据的需求。

持久化订阅

持久化订阅以代理上的队列形式表示,并在意外的订阅者第一次连接到代理时创建。这个队列保留在代理中,并接收信息,直到客户端取消订阅。因此,您希望客户端会重复连接到同一代理,以使用订阅者队列中的消息。

要为持久订阅队列对客户端进行分区,您可以在客户端连接中过滤客户端 ID。

数据 getvity

如果您在没有考虑数据的情况下扩展代理数量而不考虑数据,则由于需要在代理间移动消息,一些性能优势将会丢失。为了支持日期 getvity,您应该对客户端连接进行分区,以便客户端消费者连接生成所需信息所需的代理。

要对客户端连接进行分区以支持数据状态,您可以过滤以下客户端连接的属性:

  • 分配给连接用户(ROLE_NAME)的角色。
  • 用户的用户名(USER_NAME)
  • 客户端的主机名(SNI_HOST)
  • 客户端的 IP 地址(SOURCE_IP)

14.7.1. 对客户端连接进行分区以支持持久订阅

要为持久订阅分区客户端,您可以使用一致的哈希算法或正则表达式在传入连接中过滤客户端 ID。

先决条件

客户端经过配置,以便它们可以连接到集群中的所有代理,例如使用负载均衡器,或者具有在连接 URL 中配置的所有代理实例。如果代理因为客户端详情与该代理的分区配置不匹配,客户端必须能够连接到集群中的其他代理,以查找接受该代理的连接。

14.7.1.1. 使用一致的哈希算法过滤客户端 ID

您可以在一个集群中配置每个代理,以使用一致的哈希算法来在每个客户端连接中对客户端 ID 进行哈希处理。在代理对客户端 ID 哈希后,它会在散列值上执行 modulo 操作,返回整数值,用于标识客户端连接的目标代理。代理将返回的整数值与代理中配置的唯一值进行比较。如果存在匹配项,代理会接受连接。如果值不匹配,代理会拒绝连接。此过程会在集群中的每个代理上重复,直到找到匹配项并且代理接受连接。

流程

  1. 为第一个代理打开 < broker_instance_dir> /etc/broker.xml 配置文件。
  2. 创建 connection-routers 元素,并使用一致的哈希算法创建连接 路由 以过滤客户端 ID。例如:

    <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 名称,请为这个连接路由配置指定标识字符串。您必须将此名称添加到每个代理接受器中,您要将一致的散列过滤器应用到其中。
    key
    要将过滤器应用到的键类型。要过滤客户端 ID,在 key 字段中指定 CLIENT_ID
    local-target-filter
    代理与 modulo 操作返回的整数值进行比较的值,以确定是否有匹配项并且代理可以接受连接。示例中的 NULL|0 值为没有客户端 ID(NULL)的连接提供了匹配的连接,其中 modulo 操作返回的数量为 0
    policy

    接受 modulo 属性键,它在散列客户端 ID 上执行 modulo 操作来识别目标代理。modulo 属性键的值必须等于集群中的代理数量。

    重要

    策略名称 必须是 CONSISTENT_HASH_MODULO

  3. 为第二个代理打开 < broker_instance_dir> /etc/broker.xml 配置文件。
  4. 创建 connection-routers 元素,并使用一致的哈希算法创建用于过滤客户端 ID 的连接路由

    在以下示例中,local-target-filterNULL|1 为没有客户端 ID(NULL)的连接提供了匹配的连接,其中 modulo 操作返回的值为 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|FOO</local-target-filter>
                </connection-route>
        </connection-routers>
            ...
        </core>
    </configuration>
    connection-route
    对于 connection-route 名称,请为此路由配置指定标识字符串。您必须将此名称添加到要应用正则表达式过滤器的每个代理接受器中。
    key
    要将过滤器应用到的键。要过滤客户端 ID,在 key 字段中指定 CLIENT_ID
    key-filter

    将正则表达式应用到的客户端 ID 字符串中用于提取键值。在上面的第一个代理示例中,代理提取一个键值,它是客户端 ID 的前 3 个字符。例如,如果客户端 ID 字符串是 FOO100.consumer,则代理提取一个键值 FOO。代理提取键值后,它会将其与 local-target-filter 的值进行比较。

    如果传入的连接没有客户端 ID,或者代理无法使用为 key-filter 指定的正则表达式提取键值,则键值设置为 NULL。

    local-target-filter
    代理与键值比较的值,以确定是否有匹配项并且代理可以接受连接。上面的第一个代理示例所示的 NULL|FOO 值匹配,与没有客户端 ID(NULL)或在客户端 ID 中具有 3 个字符前缀 FOO 的连接匹配。
  3. 为第二个代理打开 < broker_instance_dir> /etc/broker.xml 配置文件。
  4. 创建 connection-routers 元素,并创建 连接路由,以根据客户端 ID 的一部分过滤连接。

    在以下过滤器示例中,代理使用正则表达式提取一个键值,它是客户端 ID 的前 3 个字符。代理将 NULLBAR 的值与键值进行比较,以确定是否有匹配项和代理可以接受连接。

    <configuration>
        <core>
            ...
            <connection-routers>
                <connection-route name=”regex-routing”>
                    <key>CLIENT_ID</target-key>
                    <key-filter>^.{3}</key-filter>
                    <local-target-filter>NULL|BAR</local-target-filter>
                </connection-route>
            </connection-routers>
            ...
        </core>
    </configuration>
  5. 重复此步骤,并为集群中的每个附加代理创建适当的连接路由过滤器。

14.7.2. 对客户端连接进行分区以支持数据状态

为了支持日期 getvity,您可以对客户端连接进行分区,以便客户端用户连接到生成了它们使用的消息的代理。例如,如果您有一组由制作者和消费者应用程序使用的地址,您可以在特定的代理上配置地址。然后,您可以为使用这些地址的生产者和消费者对客户端连接进行分区,以便它们只能连接到该代理。

您可以基于分配给连接用户的角色、用户的用户名或客户端的主机名或 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 名称,请为此路由配置指定标识字符串。您必须将此名称添加到要应用角色过滤器的每个代理接受器中。
    key
    要将过滤器应用到的键。要配置基于角色的过滤,在 key 字段中指定 ROLE_NAME
    key-filter
    代理用来过滤用户的角色并提取键值的字符串或正则表达式。如果代理找到匹配的角色,它会将键值设置为该角色。如果找不到匹配的角色,代理会将键值设置为 NULL。在上例中,代理将 broker1users 的过滤器应用到客户端用户的角色。代理提取键值后,它会将其与 local-target-filter 的值进行比较。
    local-target-filter
    代理与键值比较的值,以确定是否有匹配项并且代理可以接受连接。在示例中,代理将 broker1users 值与键值进行比较。它有一个匹配项,这意味着用户具有 broker1users 角色,代理接受连接。
  4. 重复此步骤,并在过滤器中指定适当的角色来在集群中的其他代理上对客户端进行分区。

14.7.3. 为接收器添加连接路由

在代理中配置连接路由后,您必须将路由添加到一个或多个代理的接收器中分区客户端连接。将连接路由添加到接受器后,代理会将连接路由中配置的过滤器应用到接受者接收的连接。

流程

  1. 为第一个代理打开 < broker_instance_dir> /etc/broker.xml 配置文件。
  2. 对于您要启用分区的每个接受者,附加 路由器 密钥并指定 connection-route 名称。在以下示例中,将具有 consistent-hash-routingconnection-route name 添加到 artemis acceptor 中。

    <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

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.