14.7. 客户端连接分区
分区客户端连接涉及在每次客户端发起连接时将各个客户端路由到同一代理的路由连接。
客户端连接的两种用例是:
- 对持久订阅进行分区客户端,以确保订阅者始终连接到 durable 订阅者队列所在的代理。
- 通过吸引客户到源自数据的数据(也称为数据 gravity),最大限度地减少对移动数据的需要。
持久化订阅
持久化订阅以代理上的队列表示,并在持久订阅者首先连接到代理时创建。这个队列保留在代理中,并接收信息,直到客户端取消订阅为止。因此,您希望客户端重复连接到同一代理,以使用订阅者队列中的消息。
要对客户端进行持久订阅队列分区,您可以在客户端连接中过滤客户端 ID。
Data gravity
如果您在环境中扩展代理数量而不考虑数据 gravity,则一些性能优势会因为需要在代理间移动消息而丢失。要支持日期变化,您应该对客户端连接进行分区,以便客户端用户连接到生成所需消息的代理。
要分区客户端连接来支持 data gravity,您可以过滤客户端连接的任何属性:
- 分配给连接用户的角色(ROLE_NAME)
- 用户的用户名(USER_NAME)
- 客户端的主机名(SNI_HOST)
- 客户端的 IP 地址(SOURCE_IP)
14.7.1. 对客户端连接进行分区以支持持久化订阅 复制链接链接已复制到粘贴板!
要对客户端进行持久订阅分区,您可以使用一致的哈希算法或正则表达式在传入连接中过滤客户端 ID。
先决条件
客户端会被配置,以便它们可以连接到集群中的所有代理,例如,使用负载均衡器或让所有代理实例在连接 URL 中配置。如果代理拒绝连接,因为客户端详情与那个代理的分区配置不匹配,客户端必须能够连接到集群中的其他代理,以查找接受来自它的连接的代理。
14.7.1.1. 使用一致的哈希算法过滤客户端 ID 复制链接链接已复制到粘贴板!
您可以将集群中的每个代理配置为使用一致的哈希算法来对每个客户端连接中的客户端 ID 进行哈希处理。代理哈希客户端 ID 后,它会在散列值上执行 modulo 操作,以返回一个整数值,用于标识客户端连接的目标代理。代理将整数值与代理上配置的唯一值进行比较。如果存在匹配项,代理会接受连接。如果值不匹配,代理会拒绝连接。此过程会在集群中的每个代理上重复,直到找到匹配项并接受连接。
流程
-
为第一个代理打开 <
broker_instance_dir> /etc/broker.xml
配置文件。 创建
connection-routers
元素,并创建一个connection-route
来使用一致的哈希算法过滤客户端 ID。例如:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 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
。
-
为第二个代理打开 <
broker_instance_dir> /etc/broker.xml
配置文件。 创建
connection-routers
元素,并使用一致的哈希算法创建一个连接路由
来过滤客户端 ID。在以下示例中,
NULL|1
的local-target-filter
值为没有客户端 ID (NULL)的连接提供了匹配,其中 modulo 操作返回的值为1
。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 重复此步骤,为集群中的每个额外代理创建一个一致的哈希过滤器。
14.7.1.2. 使用正则表达式过滤客户端 ID 复制链接链接已复制到粘贴板!
您可以通过将代理配置为对客户端连接中的客户端 ID 的一部分应用正则表达式过滤器来对客户端连接进行客户端连接分区。只有在正则表达式过滤器的结果与为代理配置的本地目标过滤器匹配时,代理才会接受连接。如果没有找到匹配项,代理会拒绝连接。此过程会在集群中的每个代理上重复,直到找到匹配项并接受连接。
先决条件
- 每个客户端 ID 中的常用字符串,可以通过正则表达式过滤。
流程
-
为第一个代理打开 <
broker_instance_dir> /etc/broker.xml
配置文件。 创建
connection-routers
元素,并创建一个connection-route
来过滤客户端 ID 的一部分。例如:Copy to Clipboard Copied! Toggle word wrap Toggle overflow connection-route
-
对于
connection-route 名称
,请为此路由配置指定一个识别字符串。您必须将此名称添加到要应用正则表达式过滤器的每个代理接受者。 key
-
将过滤器应用到的密钥。要过滤客户端 ID,请在
key
字段中指定CLIENT_ID
。 key-filter
应用正则表达式的客户端 ID 字符串的一部分来提取键值。在上面的第一个代理示例中,代理提取一个 key 值,它是客户端 ID 的前 3 个字符。例如,客户端 ID 字符串是
CL100.consumer
,代理会提取CL1
的键值。代理提取 key 值后,它会将它与local-target-filter
的值进行比较。如果传入连接没有客户端 ID,或者代理无法使用为
key-filter
指定的正则表达式提取键值,则 key 值设为 NULL。local-target-filter
-
代理与 key 值进行比较的值,以确定是否存在匹配项,代理是否可以接受连接。
NULL|CL1
值(如上例中所示),与没有客户端 ID (NULL)的连接匹配,或者在客户端 ID 中具有 3 个字符前缀CL1
。
-
为第二个代理打开 <
broker_instance_dir> /etc/broker.xml
配置文件。 创建
connection-routers
元素,并根据客户端 ID 的一部分创建连接路由
来过滤连接。在以下过滤器示例中,代理使用正则表达式来提取一个 key 值,它是客户端 ID 的前 3 个字符。代理将
NULL
和CL2
的值与 key 值进行比较,以确定是否存在匹配项,代理是否可以接受连接。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 重复此步骤,并为集群中的每个附加代理创建适当的连接路由过滤器。
14.7.2. 对客户端连接进行分区,以支持数据 gravity 复制链接链接已复制到粘贴板!
要支持日期变化,您可以对客户端连接进行分区,以便客户端用户连接到生成需要消耗的消息的代理。例如,如果您有一组由生成者和消费者应用程序使用的地址,您可以在特定代理上配置地址。然后,您可以为生成者和使用这些地址的用户对客户端连接进行分区,以便他们只能连接到该代理。
您可以根据分配给连接用户、用户的用户名或客户端的主机名或 IP 地址等属性对客户端连接进行分区。本节介绍如何通过过滤分配给客户端用户的用户角色来对客户端连接进行分区。如果需要客户端进行身份验证以连接到代理,您可以将角色分配给客户端用户并过滤连接,以便只有与角色条件匹配的用户才能连接到代理。
先决条件
- 客户端会被配置,以便它们可以连接到集群中的所有代理,例如,使用负载均衡器或让所有代理实例在连接 URL 中配置。如果代理拒绝连接,因为客户端与为该代理配置的分区过滤器标准不匹配,客户端必须能够连接到集群中的其他代理,以查找接受来自它的连接的代理。
流程
-
为第一个代理打开 <
broker_instance_dir> /etc/artemis-roles.properties
文件。添加broker1users
角色,并将用户添加到角色中。 -
为第一个代理打开 <
broker_instance_dir> /etc/broker.xml
配置文件。 创建
connection-routers
元素,并创建一个connection-route
来根据分配给用户的角色过滤连接。例如:Copy to Clipboard Copied! Toggle word wrap Toggle overflow connection-route
-
对于
connection-route 名称
,请为此路由配置指定一个识别字符串。您必须将此名称添加到要应用角色过滤器的每个代理 acceptor 中。 key
-
将过滤器应用到的密钥。要配置基于角色的过滤,在
key
字段中指定ROLE_NAME
。 key-filter
-
代理用来过滤用户角色和提取键值的字符串或正则表达式。如果代理找到匹配的角色,它会将 key 值设置为该角色。如果没有找到匹配的角色,代理会将 key 值设置为 NULL。在上例中,代理将
broker1users
过滤器应用到客户端用户的角色。代理提取 key 值后,它会将它与local-target-filter
的值进行比较。 local-target-filter
-
代理与 key 值进行比较的值,以确定是否存在匹配项,代理是否可以接受连接。在示例中,代理将
broker1users
值与 key 值进行比较。存在一个匹配项,这意味着用户具有broker1users
角色,代理接受连接。
- 重复此步骤,并在过滤器中指定适当的角色到集群中的其他代理客户端。
14.7.3. 在 acceptors 中添加连接路由 复制链接链接已复制到粘贴板!
在代理中配置连接路由后,您必须将路由添加到一个或多个代理的 acceptors 中,以对客户端连接进行分区。将连接路由添加到接收器后,代理会将连接路由中配置的过滤器应用到接受者接收的连接。
流程
-
为第一个代理打开 <
broker_instance_dir> /etc/broker.xml
配置文件。 对于您要启用分区的每个接收器,附加
router
密钥并指定connection-route 名称
。在以下示例中,将具有consistent-hash-routing
的connection-route name
添加到artemis
acceptor 中。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 重复此步骤,为集群中的每个代理指定适当的连接路由过滤器。