消息传递资源
本节描述了PubSub+事件代理上的每个客户端优先级出口队列,以及您可以使用的配置命令。
客户端出口队列结构概述
要将发布的消息传递给客户端,它必须通过下图所示的排队结构。
消息首先通过五个每个客户端优先级的数据队列之一。调度程序随后选择它并将其放入单个每个客户端的传输控制协议(TCP)发送队列中。
对于直接消息,发布客户端应用程序为消息设置的服务质量(COS)值决定每条消息排队到哪个每个客户端优先级队列:
- COS 1 (C-1)—消息进入直接1 (D-1)队列(最低优先级)
- COS 2 (C-2)—消息进入直接2 (D-2)队列(中等优先级)
- COS 3 (C-3)—消息进入直接3 (D-3)队列(最高优先级)
所有保证消息都排队到保证1 (G-1)队列。保证消息也有分配的COS值,然而,该值决定了在其目标端点拥堵时消息的丢弃资格。COS 1表示消息优先级低;COS 3表示消息优先级高。(COS 2是一个保留的Solace值;目前,COS为2的消息被视为低优先级。)
将消息排队的行为触发TCP堆栈评估连接是否可以从该队列发送更多数据。如果TCP堆栈确定可以在TCP连接上发送数据,则消息数据会被复制到每个端口的发送队列中。消息发送后,数据将保留在TCP发送队列中,直到客户端通过TCP确认消息。
客户端出口队列层次结构
每个客户端优先级队列具有可配置的最大深度,以工作单位(2,048字节)为单位进行测量。当这些队列变满时,当前排队的旧消息将被丢弃(最旧的优先),被新的传入消息替换。
一旦由于队列满而发生消息丢弃,接收客户端将通过与丢弃的消息紧接着发 布的丢弃指示通知。数据平面统计信息中的出口拥塞丢弃计数也会增加。
数据缓冲区管理
事件代理防止少数客户端消耗过多的内部缓冲区。这种保护适用于事件代理与客户端之间的入口和出口流量,通常用于:
- 向事件代理以不成比例的速率发送数据的发布客户端。
- 缓慢的订阅者。也就是说,持续未能以提供的消息速率消费其消息的客户端。为了确定订阅者有多慢,事件代理会测量在过去一分钟内有多少秒钟有数据要发送但无法发送,通常是因为客户端的TCP窗口已关闭。对于TCP问题(例如重传和丢失的TCP保持活动)还会对慢速测量施加额外惩罚。慢速以百分比表示。
要查看事件代理上的任何慢速订阅者,请输入show client * slow-subscriber
用户执行命令。
要查看订阅者的阻塞百分比,请输入show client <name> connections wide
用户执行命令。
入口数据缓冲区管理
事件代理确保公平处理来自发布客户端的消息。发布客户端不能以其他发布客户端为代价消耗不成比例的入口资源。
所有大于事件代理最大消息大小的SMF消息——通常保证消息为30MB或直接消息为64MiB——将被丢弃。发布客户端将被断开连接,并引发CLIENT_CLIENT_MESSAGE_TOO_BIG
事件。
出口数据缓冲区管理
事件代理使用一个内部仪表来监控其出口缓冲区使用情况,称为NAB缓冲区负载因子,其中出口数据缓冲区使用情况以百分比形式注册。当该仪表超过100%时,慢速订阅者可能会被自动断开,以减少出口数据缓冲区负载。
如果事件代理上的出口数据缓冲区使用率过高,则在任何慢速订阅者从事件代理断开之前,会生成基于该仪表当前百分比值的NAB缓冲区负载因子事件。
要配置NAB缓冲区负载因子事件的阈值,请参见配置系统内存使用事件阈值。
配置每个客户端优先级的出口队列
为了避免数据丢失或服务中断,在尝试配置客户端队列之前,请始终联系Solace以获得技术支持。
要配置每个客户端优先级的出口队列,请输入以下命令:
solace(configure)# client-profile <name> message-vpn <vpn-name>
solace(configure/client-profile)# queue <type>
其中:
<name>
是客户端配置文件的名称。客户端配置文件名称可以包含最多32个字母数字字符(区分大小写)。还允许使用“_”字符。
<vpn-name>
是客户端配置文件所属的消息VPN的名称。
<type>
是要配置的队列类型,即以下每个客户端优先级队列参数之一(按优先级顺序):
C-1
(控制1)D-3
(直接3)D-2
(直接2)D-1
(直接1)G-1
(保证1)
您可以为给定队列配置以下出口队列参数:
- 配置最大出口队列深度
- 配置出口队列最小消息突发
配置最大出口队列深度
要为客户端配置给定队列的最大深度,请输入以下命令:
solace(configure/client-profile/queue)# max-depth <depth>
其中:
<depth>
是表示客户端优先级队列工作单位数量的整数值。有效范围为2到262144。客户端优先级队列的默认值为20,000个工作单位。更改此值不会影响已经成功放置在队列上的消息。
该命令的无版本形式no max-depth
将指定队列的深度重置为默认值20000。
- 对于使用消息消除功能的Web消息客户端,Solace建议设置一个足够的最大队列深度,以容纳每个客户端可能接收的每个唯一主题的一条消息。
- 对于所有其他Web消息客户端,Solace建议将最大队列深度设置为100。这个建议基于事件代理在接近最大允许值的并发客户端连接下的假设。
配置出口队列最小消息突发
要配置始终允许进入指定优先级队列的消息数量,而不考虑max-depth
值,请输入以下命令:
solace(configure/client-profile/queue)# min-msg-burst <depth>
其中:
<depth>
是表示队列突发深度的整数值。有效范围为0到262144。对于队列D1-3,默认值为4,对于G-1队列,默认值为255。
- 该命令的无版本形式(no min-msg-burst)将队列突发深度重置为默认值。
- 对于G-1队列,最小消息突发值应至少等于客户端应用程序和/或消息VPN桥客户端使用的消费者流窗口大小。如果最小消息突发值过低,保证消息将以非常低的速率传输。
监控每个客户端优先级队列
您可以使用show命令验证和监控事件代理的消息队列配置和状态。
显示客户端配置文件详细信息
要查看特定客户端配置文件或事件代理上所有客户端配置文件的消息队列配置,请输入以下命令:
solace> show client-profile <name> [message-vpn <vpn-name>] [detail]
其中:
<name>
是客户端配置文件的名称。输入不带名称将显示事件代理上配置的所有客户端配置文件。
<vpn-name>
是客户端配置文件所属的消息VPN的全名,或消息VPN名称的一部分,使用通配符字符?表示名称中的一个字符,或使用通配符字符表示名称中的零个或多个字符,输入仅通配符字符将显示所有消息VPN。
示例:
solace> show client-profile solprofile detail
配置文件名称 : solprofile
消息VPN: dotnet_vpn
G-保证, D-直接, C-控制)
队列最大深度
G-1 : 20000工作单位
D-1
: 20000工作单位
D-2 : 20000工作单位
D-3 : 20000工作单位
C-1 : 20000工作单位
优先级队列最小突发
G-1 : 255 消息
D-1 : 4 消息
D-2 : 4 消息
D-3 : 4 消息
C-1 : 4 消息
消息池
保证消息发送 : 拒绝
保证消息接收 : 拒绝
保证端点创建 : 拒绝
事务会话 : 拒绝
最大事务会话 : 10
每个客户端用户名的最大端点数 : 16000
最大出口流 : 16000
最大入口流 : 16000
从队列复制 :
从主题端点复制 :
TCP
MSS : 1460
初始窗口 : 2
最大窗口 : 256 KB
保持活动
计数 : 5
空闲 : 3 秒
间隔 : 1 秒
消除
启用 : 否
最大主题数 : 256
延迟 : 0 毫秒
Web传输
非活动超时 : 30 秒
最大Web有效载荷 : 1000000字节
复制
允许客户端处于待机状态 : 否
每个客户端用户名的最大连接数 : 6000
服务SMF : 9000
Web传输 : 9000
最大订阅数 : 5000000
允许桥接连接 : 否
事件阈值 设置值 清除值
---------------------------------- ---------------- ----------------
订阅数 (#subs) 80%(4000000) 60%(3000000)
每个客户端用户名的连接数 80%(4800) 60%(3600)
服务SMF 80%(7200) 60%(5400)
服务WEB 80%(7200) 60%(5400)
预配置端点池使用率 (%) 80 60
事务会话 (#) 80%(8) 60%(6)
每个客户端用户名的端点数 (#) 80%(12800) 60%(9600)
出口流 (#) 80%(12800) 60%(9600)
入口流 (#) 80%(12800) 60%(9600)
图例:
用户类型 - CU (客户端用户名)
UB (单向桥 [远程消息VPN])
RB (复制桥)
AG (授权组)
用户名 # 活动
类型 客户端
---- ---------------------------------------------------------------- --------
CU default 0
下表解释了显示的出口队列参数。
参数 | 描述 |
---|---|
队列最大深度 | 每个出口每个客户端优先级队列都有一个相关的最深度。深度以工作单位(工作单位表示消息的2048字节)进行测量。将消息大小转换为工作单位数量的公式是:NumWorkUnits = CEILING(message.length/2048)。当新消息放置在优先级队列上时,其深度以工作单位为单位检查与队列配置的最大深度。队列可以暂时超出配置的最大深度。然而,当这些队列变满时,当前排队的旧消息将被丢弃(最旧的优先),被新的传入消息替换,并且数据平面统计信息中的出口拥塞丢弃计数将增加。一旦由于队列满而发生消息丢弃,接收客户端将通过与丢弃的消息紧接着发布的丢弃指示通知。 |
优先级队列最小突发 | 配置的最小突发长度容忍度指定了每个队列始终允许进入队列的消息数量,而不考虑其当前配置的最大 深度。它用于确保在出口客户端优先级队列上接收到非常大的消息突发时不会丢失消息。例如,在队列上当前有三条消息,并且队列的最小突发长度容忍度设置为4的情况下,那么还可以在队列上放置一条消息,而不考虑当前三条消息是否足够大以至于填满队列超出其最大允许深度。因此,配置的最小突发长度容忍度4允许队列暂时超出其配置的最大深度,并吸收本来会超出允许的工作单位数量的大消息突发。 |
出口队列参数
显示客户端统计队列
要查看客户端的消息队列统计信息,请输入以下命令:
solace> show client <name> stats queue
其中:
<name>
是客户端的全名,或客户端名称的一部分,使用通配符字符?表示名称中的一个字符,或使用通配符字符表示名称中的零个或多个字符,输入仅通配符字符将显示所有客户端。
示例
solace> show client solace1 stats queue
客户端: solace1
类型: 主
客户端配置文件: 默认
ACL配置文件: 默认
订阅数: 2
消除启用: 否
消除主题:
当前: 0
高水位标记: 0
发送至一个:
本地优先级: 1
网络优先级: 1
客户端ID: 151
消息VPN: v1
正常运行时间: 0天0小时2分钟52秒
慢速订阅者: 否
客户端用户名: 缓存
用户: 'whani' 计算机:'dev184' 进程ID:11035
描述:
软件版本: 5.1.0.223
软件日期: 2010年10月19日11:47:18
平台: Linux26-i386_opt - C SDK
一次性事件:
大消息: 未触发
消息太大: 未触发
解析错误: 未触发
最大消除主题: 未触发
从最低到最高优先级列出: (G-保证,D-直接,C-控制)
*************************** 客户端传输队列 ***************************
队列 | 长度 | 长度 | HWMark | 最大 | 丢弃 | 交付
(优先级) | (消息) | (工作) | (工作) | (工作) | (消息) | (消息)
-------+---------+---------+----------+----------+----------+-----------------
G-1 | 0 | 0 | 0 | 20000 | 0 | 0
D-1 | 0 | 0 | 0 | 20000 | 0 | 0
D-2 | 0 | 0 | 0 | 20000 | 0 | 0
D-3 | 0 | 0 | 0 | 20000 | 0 | 0
C-1 | 0 | 0 | 1 | 20000 | 0 | 3
下表解释了显示的队列统计信息。
列名称 | 描述 |
---|---|
队列 (优先级) | 对于构成邻居链接的四个TCP数据连接(Conn-1, Conn-2, Conn-3, Conn-4),列出队列类型和优先级(从低到高):G-1(保证1);D-1(直接1);D-2(直接2);D-3(直接3)。 |
长度 (消息) | 目前等待在队列中的消息数量。 |
长度 (工作) | 队列中当前的工作单位数量。 |
HWMark (工作) | 自统计信息上次清除以来,队列达到的最大深度(工作单位)。 |
最大 (工作) | 可以在队列中放置的工作单位数量,然后消息将被丢弃。 |
丢弃 (消息) | 从队列中丢弃的消息数量。 |
交付 (消息) | 从队列中交付的消息数量。 |
队列面板统计信息
显示CSPF邻居统计队列
要查看事件代理邻居的消息队列统计信息,请输入以下命令:
solace> show cspf neighbor <physical-message broker-name> stats queues
其中:
<physical-message broker-name>
是邻居的完整物理事件代理名称,或邻居的物理事件代理名称的一部分,使用通配符字符?表示名称中的一个字符,或使用通配符字符表示名称中的零个或多个字符,输入仅通配符字符将显示所有邻居。
示例
solace> show cspf neighbor 1.2.3.4 stats queues
邻居: 1.2.3.4
连接方式: 1.2.3.4:55555
控制端口: 未指定
******************* 控制队列 - 控制卡 ******************
| 长度 | HWMark
队列 | (消息) | 消息)
----------------+---------+---------
CSPF | 0 | 0 |
SMRP | 0
| 0 |
列出来自最低到最高优先级的队列: (G-保证,D-直接,C-控制)
****************** 数据队列 - 网络加速刀片 ******************
队列 | 长度 | 长度 | HWMark | 最大 | 丢弃 | 交付
(优先级) | (消息) | (工作) | (工作) | (工作) | (消息) | (消息)
-------+---------+---------+----------+----------+----------+-----------------
Conn-1
G-1 | 0 | 0 | 0 | 20000 | 0 | 0
D-1 | 0 | 0 | 0 | 20000 | 0 | 0
D-2 | 0 | 0 | 0 | 20000 | 0 | 0
D-3 | 0 | 0 | 0 | 20000 | 0 | 0
Conn-2
G-1 | 0 | 0 | 0 | 20000 | 0 | 0
D-1 | 0 | 0 | 0 | 20000 | 0 | 0
D-2 | 0 | 0 | 0 | 20000 | 0 | 0
D-3 | 0 | 0 | 0 | 20000 | 0 | 0
Conn-3
G-1 | 0 | 0 | 0 | 20000 | 0 | 0
D-1 | 0 | 0 | 0 | 20000 | 0 | 0
D-2 | 0 | 0 | 0 | 20000 | 0 | 0
D-3 | 0 | 0 | 0 | 20000 | 0 | 0
Conn-4
G-1 | 0 | 0 | 0 | 20000 | 0 | 0
D-1 | 0 | 0 | 0 | 20000 | 0 | 0
D-2 | 0 | 0 | 0 | 20000 | 0 | 0
D-3 | 0 | 0 | 0 | 20000 | 0 | 0
下表解释了显示的队列统计信息。