集群消费和广播消费

集群消费和广播消费是云消息队列 RocketMQ 版的基本消费模式,您可以在消费者客户端将消费模式设置为集群消费或者广播消费,用于控制同一条消息只能被集群内一个消费者消费到,还是会被集群内每个消费者都消费到。

背景信息

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

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

集群消费

基本概念

集群消费模式下,同一Group下的多个消费者消费指定Topic中的消息时,云消息队列 RocketMQ 版会将多条消息投递给不同的消费者处理,同一条消息只会被一个消费者消费到。

图片2.png

适用场景

  • 消息负载均衡:当业务消息量很大时,可以使用集群消费模式将消息分配给多个消费者进行处理,实现负载均衡。每个消费者只处理其中一部分消息,从而提高消息的处理效率和吞吐量。

  • 分布式数据处理:在大规模数据处理的场景中,使用集群消费模式可以将数据分发给多个处理节点进行并行处理。每个节点只处理其中一部分数据,从而加速数据处理的速度。

注意事项

  • 集群模式下,不保证每一次失败重投的消息投递到同一台机器上。

  • 请保持消费模式一致性,即一个Group下的所有消费者都设置相同的消费模式,如果消费模式混用则全部以广播消费为准。

    例如,同一个Group下有5个Consumer,其中2个Consumer设置为集群模式消费,另外3个Consumer设置为广播消费模式,实际所有的Consumer都将按照广播消费模式进行消费。

广播消费

基本概念

广播消费模式下,同一Group下的多个消费者消费指定Topic中的消息时,云消息队列 RocketMQ 版会将每条消息都投递给集群内所有的消费者,保证每条消息至少被每个消费者消费一次。

该模式适用于多个消费者对同一组消息进行并行处理的情况,例如,订单处理。

图片3.png

适用场景

  • 通知公告:当某个重要公告或通知发布时,系统可以使用广播消费模式,将通知发送给所有订阅了该消息的用户。这样可以确保每个用户都能及时收到通知,并避免遗漏。

  • 实时数据同步:在分布式系统中,有时需要将某个数据进行实时同步,保持多个节点的数据一致性。可以使用广播消费模式将这个数据的变更通知发送给所有需要同步的节点,每个节点都会收到相同的变更消息,从而保持数据的实时同步。

注意事项

  • 广播模式下,云消息队列 RocketMQ 版保证消息至少被客户端消费一次,但是并不会重投消费失败的消息,因此业务方需要关注消费失败的情况。

  • 广播模式下,客户端每一次重启都会从最新消息消费。客户端在被停止期间发送至服务端的消息将会被自动跳过,请谨慎选择。

  • 广播模式下,每条消息都会被大量的客户端重复处理,因此推荐尽可能使用集群模式。

  • 请保持消费模式一致性,即一个Group下的所有消费者都设置相同的消费模式,如果消费模式混用则全部以广播消费为准。

    例如,同一个Group下有5个Consumer,其中2个Consumer设置为集群模式消费,另外3个Consumer设置为广播消费模式,实际所有的Consumer都将按照广播消费模式进行消费。

集群消费和广播消费功能差异

集群消费和广播消费模式下,各功能的支持情况如下:

功能

集群消费

广播消费

TCP协议SDK

对号

对号

HTTP协议SDK

对号

错号

顺序消息

对号

错号

重置消费位点

对号

错号

消息重试

对号

错号

消息堆积查询、报警

对号

错号

订阅关系查询

对号

错号

消费进度

由服务端维护

  • 可靠性更高,客户端重启后,将按照上次的消费进度继续消费。

  • 支持服务端消费重试机制,详细信息,请参见消息重试

由客户端维护

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

设置集群消费和广播消费

云消息队列 RocketMQ 版的消费方式支持在消费者客户端修改,您需要在订阅消息的SDK代码中设置相关参数。若未设置,则默认使用集群消费方式。

TCP协议SDK

Java SDK示例

  • 集群消费

    // MessageModel设置为CLUSTERING(不设置的情况下,默认为集群消费)。
    properties.put(PropertyKeyConst.MessageModel, PropertyValueConst.CLUSTERING);
  • 广播消费

    // MessageModel设置为BROADCASTING。
    properties.put(PropertyKeyConst.MessageModel, PropertyValueConst.BROADCASTING); 

C/C++ SDK示例

  • 集群消费

    // MessageModel设置为CLUSTERING(不设置的情况下,默认为集群消费)。
    factoryInfo.setFactoryProperty(ONSFactoryProperty:: MessageModel, ONSFactoryProperty::CLUSTERING);
  • 广播消费

    // MessageModel设置为BROADCASTING。
    factoryInfo.setFactoryProperty(ONSFactoryProperty:: MessageModel, ONSFactoryProperty::BROADCASTING);

.NET SDK示例

  • 集群消费

    // MessageModel设置为CLUSTERING(不设置的情况下,默认为集群消费)。
    factoryInfo.setFactoryProperty(ONSFactoryProperty.MessageModel, ONSFactoryProperty.CLUSTERING); 
  • 广播消费

    // MessageModel设置为BROADCASTING。
    factoryInfo.setFactoryProperty(ONSFactoryProperty.MessageModel, ONSFactoryProperty.BROADCASTING);     

HTTP协议SDK

HTTP协议默认仅支持集群消费,无需设置。

集群消费和广播消费常见问题

为什么将消费模式设置为广播消费实际未生效?

可能原因如下:

  • 您使用的顺序消息:顺序消息仅支持集群消费,不支持广播消费。

  • 您使用的HTTP协议的SDK:HTTP协议仅支持集群消费,不支持广播消费。

一个Group中,是否支持既设置集群消费又设置广播消费?

不支持。

请保持消费模式一致性,即一个Group下的所有消费者都设置相同的消费模式,如果消费模式混用则全部以广播消费为准。

相关文档

完整的消息收发示例代码,请参见SDK参考概述