14.7. 分区客户端连接
分区客户端连接涉及在客户端启动连接时,各个客户端到同一代理的路由连接。
分区客户端连接的两个用例是:
- 对持久订阅进行分区,以确保订阅者始终连接到位于 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 操作,返回整数值,用于标识客户端连接的目标代理。代理将返回的整数值与代理中配置的唯一值进行比较。如果存在匹配项,代理会接受连接。如果值不匹配,代理会拒绝连接。此过程会在集群中的每个代理上重复,直到找到匹配项并且代理接受连接。
流程
-
为第一个代理打开 <
broker_instance_dir> /etc/broker.xml
配置文件。 创建
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
。
-
为第二个代理打开 <
broker_instance_dir> /etc/broker.xml
配置文件。 创建
connection-routers
元素,并使用一致的哈希算法创建用于过滤客户端 ID的连接路由
。在以下示例中,
local-target-filter
的NULL|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>
- 重复此流程,为集群中的每个额外代理创建一致的哈希过滤器。
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|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
的连接匹配。
-
为第二个代理打开 <
broker_instance_dir> /etc/broker.xml
配置文件。 创建
connection-routers
元素,并创建连接路由
,以根据客户端 ID 的一部分过滤连接。在以下过滤器示例中,代理使用正则表达式提取一个键值,它是客户端 ID 的前 3 个字符。代理将
NULL
和BAR
的值与键值进行比较,以确定是否有匹配项和代理可以接受连接。<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>
- 重复此步骤,并为集群中的每个附加代理创建适当的连接路由过滤器。
14.7.2. 对客户端连接进行分区以支持数据状态
为了支持日期 getvity,您可以对客户端连接进行分区,以便客户端用户连接到生成了它们使用的消息的代理。例如,如果您有一组由制作者和消费者应用程序使用的地址,您可以在特定的代理上配置地址。然后,您可以为使用这些地址的生产者和消费者对客户端连接进行分区,以便它们只能连接到该代理。
您可以基于分配给连接用户的角色、用户的用户名或客户端的主机名或 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 名称
,请为此路由配置指定标识字符串。您必须将此名称添加到要应用角色过滤器的每个代理接受器中。 key
-
要将过滤器应用到的键。要配置基于角色的过滤,在
key
字段中指定ROLE_NAME
。 key-filter
-
代理用来过滤用户的角色并提取键值的字符串或正则表达式。如果代理找到匹配的角色,它会将键值设置为该角色。如果找不到匹配的角色,代理会将键值设置为 NULL。在上例中,代理将
broker1users
的过滤器应用到客户端用户的角色。代理提取键值后,它会将其与local-target-filter
的值进行比较。 local-target-filter
-
代理与键值比较的值,以确定是否有匹配项并且代理可以接受连接。在示例中,代理将
broker1users
值与键值进行比较。它有一个匹配项,这意味着用户具有broker1users
角色,代理接受连接。
- 重复此步骤,并在过滤器中指定适当的角色来在集群中的其他代理上对客户端进行分区。
14.7.3. 为接收器添加连接路由
在代理中配置连接路由后,您必须将路由添加到一个或多个代理的接收器中分区客户端连接。将连接路由添加到接受器后,代理会将连接路由中配置的过滤器应用到接受者接收的连接。
流程
-
为第一个代理打开 <
broker_instance_dir> /etc/broker.xml
配置文件。 对于您要启用分区的每个接受者,附加
路由器
密钥并指定connection-route 名称
。在以下示例中,将具有consistent-hash-routing
的connection-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>
- 重复此流程,为集群中的每个代理指定适当的连接路由过滤器。