跳到主要内容

设置消息属性

以下各节讨论了可以为要发布的消息设置的一些重要消息属性。这些属性可能会影响消息的路由方式。

  • 生存时间(Time-to-Live)
  • 死信队列资格(Dead Message Queue Eligibility)
  • 消息省略资格(Eliding Eligibility)
  • 分区键(Partition Key)

生存时间(Time-to-Live)

为了确保不会消费过时的消息,您可以为生产者发布的每个保证消息设置生存时间(TTL)值(以毫秒为单位)。 当使用直接传输时,非持久化端点会忽略 TTL 值。

尊重 TTL

如果目标队列或主题端点配置为尊重消息的 TTL,则当收到的消息的 TTL 过期时,它们将被端点丢弃,或者如果消息符合死信队列(DMQ)的资格,则将被移动到在事件代理上配置的 DMQ。

可以在 connectionFactory 级别设置的 respect-ttl 属性值可以通过 InitialContext 环境使用 SupportedProperty.SOLACE_JMS_RESPECT_TIME_TO_LIVE 覆盖。

设置 TTL

可以通过以下方式为消息设置 TTL 值:

  • 调用 MessageProducer.setTimeToLive(long timeToLive)MessageProducer 发布的所有消息设置默认 TTL 值。(值为 0 表示消息永不过期。)

  • 在获取 MessageProducer 后,可以在调用以下方法之一发布消息时传递 TTL 值:

    • send(Destination destination, Message message, int deliveryMode, int priority, long timeToLive)send(Message message, int deliveryMode, int priority, long timeToLive)

通过这些方法设置的 TTL 值将覆盖在 MessageProducer 级别设置的任何值。

将消息移动到 DMQ

如果要将 TTL 值过期的消息移动到配置的 DMQ,端点必须配置为尊重消息的 TTL 值:

  • 如果使用 SolAdmin 配置端点,必须启用“尊重 TTL”复选框并创建一个新的队列或订阅名称(即端点)。
  • 如果要动态创建端点,则使用的 connectionFactory 也应配置为尊重 TTL。因此,当使用 SolAdmin 创建 connectionFactory 时,启用“尊重 TTL”复选框。当使用 CLI 创建 connectionFactory 时,将 respect‑ttl 设置为 true。有关更多信息,请参阅 Solace JNDI 对象。

死信队列资格

超过其 TTL 或最大重新投递尝试次数的保证消息可以被移动到持久化队列或主题端点的 DMQ,而不是被丢弃,如果这些消息被标记为符合 DMQ 资格。DMQ 只是一个被分配为另一个持久化端点的 DMQ 的持久化队列。有关更多信息,请参阅配置死信队列。

可以通过 JMS API(参阅创建队列)动态创建名为 #DEAD_MSG_QUEUE 的队列,也可以通过 CLI 或 SolAdmin 配置。

可以在每条消息的基础上将发布的消息标记为符合 DMQ 资格,也可以在连接工厂的基础上启用消息符合 DMQ 资格,以便使用该连接工厂的生产者发布的所有消息都符合 DMQ 资格。

  • 要标记单条消息

为每条消息设置 SOLACE_JMS_PROP_DEAD_MSG_QUEUE_ELIGIBLE 属性为 true

  • 要在连接工厂级别标记消息

使用 SolAdmin 或 CLI 启用 default-dmq-eligible 属性。

有关此消息属性的更多信息,请参阅符合死信队列资格。

消息省略资格

Solace PubSub+ 的消息省略功能允许客户端应用程序仅接收它们订阅的主题发布的最新消息,以它们可以管理的速率。在需要较慢的消息速率或存在慢速消费者的情况下,使用消息省略可能很有用。

要使用消息省略,需要执行以下步骤:

  • 消费客户端应用程序必须通过其客户端用户名被分配一个允许其使用消息省略的客户端配置文件。客户端配置文件还设置了一个速率,以控制新省略资格消息省略排队等待传递给客户端的前一个版本的延迟间隔。
  • 发布的消息必须被标记为符合消息省略资格。
  • 可以在每条消息的基础上将发布的消息标记为符合消息省略资格,也可以在连接工厂的基础上启用消息省略资格,以便使用该连接工厂的生产者发布的所有消息都符合省略资格。
    • 要标记单条消息,请为每条消息设置 SOLACE_JMS_PROP_ELIDING_ELIGIBLE 属性为 true
    • 要在连接工厂级别标记消息,请使用 SolAdmin 或 CLI 启用 default-eliding-eligible 属性。

有关此消息属性的更多信息,请参阅符合省略资格。

分区键

您可以在消息中设置分区键,以利用分区队列。分区队列允许您轻松扩展事件网格中的消费者应用程序数量,同时保持所有具有相同分区键的已发布消息的消息顺序。PubSub+ 事件代理确保所有相关事件以正确的顺序传递到同一个消费者,并且在您添加或移除消费者时重新平衡事件流。有关更多信息,请参阅分区队列。

