跳到主要内容

保证消息

保证消息可以在接收应用程序离线或网络设备发生故障的情况下,确保应用程序之间的消息传递。消息按照它们发布顺序进行传递。

保证消息通过将消息缓冲到持久存储中,跨事件代理重启保持消息。事件代理在验证所有客户端和下游事件代理成功交付后,才会保留消息的副本。

尽管通常使用持久传递模式进行保证消息传递,但为了与Java消息服务(JMS)兼容,并允许在主题匹配时根据端点或客户端订阅的持久性要求修改消息的传递模式,也提供了非持久传递模式。有关更多信息,请参见主题匹配和消息传递模式。

要支持保证消息,事件代理必须启用消息缓冲。此外,PubSub+设备还必须安装有保证交付刀片(ADB)。在PubSub+云事件代理服务中,默认启用消息缓冲。

通过保证消息被事件代理接受以交付给客户端的消息永远不会丢失,但如果超出系统资源限制,则可能不会被接受。如果事件代理无法接收传入消息(例如,如果超出缓冲配额),发布者将不会被确认,并且相应的事件代理统计信息将增加。

保证消息传递用例

本节提供了保证消息常用的场景示例:

  • 消息请求队列
  • 慢速消费者
  • 使用保证消息的请求/回复

消息请求队列

如果队列以非独占访问模式创建,消费者可以负载均衡地处理消息请求。或者,队列可以设置为独占模式,以便只有第一个消费者处理请求,其他绑定的客户端在第一个消费者断开连接时作为备份。发布客户端与消息项的处理方式解耦——它们只需将请求消息发布到队列。

消费者还可以配置其最大窗口大小和最大未确认消息数,以设置在其流程中管道传输的消息项数量。每处理一个消息项,消费者应用程序就会触发对事件代理的确认,以将其流程管道中的另一个消息拉入。

如果需要确保即使所有消费者从队列断开连接,消息也持久保存,请使用持久队列代替临时队列。

如果需要限制对消息队列的访问以控制哪些应用程序可以订阅请求消息,请将特定用户(例如,客户端用户名messageItemProcessor)设置为队列的所有者,并将others权限设置为none

慢速消费者

保证消息可用于为慢速消费者缓冲消息。例如,使用主题订阅接收直接消息并将其写入数据库的客户端应用程序可能无法跟上发布者的大量消息。

为处理这种情况,客户端可以创建一个持久队列并向其中添加主题订阅。主题订阅会吸引消息,这些消息将被更改为非持久性并缓冲到队列中。客户端应用程序随后可以消费和确认,而不必担心超出其处理能力的消息速率。发布者也能够尽可能快地发布,而不需要考虑潜在的慢速消费应用程序。

使用保证消息的请求/回复

从高层次来看,以下步骤发生:

  1. 事件代理被配置以支持保证消息。
  2. 客户端应用程序使用客户端在事件代理上创建一个非持久队列,然后创建一个消费者流程绑定到该队列。
  3. 客户端发布一个(可能是保证的)请求消息到一个众所周知的主题,并指定将请求的回复发送到新创建的临时队列。
  4. 事件代理监听主题(或者如果它有添加的主题订阅,则绑定到队列)并通过向指定的非持久队列发布来响应请求。
  5. 客户端从非持久队列消费回复消息。一旦完成处理响应,它关闭流程,这将删除非持久队列。