跳到主要内容

PubSub+ JCSMP API中的消息传递模式

PubSub+ 事件代理支持以下消息传递模式:

最多一次传递

PubSub+ 事件代理提供两种选项:直接消息传递和非持久消息传递。

非持久消息传递模式用于满足 JMS 规范要求。对于 Solace 消息传递 API,非持久消息与持久消息的功能相同。

最少一次传递

PubSub+ 事件代理通过持久(保证)消息传递提供此功能,通常称为保证消息传递。保证消息传递有两个方面:发布保证消息和接收保证消息。

事务传递

PubSub+ 事件代理支持基于会话的事务和 XA 事务。

直接消息传递

直接消息传递适用于高速应用程序,这些程序可以容忍偶尔的消息丢失。生产者可以向主题发布消息,当这些消息被事件代理接收时,它们将被传递给具有匹配主题订阅的消费者。直接消息不会在事件代理上为消费客户端池化(即它们不会持久化),也不会在接收时确认。

img

了解更多信息:

持久(保证)消息传递

持久或保证消息传递是:发送持久消息并正确处理发布确认,以及至少一次传递的组合。同样重要的是,保证消息永远不会丢失。保证消息传递有两个方面:发布保证消息和接收保证消息。

了解更多信息:

发布保证消息

当使用持久消息传递向事件代理发送消息时,客户端可以向队列或主题发布消息。

img

当消息被事件代理接收时,它们将被保存在事件代理的消息池中,即它们将被持久化,然后才向生产者确认。确认是向发布者确认事件代理已接受消息且不会丢失消息。

接收保证消息

消息将传递给绑定到已接收保证消息的端点的消费者。这些消息将在事件代理上持久化,直到它们过期,或者消费客户端确认消息,表明它们已被消费。

img

非持久消息传递

非持久消息传递模式用于满足 JMS 规范要求。它还用于消息提升和降级,这在 消息提升和降级 中有解释。只有 JMS 客户端应用程序在发布时应直接使用此模式。

消息提升和降级

在前面关于直接和持久(保证)消息传递的讨论中,生产者和消费者都使用了相同的消息传递模式。然而,生产者和消费者可以使用不同的消息传递模式,从而最终实现直接和持久消息传递的混合,这是通过消息提升和降级实现的。

消息提升和降级可能会给您的部署带来几个潜在的缺点。在决定实施此功能之前,请仔细考虑以下限制:

  • 消息提升不能保证无损。直接消息发布者可以比保证消息传递路径处理消息的速度更快地发送消息,而且它没有与保证发布者相同的反向压力机制。在这种情况下,事件代理会在提升路径上积极丢弃消息,以保护保证消息传递路径。

  • 消息提升可能导致资源问题。因为直接消息发布者可以比保证消息传递客户端消费消息的速度更快地发送消息,事件代理上为队列分配的磁盘空间可能会被迅速消耗。

  • 高速率的消息提升会影响保证消息传递的延迟。

  • 消息降级可能导致重复消息。如果发布应用程序没有从事件代理收到确认,消息将被重新传输。事件代理为保证消息传递订阅者内置了防止这种重新传输的机制,然而直接消息传递订阅者会收到额外的副本。

如需进一步指导,请联系 Solace。

消息提升

消息提升是指生产者发送直接消息,消费者从保证消息传递端点接收这些消息的情况。在这种情况下,消费者将接收非持久消息。

这是应用程序中一个典型的场景,其中有一个实时发布者发送事件,至关重要的是这个发布者永远不会受到反向压力。然而,同时有一些消费者希望以最容错、持久的方式接收数据。在这种情况下,消费者可以使用具有映射主题的队列端点接收事件。如果消费者应用程序脱机,消息将累积在队列端点中。如果消费者应用程序脱机或缓慢,它不会错过消息。

消息降级

消息降级是指生产者发送持久消息,有消费者希望接收这些消息,但可以容忍丢失消息的情况。这些消费者可以添加与这些消息匹配的主题订阅,并实时以直接消息的形式接收它们。这些消费者不会对发布应用程序产生反向压力,如果它们脱机,这些消费者将简单地错过消息。总体而言,发布应用程序正在发送关键任务数据,但这些数据的一些消费者不是关键任务的,永远不应该被允许影响发布者。

从消费者的角度来看,确保完全保证消息传递的唯一方法是如果消息是从具有持久传递模式的端点接收的。这意味着消息是持久发送的,并且是在保证消息传递端点上接收的。所有其他组合都是最多一次消息传递的示例,消费者将以直接或非持久消息的形式接收它们。

总结

下表概述了 PubSub+ 事件代理中的消息提升和降级。

发布消息的传递模式作为…被端点接收作为…被具有匹配主题订阅的客户端接收
直接非持久直接
非持久非持久直接
持久持久直接

了解更多信息:

消息传递模式术语

不同的协议和 API 使用不同的术语来描述传递模式。下表提供了事件代理支持的各种协议的总结。

消息 QoSSolace APIJMSMQTTAMQPSolace REST
最多一次传递直接(默认)非持久QoS 0(默认)仅限发布者直接
(不支持直接订阅者)直接
最少一次传递持久持久QoS 1持久持久(默认)
事务性基于会话会话 + XA不适用不适用不适用