跳到主要内容

消息传输模式

Solace JMS 实现允许客户端使用保证传输(Guaranteed Transport)或直接传输(Direct Transport)模式来发送和接收 JMS 消息。这些传输模式允许 JMS 客户端利用事件代理的保证消息(Guaranteed Messaging)或直接消息(Direct Messaging)功能,并且它们为非持久化(Non‑Persistent)消息提供了不同的服务质量。

要使用的传输模式取决于 JNDI 连接工厂中的直接传输消息传递属性(Direct Transport message delivery property)是否启用(参见直接传输)。默认情况下,直接传输模式是启用的。要使用保证传输模式,必须在 JNDI 连接工厂中将直接传输属性设置为 false。

保证传输模式

保证传输模式使用事件代理的保证消息功能。如果事件代理安装了 ADB 并且启用了保证消息和消息转储(message spooling),则可以使用此传输模式。

保证传输通过以下方式防止非持久化或持久化消息丢失:

  • 在事件代理上配置了队列或主题端点(用于支持持久化订阅名称),消息可以从这些端点发送和消费。这些端点是持久化的,也就是说,它们的生命周期独立于任何特定客户端会话(Session),即使没有会话连接,消息也可以在持久化端点上累积。

可以使用 SolAdmin 或 CLI 配置持久化端点(参见 Solace JNDI 对象)。此外,如果启用了动态持久化(Dynamic Durables)API 属性,当调用 Session.createDurableSubscriber()Session.createQueue() 方法时,事件代理上会自动配置相应的持久化主题端点或队列(参见动态持久化)。

  • 从生产者(Producers)到事件代理上的持久化队列或订阅的消息传递由消息确认过程保证。(有关此过程的详细信息,请参见保证消息。)
  • 当 JMS 消息被事件代理接收时,它们会存储在非易失性存储中,直到消息被消费,或者直到持久化队列或订阅的生命周期结束。如果消费客户端断开连接,存储的消息可以在客户端重新连接时被消费。这确保了如果消费者短暂断开与事件代理的连接,或者在冗余事件代理之间的故障切换场景中发生活动切换,消息也不会丢失。

由于消息确认和转储,保证传输提供了更高的可靠性,但处理非持久化消息的性能不如直接传输模式处理非持久化消息时高。

必须使用保证传输将持久化消息传递给事件代理,以及从持久化订阅和队列向消费者传递持久化消息。

直接传输模式

连接到事件代理的客户端可以使用直接传输模式发布非持久化消息,并消费非持久化消息。

直接传输模式使用事件代理的直接消息功能,因此它提供了尽可能高的消息传递性能,因为非持久化消息是不被保证的。也就是说,在使用直接传输时,接收到的非持久化消息不会被确认,事件代理也不会为消费者转储这些消息。在遇到拥塞或系统故障时,或者当消费客户端未连接时,这些消息可能会被丢弃。

当客户端使用直接传输发布非持久化消息时,事件代理不需要安装 ADB 并启用保证消息和消息转储。但是,当使用此模式发布持久化消息时,事件代理必须安装 ADB 并启用保证消息和消息转储,否则发布的任何持久化消息都将被拒绝。

当使用直接传输时,发布或消费的持久化消息仍然像使用保证传输时一样被处理(也就是说,事件代理仍然执行消息确认和转储)。所有保证消费者如果以持久化方式发布,就会收到持久化消息;如果以非持久化方式发布,或者是直接发布并且被提升为非持久化,就会收到非持久化消息。相反,所有直接消费者总是接收直接消息。

有关直接传输模式以及在设计应用程序时应考虑的一些功能交互的更多信息,请参见直接传输行为。

支持的消息类型和传输模式

事件代理支持的消息类型和传输模式取决于它是否安装了 ADB 并启用了保证消息和消息转储。

是否安装了 ADB、启用了保证消息和消息转储支持的消息类型和传输模式
- 持久化消息与保证传输
  • 非持久化消息与保证传输
  • 非持久化消息与直接传输 | | 否 | - 非持久化消息与直接传输 |