跳到主要内容

配置队列

队列可以是持久的或临时的(非持久的)。临时队列由客户端应用程序动态创建和销毁。本节讨论如何创建和配置持久队列。

您还可以在PubSub+ Broker Manager中配置这些选项。有关更多信息,请参见PubSub+云的配置队列或软件事件代理和设备的配置队列。

要在给定的消息VPN中预配置一个持久队列,请输入以下CONFIG命令:

solace(configure)# message-spool message-vpn <vpn-name>
solace(configure/message-spool)# create queue <name>

要编辑给定消息VPN上现有持久队列的属性,请输入以下CONFIG命令:

solace(configure)# message-spool message-vpn <vpn-name>
solace(configure/message-spool)# queue <name>

其中:

<name> 是一个队列名称,最多包含200个字符(只有保留队列名称可以以#开头,无效字符为<>\*?&;)。如果名称包含层次结构级别(例如,“a/b”),每个级别的层次结构必须包含一个或多个有效字符,名称不能以斜杠开始或结束。每个消息VPN中的队列名称必须是唯一的。

临时队列与通过Solace CLI或PubSub+ Broker Manager预配置的持久队列不同,它是由客户端应用程序动态配置的,并且只能存在于客户端连接期间。

此命令的无版本,no queue <name>,从消息VPN中删除指定的持久消息队列。但是,只有在关闭队列后才能删除队列,这会禁用客户端对它的访问。有关更多信息,请参见启用/禁用客户端访问队列。

以下各节讨论了如何配置与持久队列相关的参数和功能。

您还可以观看这些视频,了解配置队列的不同方法:

  • 创建队列的多种方式 - 第1部分?
  • 创建队列的多种方式 - 第2部分?
  • 创建队列的多种方式 - 第3部分?
  • 创建队列的多种方式 - 第4部分?

配置访问类型

要为PubSub+事件代理上的持久消息队列配置客户端访问类型,请输入以下CONFIG命令。

客户端访问类型在禁用客户端对持久消息队列的访问之前不能更改。有关更多信息,请参见启用/禁用客户端访问队列。

PubSub+(configure/message-spool/queue)# access-type {exclusive | non-exclusive}

其中:

exclusive ——指定在任何时候只有一个消费者可以接收消息,而其他消费者可以作为待机连接。也就是说,只有一个流程可以处于活动状态。只有第一个绑定的消费者可以接收消息。如果第一个消费者断开连接,第二个消费者接收数据,依此类推。独占队列始终按照它们接收的顺序传递消息。

non-exclusive ——指定多个消费者可以绑定到队列,这使得负载均衡和消费者自动扩展成为可能。非独占队列可以是非分区的或分区的。

  • 对于非分区队列(分区计数为零),每个消费者以轮询方式被服务。如果连接失败,未确认的消息将被传递给另一个消费者,并设置重新传递标志。通过这种方式,消息可以无序地被传递给消费者。这种类型的队列有时被称为“竞争消费者”队列。
  • 对于分区队列(分区计数大于零),每个消费者从一到多个分区接收消息。消息根据分区键的哈希映射到分区。分区键由发布应用程序设置。在分区内保持消息顺序,但分区之间不保证。

此命令的无版本,no access-type,将设置恢复为默认值(独占)。

配置最大绑定流程数

要为PubSub+事件代理上的持久消息队列配置可以绑定的最大流程数,请输入以下CONFIG命令。

PubSub+(configure/message-spool/queue)# max-bind-count <value>

其中:

<value> 是一个整数值,指定可以绑定到持久消息队列的最大流程数。有效范围是0到10,000。默认值是1,000。

此命令的无版本,no max-bind-count,将可以绑定到持久消息队列的最大流程数重置为默认值。

单个客户端可以创建多个流程,流程可能来自一个或多个客户端。

启用/禁用向复制VPN传播消费者确认

默认情况下,活动复制消息VPN上的端点会将它们接收的消费者确认传播到备用复制消息VPN。

要阻止队列向备用复制消息VPN传播消费者确认,请输入以下CONFIG命令:

solace(configure/message-spool/queue)# no consumer-ack-propagation

或者,如果允许队列向备用复制消息VPN传播消费者确认,请输入以下CONFIG命令以允许它这样做:

solace(configure/message-spool/queue)# consumer-ack-propagation

桥接不能绑定到已禁用消费者确认传播的队列。

配置队列事件阈值

要配置控制为给定队列生成消息缓冲相关事件的阈值,请输入以下CONFIG命令:

solace(configure/message-spool/queue)# event

CLI现在处于一个级别,您可以在此配置队列的各种消息缓冲事件的设置和清除阈值。

有关为队列生成的可用消息VPN级消息缓冲事件以及如何设置生成这些事件的设置和清除阈值的具体信息,请参阅队列事件阈值。

配置最大允许的已传递未确认消息数

对于给定的队列,您可以配置可以传递给客户端但尚未被该客户端确认的保证消息的最大数量。也就是说,每个绑定到队列的流程可以接受多少未返回消息确认的未处理消息。

当超过这个最大数量的已传递但未确认消息后,PubSub+事件代理会停止向客户端的流程传递消息,直到客户端确认已经传递的消息。

要配置每个流程的最大未确认消息数限制,请输入以下CONFIG命令:

solace(configure/message-spool/topic-queue)# max-delivered-unacked-msgs-per-flow <max>

其中:

<max> 是一个整数值,指定可以传递给客户端但在订阅流程上仍未确认的消息的最大数量。有效范围是1到事件代理支持的最大值。最大值取决于使用的PubSub+事件代理类型。默认值是10,000。如果达到所有客户端中已传递但未确认消息的最大数量,事件代理将停止向所有客户端传递消息,直到一些客户端向事件代理返回确认。

此命令的无版本,no max-delivered-unacked-msgs-per-flow,将未确认消息的最大数量重置为默认值。

可能的性能影响

修改max-delivered-unacked-msgs-per-flow可能会对性能产生负面影响,如果它设置得低于消费客户端使用的传输窗口大小。

假设应用程序至少使用JCSMP或JMS API的10.0.2版本,或C、.NET或Java RTO API的7.2.5版本,API在绑定时了解配置的max-delivered-unacked-msgs-per-flow,并相应调整其确认阈值以获得最佳性能。如果max-delivered-unacked-msgs-per-flow在客户端绑定时更改,客户端可能需要断开连接并重新连接以接收新值。

旧版本的API不会根据max-delivered-unacked-msgs-per-flow设置调整其确认阈值。如果使用旧版本的API的应用程序绑定到队列,其max-delivered-unacked-msgs-per-flow必须设置为大于或等于应用程序使用的传输窗口大小的值,以确保性能。

配置最大允许的消息大小

要为给定的持久队列配置最大消息大小,请输入以下CONFIG命令。

solace(configure/message-spool/queue)# max-message-size <size>

其中:

<size> 是一个整数值,指定队列允许的最大消息大小(以字节为单位)。

此命令的无版本,no max-message-size,将队列可用的允许消息大小重置为默认值。

配置最大重传尝试次数

您可以使用max-redelivery选项配置队列尝试向客户端重新传递消息的最大次数。如果给定消息的重传尝试次数超过max-redelivery值,消息将被丢弃,或者如果已创建并准备好接受消息的死信队列(DMQ),消息将被移除并放入DMQ。

要配置队列可以尝试向客户端重新传递消息的最大次数,请输入以下CONFIG命令:

solace(configure/message-spool/queue)# max-redelivery <count>

其中:

<count> 是最大消息重传尝试次数。有效范围是0到255。0表示永远尝试。默认值为0。

此命令的无版本,no max-redelivery,将最大重传次数重置为默认值。

配置消息重传延迟

当客户端应用程序从事件代理消费消息时,它们可能会偶尔遇到暂时无法处理消息的情况。在这种情况下,应用程序可能会回滚事务以强制重新传递消息。

立即重新传递消息通常没有帮助,因为它不允许足够的时间来解决暂时的条件。配置消息重传延迟可以帮助,在事务回滚后,通过配置的重传延迟时间暂停向客户端交付消息。您还可以配置乘数,以允许重传尝试的指数退避。

当您配置消息重传延迟时,它仅在代理尝试在应用程序发起的本地事务回滚后重新传递消息给客户端时适用。其他类型的重新传递将不延迟发生。

配置消息重传延迟是一个受控可用性(CA)特性。请联系Solace以了解此特性是否支持您的用例。

要配置消息重传延迟,请输入以下命令:

solace(configure/message-spool/queue)# redelivery-delay

CLI现在处于一个级别,您可以在此配置队列在尝试重新传递消息给客户端时使用的初始间隔、最大间隔和延迟间隔乘数。

  • 要配置初始间隔,请输入以下命令:
solace(.../message-spool/queue/redelivery-delay)# initial-interval <value>

其中:

<value> 是一个整数值,指定前两次传递尝试之间的延迟,以毫秒为单位。有效值范围是1到3600000。默认值为1000。

此命令的无版本,no initial-interval,将值重置为默认值。

  • 要配置最大间隔,请输入以下命令:
solace(.../message-spool/queue/redelivery-delay)# max-interval <value>

其中:

<value> 是一个整数值,指定任意两次重传尝试之间的最大延迟,以毫秒为单位。有效值范围是1到10800000。默认值为64000。

此命令的无版本,no max-interval,将值重置为默认值。

  • 要配置延迟间隔乘数,请输入以下命令:
solace(.../message-spool/queue/redelivery-delay)# multiplier <value>

其中:

<value> 是一个浮点值,指定每次失败的传递尝试后延迟间隔乘以的量。有效值范围是1.00到5.00。默认值为2.00。

此命令的无版本,no multiplier,将值重置为默认值。

要启用消息重传延迟配置,请输入以下命令:

solace(.../message-spool/queue/redelivery-delay)# no shutdown

要禁用消息重传延迟配置,请输入以下命令:

solace(.../message-spool/queue/redelivery-delay)# shutdown

配置消息重传

默认情况下,队列可以尝试重新传递消息给客户端的次数由max-redelivery命令控制。有关更多信息,请参见配置最大重传尝试次数。

您可以禁用此功能。当消息重传被禁用时,给定的消息将仅尝试从队列中传递一次。

禁用消息重传是一个受控可用性(CA)特性。请联系Solace以了解此特性是否支持您的用例。

要禁用消息重传尝试,请输入以下CONFIG命令:

solace(configure/message-spool/queue)# no redelivery

要启用消息重传尝试,请输入以下CONFIG命令。

solace(configure/message-spool/queue)# redelivery

配置消息传递计数

您可以使用delivery-count选项启用或禁用消息的传递计数属性。当启用时,从队列发送给消费者的每一消息都包含一个属性,指示这是第一次、第二次、...还是第n次尝试将消息传递给消费者。默认情况下,传递计数是禁用的。

消息计数具有以下行为:

  • 对于消息浏览器,消息计数是下一个非浏览器消费者将看到的值。浏览消息不会影响它们的传递计数。
  • 在冗余(HA)故障转移的情况下,大于1的消息计数被重置为2

启用消息传递计数是一个受控可用性(CA)特性。请联系Solace以了解此特性是否支持您的用例。

要启用队列上的消息传递计数,请输入以下CONFIG命令:

solace(configure/message-spool/queue)# delivery-count

要禁用消息的传递计数,请输入以下CONFIG命令。

solace(configure/message-spool/queue)# no delivery-count

配置延迟交付

默认情况下,发布到队列的消息会立即发布给连接的消费者。有许多用例中,发布的消息不能立即交付给消费者,而只能在固定延迟后交付。一个例子是支付处理系统中的重试机制。在接收到客户订单后,您可能希望实现一个交付延迟以重试信用卡交易,当处理交易失败时出于任何原因。有关更多信息,请参见延迟交付。

您可以使用delivery-delay选项为队列配置一个交付延迟,以便所有预定给队列的消息在固定时间段内不符合交付条件。

如果您目前正在使用死信队列(DMQ)来实现交付延迟,请联系Solace以获取关于如何将您的实现迁移到使用delivery-delay选项的指导。

要配置队列上的交付延迟,请输入以下CONFIG命令:

solace(configure/message-spool/queue)# delivery-delay <delay>

其中:

<delay> 是要应用于队列上的消息在符合交付条件之前的延迟时间,以秒为单位。有效范围是0到4294967295。默认值为0。

此命令的无版本,no delivery-delay,将delivery-delay值重置为默认值。

配置最大缓冲使用量

要配置给定队列可以使用的最大消息缓冲量,请输入以下CONFIG命令:

solace(configure/message-spool/queue)# max-spool-usage <size>

其中:

<size> 是一个整数值,指定队列允许的最大消息缓冲磁盘空间量(以MB为单位)。

此命令的无版本,no max-spool-usage,将队列可用的允许消息缓冲使用量配额重置为其默认值。

有关此设置的默认值的详细信息,请参见最大缓冲使用量。

将最大消息缓冲使用量设置为零

将最大消息缓冲使用量设置为0可以启用最后值队列功能,并禁用端点配额检查。但是,全局配额检查和消息VPN配额检查不受影响。

当队列的此设置为0时,事件代理通过在接收新消息时从端点删除旧消息来强制执行队列深度为一(即,仅存储缓冲给它的最后一个消息)。如果队列是分区的,每个分区保存缓冲到最后一个分区的消息。

有关更多信息,请参见最后值队列。

配置队列所有者

队列所有者对队列拥有完全无限制的权限。也就是说,所有者可以消费、删除或修改队列中的主题。队列的所有权以以下方式建立:

  1. 如果客户端应用程序通过PubSub+消息API动态预配置队列,与客户端关联的客户端用户名自动获得该队列的所有权。
  2. 如果CLI用户通过Solace CLI手动预配置队列,没有客户端用户名自动获得该队列的所有权。
  3. 任何具有对队列所属消息VPN的读写或管理访问权限的CLI用户都对队列拥有完全权限(即,管理拥有所有权)。

在分配所有者之前,必须首先禁用对持久消息队列的客户端访问。有关更多信息,请参见启用/禁用客户端访问队列。

要将给定队列的所有权授予与特定客户端用户名关联的任何客户端,请输入以下CONFIG命令:

solace(configure/message-spool/queue)# owner <owner>

<owner> 是现有客户端用户名帐户的用户名。默认所有者是管理。

此命令的无版本,no owner,将队列的所有者重置为默认值。

对客户端发起的删除的限制

  • 客户端不能删除使用CLI或SEMP由管理用户添加到队列的订阅。
  • 客户端不能删除由管理用户使用CLI或SEMP创建的队列。

为非所有者客户端配置权限

要为给定持久队列的所有非所有者客户端配置权限级别,请输入以下CONFIG命令:

必须首先禁用对持久消息队列的客户端访问,然后才能配置队列权限。有关更多信息,请参见启用/禁用客户端访问队列。

solace(configure/message-spool/queue)# permission all {no-access | read-only | consume | modify-topic | delete}

其中:

no-access 禁止访问队列。

read-only 为客户提供对队列中缓冲的消息的只读访问权限。

consume 为客户提供只读权限,并能够从队列中删除消息。

modify-topic 为客户提供消费权限,并能够修改分配给队列的主题或选择器。

delete 为客户提供修改主题的权限,并能够删除队列。请注意,如果队列是由管理用户使用CLI或SEMP创建的,客户端无法删除队列。

此命令的无版本,no permission,将所有非队列所有者的客户端的权限级别重置为无,即无访问权限。客户端访问级别为无是默认权限级别。

对于启用了保证端点权限覆盖的客户端用户名,忽略权限级别。有关更多信息,请参见启用端点权限覆盖。

接收客户端订阅主题ACL会拒绝的消息

如果客户端绑定到它们不拥有的队列,它们将接收队列上的所有消息,包括由于分配的ACL而它们会被拒绝订阅的主题的消息。例如,如果有一个队列订阅了主题a/b,并且客户端成功绑定到该队列,那么该客户端将接收队列上的所有消息,即使该客户端受到禁止订阅主题a/b的ACL的限制。

对客户端发起的订阅更改的限制

  • 客户端必须设置为modify-topic权限,才能从队列中添加或删除订阅。有关更多信息,请参见向队列添加主题订阅。
  • 如果管理用户使用CLI或SEMP添加了订阅,客户端不能在队列上删除订阅。

启用拒绝低优先级消息

为了防止消息拥塞场景,您可以启用队列丢弃低优先级消息,但继续缓冲高优先级发布的消息。队列可以在低优先级和高优先级消息缓冲的总数超过为拒绝低优先级消息限制设置的值后,选择性地丢弃低优先级消息。

默认情况下,拒绝低优先级消息功能对端点未启用。

  • 为了避免无意中丢弃所有低优先级消息,建议在启用拒绝低优先级消息功能之前,将拒绝低优先级消息限制的默认值0更改为适合您网络的更合适的值。有关更多信息,请参见配置拒绝低优先级消息限制。
  • 当启用此功能时,还必须为队列启用reject-msg-to-sender-on-discard选项,以便在消息未被排队并且被丢弃时,向发布客户端发送会话事件。有关更多信息,请参见配置消息丢弃处理。

要启用队列的拒绝低优先级消息功能,请输入以下CONFIG命令:

solace(configure/message-spool/queue)# reject-low-priority-msg

此命令的无版本,no reject-low-priority-msg,配置持久队列不执行拒绝低优先级消息限制检查(默认配置)。

分配消息优先级

客户端应用程序可以使用PubSub+消息API通过服务等级(COS)属性分配消息优先级。

配置拒绝低优先级消息限制

要为队列配置拒绝低优先级消息限制,请输入以下CONFIG命令:

solace(configure/message-spool/queue)# reject-low-priority-msg-limit <limit>

其中:

<limit> 是缓冲的低优先级和高优先级消息的总数。当超过此值时,队列将丢弃任何进一步发布的低优先级消息,但会缓冲发布的高优先级消息。有效值从0到4294967295。如果设置为0,则队列仅缓冲高优先级消息。

配置消息丢弃处理

reject-msg-to-sender-on-discard选项配置持久队列应如何处理由于以下一个或多个条件导致的入站消息丢弃:

  • 添加发布的消息将超过队列配置的消息配额
  • 发布的消息超过了队列允许的最大消息大小
  • 客户端发布到的主题它也订阅了,并且有一个活跃的流程设置了“无本地交付”

如果由于上述任何条件之一,发布的消息未被缓冲,将发生以下情况:

  • 如果为队列启用了reject-msg-to-sender-on-discard选项(这是默认设置):消息被丢弃,并向发送者返回负面确认(nack)。在这种情况下,消息不能被缓冲到任何其他队列或主题端点(不管这些端点是否启用或禁用了reject-msg-to-sender-on-discard选项)。

    • 只有在消息最初发布时使用了非持久性或持久性传输模式时,才会向客户端发送nack。如果消息以直接传输模式发布,但由于主题匹配被更改为非持久性,然后被丢弃,则不会向发送者返回nack。
    • 如何处理nack是发布应用程序的责任,而不是PubSub+ API的责任。PubSub+ API不会重新传输被拒绝的消息。
  • 如果为队列禁用了reject-msg-to-sender-on-discard选项:入站消息将被“默默”丢弃(即,消息被丢弃但向发送者返回确认)。在这种情况下,其他端点可以缓冲该消息——如果它们没有遇到上述列出的任何条件。

要为持久队列启用reject-msg-to-sender-on-discard选项,请输入以下CONFIG命令:

solace(configure/message-spool/queue)# reject-msg-to-sender-on-discard [including-when-shutdown]

其中:

including-when-shutdown指定如果端点已关闭但仍有匹配的订阅,当管理用户通过CLI或SEMP向主题发布消息时,返回Nacks给客户端。请注意,此参数特别针对发布到主题的消息,因为当队列关闭时,向队列发布的消息总是会在启用reject-msg-to-sender时返回Nacks。

此命令的无版本,no reject-msg-to-sender-on-discard,禁用持久队列上的reject-msg-to-sender-on-discard选项。

对事务会话的影响

reject-msg-to-sender-on-discard选项也影响事务会话的行为。如果向发送者返回“确认”,则事务会话提交成功。如果向发送者返回nack,则提交失败。有关更多信息,请参见使用PubSub+ SMF API的本地事务和使用PubSub+ JMS API的事务会话。

配置最大消息TTL

您可以为持久端点配置最大生存时间(TTL)值,以便在使用最大TTL时,收到的消息被提供过期值,以限制它们可以在持久端点上停留的时间。如果消息未被消费且其过期时间已到,消息将被丢弃或移动到DMQ(如果发布者已标记消息为DMQ合格)。

消息也可以有发布者提供的TTL,这表示发布者认为消息有效的时间。这与队列的最大TTL不同,因为发布者TTL过期从消息发布时开始,并随着消息通过网络而倒计时。如果消息同时有发布者分配的TTL和队列分配的最大TTL,则事件代理在消息在队列上时使用两个TTL值中的最小值。

要定义应用于消息缓冲的最大TTL,请输入以下CONFIG命令:

solace(configure/message-spool/queue)# max-ttl <ttl>

其中:

<ttl> 是队列上启用了尊重TTL选项的消息可以停留的最大秒数。

条件:

  • 仅当端点的尊重TTL选项被启用时,才对消息应用最大TTL值。
  • 在配置或更改此参数时已经在队列端点上的消息将不受影响;这些消息将继续使用它们被缓冲到端点时分配的TTL(如果有)。
  • 不能在DMQ、与复制桥相关的队列或与配置同步桥相关的队列上设置最大TTL。

此命令的无版本,no max-ttl,将默认的最大TTL值设置为0(禁用),这意味着不对任何接收到的消息应用过期时间。

最大TTL与消息VPN桥

尽管可以在与消息VPN桥相关的队列上配置最大TTL值,但建议在发布消息的最终目的地的端点上配置最大TTL,以防止消息在桥队列上被丢弃时还有下游消费者期待这些消息。

最大TTL与性能

使用最大TTL会增加需要为每个存储在端点的消息维护的状态量,并会影响保证消息传递的性能。

强制是否尊重TTL

您可以配置队列以尊重或忽略消息的生存时间(TTL)过期值。这包括发布客户端设置的TTL值以及通过其配置的最大TTL属性在端点上设置的TTL值。默认情况下,DMQ被设置为忽略消息TTL过期时间。

当队列被配置为尊重消息TTL时,会检查消息的TTL值。如果消息的TTL已过期,它将被从消息缓冲中移除并丢弃,或者如果消息有资格进入DMQ,则被移动到事件代理上配置的DMQ。如果消息没有分配TTL,则它永远不会过期。

当队列被配置为忽略消息TTL时,即使它们被缓冲的时间超过了设置的TTL值,缓冲的消息也不会被移除。

要配置持久队列以尊重消息TTL,请输入以下CONFIG命令:

solace(configure/message-spool/queue)# respect-ttl

此命令的无版本,no respect-ttl,配置持久端点以忽略消息TTL过期时间(默认配置)。

如果在队列上启用了respect-ttl选项,并且消息带有TTL值已经被缓冲,那么这些现有的缓冲消息不会被移除——即使它们的TTL过期值已经超过。只有在启用respect-ttl选项后接收到的带有TTL值的入站消息才能因TTL违规而被移除。

强制是否尊重消息优先级值

您可以配置队列以尊重或忽略消息的优先级值。

当队列被配置为尊重消息优先级时,所有接收到的消息中的优先级字段被用来按适当的顺序传递消息。换句话说,优先级较高的消息会在优先级较低的消息之前发送。

分区队列即使被配置为尊重优先级,也不会尊重消息优先级。

事件代理识别从0(最低)到9(最高)的十个优先级级别。如果消息中的优先级字段大于9,则事件代理将其视为优先级9。接收到的没有优先级字段的消息被视为优先级4。

在从尊重优先级过渡到忽略优先级时,所有消息仍然保持其现有优先级。尽管队列不再尊重新消息的优先级值,但现有消息的优先级值被尊重。由于新消息被视为优先级9,因此当队列被配置为忽略消息优先级时,新消息可能会绕过之前接收的消息。

您必须完全关闭队列,然后才能更改它是否尊重或忽略优先级值。

要配置持久队列以尊重消息优先级值,请输入以下CONFIG命令:

solace(configure/message-spool/queue)# respect-message-priority

此命令的无版本,no respect-message-priority,配置持久队列以忽略消息优先级值(默认配置)。

强制执行消息优先级会增加在客户端从连接故障中恢复后向消费客户端交付重复消息的机会。

配置分区队列

分区队列由一个父非独占队列和每个分区的子队列组成。有关更多信息,请参见分区队列。

创建队列分区

要在给定的消息VPN中为非独占队列创建队列分区,请输入以下CONFIG命令:

solace(configure/message-spool/queue)# partition
solace(configure/message-spool/queue/partition)# count <num-partitions>

其中:

<num-partitions> 指定队列的分区数。有效范围取决于代理支持的最大客户端连接数。默认值为0(即,不分区)。分区计数为1会导致分区队列有一个父队列和单个分区。如果队列有分区,绑定的客户端从单独分配的分区接收消息,而不是以轮询方式。

此命令的无版本 no count,将值返回为默认值,这会移除所有队列分区,使队列成为一个非独占的非分区队列。有关更多信息,请参见配置访问类型。

如果您将队列从分区更改为非分区,或反之,则事件代理会解绑所有已绑定到队列的客户端。这确保事件代理和客户端一致地使用(或不使用)分区队列的语义。请注意,任何在已移除分区中剩余的消息也会被移除。

如果您将队列从非分区更改为分区,变更时在队列中的消息可能会卡住,因为事件代理在队列变为分区后不再从父队列传递消息。在这种情况下,您可以从父队列中复制消息。

我们建议您在更改分区数量之前确保消息从队列中排出。有关更多信息,请参见分区扩展。

分区扩展会影响服务。确保您按照分区扩展中提供的确切程序添加或移除分区。

配置分区再平衡计时器

当从分区队列中抽取的客户端数量发生变化时,会触发分区再平衡。有关更多信息,请参见分区再平衡。

当事件代理执行分区再平衡时,使用两个计时器:再平衡延迟和最大交接计时器。根据您的部署,您可能希望更改这些计时器的持续时间。

配置再平衡延迟

默认情况下,事件代理在需要时等待五秒钟再触发再平衡。

您可以配置此设置以平衡您的消费者扩展策略和消费者连接的稳定性需求。较小的值意味着客户端连接和断开连接的操作被更快地执行;较大的值在客户端频繁、临时断开连接或客户端断开连接/重新连接成组发生时(例如,客户端自动扩展),最小化分区重新分配的次数。

要配置在触发后再平衡开始之前的延迟,请输入以下CONFIG命令:

solace(configure/message-spool/queue/partition)# rebalance
solace(...ssage-spool/queue/partition/rebalance)# delay <seconds>

其中:

<seconds> 指定在触发后再平衡开始之前的延迟(以秒为单位)。有效范围是0到4294967295。默认值为五秒。

此命令的无版本,no delay,将值返回为默认值。

配置最大交接时间

当分区再平衡发生时,可能会导致分区从一个消费者交接到另一个消费者。虽然交接旨在尽可能不显眼,但重新映射和扩展分区可能会导致应用程序级别的错误,因为属于一个分区的消息流从一个消费者转移到另一个消费者。有关更多信息,请参见分区交接。

默认情况下,事件代理在再平衡时等待最多三秒钟以允许消息排空,然后再交接分区。如果没有消息需要排空,交接会立即进行。

要配置事件代理在再平衡时交接分区前等待的最大时间,请输入以下CONFIG命令:

solace(configure/message-spool/queue/partition)# rebalance
solace(...ssage-spool/queue/partition/rebalance)# max-handoff-time <seconds>

其中:

<seconds> 指定在再平衡时交接分区前等待的最大时间(以秒为单位)。有效范围是0到4294967295。默认值为三秒。

此命令的无版本,no max-handoff-time,将值返回为默认值。

监控分区队列

要显示队列分区的信息,请输入以下命令:

show queue <name> [message-vpn <vpn-name>] partitions

其中:

<name> 是消息队列的完整名称,或队列名称的一部分,使用通配符?代表名称中的一个字符,或使用通配符代表名称中的零个或多个字符,如果只输入通配符,则显示所有消息队列。

<vpn-name> 是队列所属的消息VPN的名称。

示例:

此示例显示了一个具有四个分区的队列,每个分区中都缓冲了一些消息。

solace(configure)# show queue test partitions

Name : test
Message VPN : default
Partition Count : 4
Operational : 4
Rebalance
Delay (Seconds) : 5
Max Handoff Time (Seconds) : 3
Scaling Status : Ready
Rebalancing Status : Ready

ST(Status): UA(Unassigned), R(Ready), P(Paused), UB(Unbound)

Queue Name Messages
Num Assigned Client ST Spooled
---- --------------------------------------------------------- -- -----------
0 #pq/bff82b2e8c82d8c1/00000 UA 12

1 #pq/bff82b2e8c82d8c1/00001 UA 13

2 #pq/bff82b2e8c82d8c1/00002 UA 13

3 #pq/bff82b2e8c82d8c1/00003 UA 12

对于分区队列,不带partitions关键字的show queue命令返回父队列的缓冲消息数——这包括每个分区中缓冲的总消息数加上在变为分区队列之前父队列上缓冲的任何消息。

从分区队列中删除消息

要从子队列中删除缓冲的消息,您必须在delete-messages命令中指定子队列的名称。例如,要从前面示例中的分区3中删除消息,请运行以下命令:

solace(admin/message-spool)# delete-messages test #pq/bff82b2e8c82d8c1/00003

如果您在父队列上运行delete-messages命令(即,未指定分区),事件代理将删除在变为分区之前直接缓冲到父队列的任何消息。

向队列添加主题订阅

要向给定的持久消息队列添加主题订阅,以便发布到这些主题的保证消息也传递到队列,请输入以下CONFIG命令:

solace(configure/message-spool/queue)# subscription topic <topic>

其中:

<topic> 是要以a/b/c形式添加的主题订阅的名称。

此命令的无版本,no subscription topic,从持久队列中删除指定的主题订阅。

条件:

  • 添加或删除主题订阅不会影响已经存储在队列中的消息。
  • subscription topic队列CONFIG命令和no subscription topic队列CONFIG命令可以多次输入,以向队列添加或删除多个主题订阅。
  • 队列订阅受到每个客户端订阅的限制和事件代理范围支持的订阅数量的限制。

订阅更改的限制

  • 使用PubSub+消息API的客户端不能从管理员通过CLI或SEMP添加到队列的主题订阅中移除。
  • 要允许客户端向队列添加或删除订阅,这些订阅未由管理员添加,必须为队列配置modify-topic或delete权限级别(请参阅为非所有者客户端配置权限),或者客户端必须被分配一个启用了保证端点权限覆盖的客户端配置文件(请参阅允许客户端创建保证端点)。
  • 在冗余事件代理配置中完全支持向队列添加或删除订阅。也就是说,可以在活动事件代理上管理队列中的主题订阅,并且在事件代理对之间活动切换时这些订阅得以保留。

向队列添加主题订阅异常

要向给定的持久消息队列添加主题订阅异常,以便发布到这些主题的保证消息不传递到队列,请重复添加订阅的步骤,并在主题名称前添加一个领先的"!"字符。

换句话说,要向队列添加主题订阅异常,请输入以下CONFIG命令:

solace(configure/message-spool/queue)# subscription topic !<topic>

其中:

<topic> 是您希望从队列中排除的主题订阅的名称,以a/b/c的形式。

订阅异常默认启用。如果禁用了订阅异常,前导"!"被视为普通字符。有关启用和禁用订阅异常的更多信息,请参阅系统级订阅异常配置。

启用/禁用客户端访问队列

默认情况下,客户端无法发布和绑定到队列。

要启用对指定持久队列的客户端访问,请输入以下CONFIG命令:

solace(configure/message-spool/queue)# no shutdown [ingress | egress | full]

要禁用对指定持久队列的客户端访问,请输入以下CONFIG命令:

solace(configure/message-spool/queue)# shutdown [ingress | egress | full]

其中:

  • ingress 指定启用或禁用客户端向队列发布消息的权限。

  • egress 指定启用或禁用客户端绑定到队列的权限。

  • full 指定启用或禁用客户端向队列发布消息和绑定到队列的权限。