消息优先级
消息队列和主题端点可以选择支持优先级消息传递。当您启用端点尊重消息优先级时,发布者消息中的优先级字段会被尊重,适用于所有保证消息和提升的直接消息。换句话说,队列或主题端点按照优先级顺序交付排队的消息;这意味着所有高优先级的消息在任何低优先级消息之前交付。
为了向消费者提供高消息传递吞吐量,PubSub+事件代理和API具有一个消息预取管道,用于将消息发送到客户端消费者流程。在加载此预取管道的过程中,事件代理会尊重优先级(高优先级消息优先于低优先级消息进入管道)。然而,一旦消息被加载到管道中,新的高优先级消息将不会跳过已经在管道中的低优先级消息。该管道由两个阶段组成:
- 事件代理的获取阶段,试图确保在传输允许时有消息可以发送给消费者。
- 传输/交付阶段。这是从代理到API的网络层传输的共同责任,以及在客户端API中实现的排队策略。
事件代理的预取阶 段是不可调节的。这意味着无论传输/交付阶段的深度如何减少,应用程序始终可能在事件代理接收到高优先级消息并将其放入管道后,接收到多达100条低优先级消息。实际数量可能少于100,具体取决于事件代理在接收高优先级消息时的确切状态。
管道的传输/交付阶段的实现细节在某种程度上取决于所使用的特定客户端API。在事件代理端,有一个工具可供所有客户端一致使用,即能够配置队列的max-delivered-unacked-msgs-per-flow
。该值指示事件代理可以在客户端应用程序确认已发送消息之前发送给消费者的最大消息数量。换句话说,该值限制了:
- 管道的传输/交付阶段中的消息数量。
- 已接收但尚未被客户端应用程序确认的消息数量。
将此值减少到最小值1可以最小化在高优先级消息之前可以交付的低优先级消息数量。然而,这可能会影响应用程序的性能。在减少此值时,您应该进行实验,以确定在不同网络环境中可以安全降低到何种程度,而不会对消息传递性能产生负面影响。
优先级级别
PubSub+事件代理支持从0(最低)到9(最高)的十个优先级级别。如果接收到的消息中的优先级字段大于9,则该消息被视为优先级9。没有优先级字段的消息被视为优先级4。
启用消息优先级支持时的注意事项
在决定启用端点尊重消息优先级时,您应了解以下注意事项:
- 当您启用端点尊重消息优先级时,高优先级消息的延迟在传递缓冲消息时会得到改善。
- 强制执行消息优先级会增加在消费者从连接故障中恢复后交付重复消息的机会。
- 尽管消息优先级在复制站点之间保持并在故障转移后受到尊重,但在复制队列和主题上始终禁用消息优先级的强制执行。换句话说,复制桥接链接不尊重复制消息的优先级。
- 当事件代理正在流式传输消息(消息消费速度快于生产速度)时,每条消息在接收时交付,这可能不是按优先级顺序交付的。
- 死信队列可以配置为尊重消息优先级。
- 最后值队列始终存储最后接收到的消息,无论消息的优先级值如何。
- 队列浏览器不尊重消息优先级。消息按发布顺序交付给浏览器。
- 桥接不尊重消息优先级。然而,优先级信息是被保留的。消息按发布顺序通过桥接交付。
- 分区队列不尊重消息优先级,即使它们被配置为尊重优先级。
- 消息优先级不适用于MQTT队列(MQTT队列无法配置为尊重消息优先级)。
- 在事务中消费的消息尊重消息优先级。
有关如何使用Solace CLI启用端点尊重消息优先级的信息,请参见配置队列或配置主题端点。
有关在PubSub+代理管理器中为队列启用消息优先级支持的更多信息,请参见为PubSub+云配置消息传递选项或为软件事件代理和设备配置消息传递选项。