消息队列RocketMQ版支持集群消费和广播消费,本文介绍集群消费和广播消费的基本概念、适用场景、功能差异、注意事项以及设置方式。

背景信息

消息队列RocketMQ版是基于发布和订阅模式的消息系统。消费者,即消息的订阅方,从订阅的Topic中接收消息并消费。

消费者应用一般是分布式系统,以集群方式部署。消费者在订阅Topic时,可根据实际业务选择集群消费或广播消费,集群中的多个消费者将按照实际选择的消费模式消费消息。

使用相同Group ID的消费者属于同一个集群。同一个集群下的消费者消费逻辑必须完全一致(包括Tag的使用)。更多信息,请参见订阅关系一致

集群消费模式

基本概念

集群消费:当使用集群消费模式时,消息队列RocketMQ版认为任意一条消息只需要被集群内的任意一个消费者处理即可。

适用场景

适用于消费端集群化部署,每条消息只需要被处理一次的场景。具体示例如下图所示:集群消费

广播消费模式

基本概念

广播消费:当使用广播消费模式时,消息队列RocketMQ版会将每条消息推送给集群内所有的消费者,保证消息至少被每个消费者消费一次。

应用场景

适用于消费端集群化部署,每条消息需要被集群下的每个消费者处理的场景。具体消费示例如下图所示:广播消费

集群消费和广播消费差异

集群消费和广播消费模式下,各功能的支持情况如下:
功能 集群消费 广播消费
TCP协议SDK 对号 对号
HTTP协议SDK 对号 错号
顺序消息 对号 错号
重置消费位点 对号 错号
消息重试 对号 错号
消息堆积查询、报警 对号 错号
订阅关系查询 对号 错号
消费进度 服务端维护
  • 可靠性更高,客户端重启后,将按照上次的消费进度继续消费。
  • 支持服务端消费重试机制,详细信息,请参见消息重试
客户端维护

出现重复消费的概率稍大于集群模式,客户端每次重启都会从最新消息消费。

说明

对号:表示支持该功能。

错号:表示不支持该功能。

注意事项

集群消费

  • 集群模式下,每一条消息都只会被分发到一台机器上处理。如果需要被集群下的每一台机器都处理,请使用广播模式。
  • 集群模式下,不保证每一次失败重投的消息路由到同一台机器上。

广播消费

  • 广播模式下,消息队列RocketMQ版保证消息至少被客户端消费一次,但是并不会重投消费失败的消息,因此业务方需要关注消费失败的情况。
  • 广播模式下,客户端每一次重启都会从最新消息消费。客户端在被停止期间发送至服务端的消息将会被自动跳过,请谨慎选择。
  • 广播模式下,每条消息都会被大量的客户端重复处理,因此推荐尽可能使用集群模式。

设置方式

设置消息的消费方式,需要在订阅消息SDK中设置以下参数:

TCP协议SDK

  • 集群消费
    // MessageModel设置为CLUSTERING(不设置的情况下,默认为集群订阅方式)。
    properties.put(PropertyKeyConst.MessageModel, PropertyValueConst.CLUSTERING);
  • 广播消费
    // MessageModel设置为BROADCASTING。
    properties.put(PropertyKeyConst.MessageModel, PropertyValueConst.BROADCASTING); 
以上示例以Java语言为例,更多信息,请参见以下文档:

HTTP协议SDK

HTTP协议仅支持集群消费,无需设置。更多信息,请参见HTTP SDK使用须知