消息缓冲
当事件代理接收到保证消息时,它会处理该消息以确定是否有任何注册的主题订阅或队列与消息发布的主题匹配。如果在事件代理上存在主题订阅匹配或匹配的队列,消息及其所有匹配项将被缓冲,然后事件代理确认收到消息。在确认消息后,事件代理尝试将其交付给所有匹配的客户端和事件代理。随着每个客户端和事件代理确认收到消息,与消息相关的匹配项将从消息的匹配列表中删除。一旦与消息相关联的匹配项全部消失,消息本身将从缓冲区中删除。
如果一个或多个客户端处于离线状态或滞后,消息将被保存在持久存储中,直到可以被交付。如果待处理的消息太多,以至于无法全部保存在内存中,消息将以大块的形式写入磁盘。这意味着,只有对于慢速或离线客户端的消息才需要写入磁盘,并且可以以高效的方式进行。如果所有客户端都能迅速确认消息,那么消息就不需要写入磁盘。
由于资源或操作限制,消息可能不会被缓冲。事件代理在消息被缓冲之前执行各种检查。这些检查包括:
- 缓冲该消息是否会超出事件代理范围的消息缓冲配额?
- 缓冲该消息是否会超出消息VPN的消息缓冲配额?
- 缓冲该消息是否会超出端点的消息缓冲配额?
- 缓冲该消息是否会超出端点允许的最大消息大小?
- 该消息是否会超出端点的最大消息大小?
- 目标端点是否已关闭?
- 如果消息是低优先级消息,缓冲该消息是否会超出端点拒绝低优先级消息的限制?
根据消息未被缓冲到端点的原因,要么不向发布者返回确认,要么返回负面确认(即,“nack”),发布者需要处理这些可能性。然后事件代理上的统计数据会增加。
- 如果在消息被缓冲到该订阅时订阅被删除,消息仍将被交付。
- 如果在消息被缓冲到该端点时端点被删除(例如,通过Solace CLI),消息将不会被交付。
消息缓冲文件
事件代理使用缓冲文件来缓冲保证消息。消息缓冲区存储缓冲文件,您选择的消息缓冲大小应支持缓冲可能需要存储的消息数量。如果事件代理的缓冲文件全部在使用中,它就无法接收更多消息,直到一些缓冲的消息被确认,这可能会在消息缓冲区中释放一些空间。
如果事件代理达到其最大缓冲文件使用量,它将向所有发布客户端返回负面确认(NACKs)。您可以配置阈值,在消息缓冲使用过高时生成事件。
有关更多信息,请参见为PubSub+云配置消息缓冲大小和软件事件代理和设备的消息缓冲文件阈值。
窗口确认
在事件代理和发布及接收保证消息的各个客户端之间的传输层,使用窗口确认机制。
窗口确认可以防止往返确认时间成为消息吞吐量的制约因素。它通过允许在事件代理和发布或订阅客户端之间在需要确认之前传输一定数量的消息来实现这一点。窗口大小可以通过Solace消息API流属性进行配置。
Solace API还从应用程序到事件代理批量确认。下图显示了客户端应用程序发送多个保证消息的确认,API将这些确认合并为单个确认在网络上传输,然后返回给事件代理。批量大小通过API流属性进行配置。
采用任何窗口确认方案都有可能在客户端接收消息和 事件代理接收确认之间的时间发生故障。在这段时间内发生故障,需要重新发送所有未确认的在途消息。因此,重新交付的消息数量增加,与窗口大小和确认阈值的组合成正比。
累积ACK和确认阈值
已交付但未确认的消息
对于通过消费者流程传递给绑定客户端的保证消息,如果没有该客户端返回确认,存在一个硬性限制。达到此限制(加上一个窗口大小的消息)时,事件代理会停止向客户端交付消息,直到客户端确认已经交付的消息。
您可以为消息VPN上配置的队列或主题端点配置已交付但未确认消息的最大数量限制(参见消息VPN级保证消息配置)。
事件代理对于所有客户端在给定时间内的最大已交付但未确认消息数量有一个系统级限制。达到此最大值时,不再向客户端交付更多消息,直到一些客户端向事件代理返回确认,或者它们被断开连接。支持的最大已交付但未确认消息数量取决于事件代理版本。
默认情况下,当未被接收客户端确认的未决消息数量达到系统最大值的80%时,会生成一个事件,当客户端未确认消息数量低于系统最大值的60%时,会生成另一个事件。这些事件生成的阈值是可配置的(参见已交付未确认阈值)。
消息过期
为了限制已发布消息 被消费和确认的时间,您可以为它们分配生存时间(TTL)过期值。
- 如果您的应用程序使用Solace消息API或REST服务发布保证消息,您可以为每个发布的保证消息设置生存时间(TTL)过期值,以指示消息应该被视为有效的时间。发布者TTL过期从消息发布时开始,并随着消息通过网络而倒计时。
- 您可以为持久端点配置最大生存时间(TTL)值,以便在持久端点上限制接收到的消息可以停留的时间,当使用最大TTL时。最大TTL仅在消息在端点上时适用。
当以任一或两种方式将TTL值应用于消息时,未在到期时间前被消费和确认的消息将被丢弃或移动到死信队列(DMQ)。如果消息同时具有发布者分配的TTL和端点分配的最大TTL,则事件代理将在消息在端点上时使用两个TTL值中的最小值。
如果使用消息VPN桥,以便将匹配主题订阅的已发布消息从远程消息VPN的一个事件代理传递到另一个事件代理的本地消息VPN,则计算消息在每个事件代理上花费的时间。也就是说,计算消息在远程事件代理上花费的时间,并在消息发送到本地消息VPN时更新其剩余生存时间。例如,如果发布者提供的TTL为八秒,消息在第一个事件代理上花费两秒,则在到达第二个事件代理的本地消息VPN之前,它将有六秒的TTL。
使用TTL使未快速处理的消息过期,可以帮助防止过时的消息被传递给消费者。但需要注意的是,使用TTL监控和处理消息可能会影响保证消息传递的系统级限制(有关更多信息,请参见保证消息排队限制)。
最大缓冲使用量
您可以设置事件代理上各种对象可 以消耗的缓冲磁盘空间的最大值(max-spool-usage
)。以下表格列出了此值的默认设置以及相应的事件阈值。
系统级设置
代理类型 | 最大缓冲使用量 (MB) | 设置阈值 (%) | 清除阈值 (%) |
---|---|---|---|
软件事件代理 | 默认:1,500 | ||
最大:6,000,000 | 80 | 60 | |
设备 (3530) | 默认:60,000 | ||
最大:800,000 | 80 | 60 | |
设备 (3560) | 默认:60,000 | ||
最大:6,000,000 | 80 | 60 |
消息VPN设置
代理类型 | 最大缓冲使用量 (MB) | 设置阈值 (%) | 清除阈值 (%) |
---|---|---|---|
所有 | 默认:0 | ||
最大:与系统级设置的max-spool-usage 最大值相同 | 80 | 60 |
队列/队列模板/主题端点/主题端点模板/客户端预配置端点的设置
代理类型 | 最大缓冲使用量 (MB) | 设置阈值 (%) | 清除阈值 (%) | 设置阈值 (MB) | 清除阈值 (MB) |
---|---|---|---|---|---|
所有 | 默认:5000 | ||||
最大:与系统级设置的max-spool-usage 最大值相同 | 25 | 18 | 1250 | 900 |
有关设置max-spool-usage
值的信息,请参阅以下链接:
- 在系统级
- 对于队列
- 对于队列模板
- 对于主题端点
- 对于主题端点模板
有关设置消息缓冲使用事件阈值的信息,请参阅以下链接:
- 在系统级
- 对于队列
- 对于队列 模板
- 对于主题端点
- 对于主题端点模板
- 对于客户端预配置端点