要设置分区键,请使用 setStringProperty(name,value) 方法在 JMS API 消息上设置名称-值对。

  • name — 常量 SupportedProperty.JMSX_GROUP_ID 或字符串值 JMSXGroupID

  • value — 表示分区键值的字符串。客户端应用程序在发布时设置该值。

以下示例将分区键 value 设置为 Group-0

Message message = message.setStringProperty("JMSXGroupID", "Group-0");
// 或者:
Message message.setStringProperty(SupportedProperty.JMSX_GROUP_ID, "Group-0");

端到端有效载荷压缩

PubSub+ JMS API 可以执行消息有效载荷压缩,以实现:

  • 更快的消息吞吐量
  • 减少带宽使用
  • 提高应用程序性能

虽然消息有效载荷压缩会为单个 PubSub+ API 增加更多工作量,但它可以实现更快的聚合消息发布和接收速率。PubSub+ 事件代理提供传输消息压缩,可以压缩整个消息,具体请参阅流式压缩连接。然而,当您发送和接收大消息时,压缩整个消息会使事件代理承担大量工作,这可能导致吞吐量降低。如果您的应用程序需要发送和接收大消息,建议您使用消息有效载荷压缩来提高性能。

压缩消息有效载荷时的注意事项

以下各节解释了在使用 PubSub+ 消息 API 压缩消息有效载荷时应注意的事项。

仅使用一种消息压缩方式

建议您仅使用一种压缩方式,要么通过事件代理使用流式压缩连接,要么通过 API 使用端到端有效载荷压缩。多次压缩相同的消息会浪费资源,通常不会导致消息大小进一步减小。

不要对小消息使用端到端有效载荷压缩

端到端有效载荷压缩最适合几兆字节大小的消息。Solace 不建议对小消息使用消息有效载荷压缩,因为端到端有效载荷压缩实际上可能会增加小消息的大小。

升级发布者和接收者应用程序

只有当 API 支持消息有效载荷压缩并且已更新到最低支持版本时,接收者应用程序才会自动解压缩任何压缩的消息有效载荷。如果您的接收者应用程序不支持消息有效载荷压缩,可能会导致潜在的错误或异常。确保将您的发布者和接收者应用程序都升级到有效载荷压缩的最低支持版本。有关版本支持信息,请参阅 PubSub+ 消息 API 中的功能支持。

端到端有效载荷压缩限制

端到端有效载荷压缩目前不支持 PubSub+ 缓存。

端到端有效载荷压缩与以下内容不兼容:

  • SolCache
  • 非 SMF 协议,如 AMQP、HTTP、Kafka 和 MQTT

如果您的应用程序使用了上述任何内容,建议您不要使用端到端有效载荷压缩。

在 PubSub+ JMS API 中压缩消息有效载荷

您的发布者应用程序可以在发布消息之前压缩消息的二进制有效载荷。要压缩消息有效载荷,您必须设置 JMS 有效载荷压缩级别,这告诉 API 您希望启用消息压缩。有效载荷压缩级别属性可以设置为 0 到 9 之间的整数:

  • 0 — 禁用有效载荷压缩。这是默认设置。
  • 1 - 9 — 启用有效载荷压缩。1 是最低级别的压缩,数据吞吐量最快,9 是最高级别的压缩,数据吞吐量最慢。

您应该根据网络和性能要求调整有效载荷压缩级别。以下代码片段展示了启用消息有效载荷压缩的两种方式:

  1. 在初始上下文中设置 SOLACE_JMS_PAYLOAD_COMPRESSION_LEVEL
Hashtable env = new Hashtable();
//...
env.put(SupportedProperty.SOLACE_JMS_PAYLOAD_COMPRESSION_LEVEL, 9);
InitialContext initialContext = new InitialContext(env);
  1. 在 JNDI 属性文件中设置 SOLACE_JMS_PayloadCompressionLevel
Solace_JMS_PayloadCompressionLevel=9

消息有效载荷压缩仅适用于二进制消息附件。如果您想压缩 TextMessage 的有效载荷,需要将 SOLACE_JMS_PROP_ISXML 设置为 false,这告诉 API 将文本放入消息的二进制附件中:

TextMessage msg = session.createTextMessage("My text message"));
msg.setBooleanProperty(SupportedProperty.SOLACE_JMS_PROP_ISXML, false);

由于连接工厂具有优先级,只有当事件代理没有向 JMS 发送值时,通过 JNDI 属性文件或初始上下文设置的值才会被使用。例如,如果您使用的事件代理版本不支持消息压缩 JNDI 属性,则消息压缩的值将默认为初始上下文或属性文件中指定的值,因为代理本身不会为其提供值。