消费组(Consumer Group)
消费组由多个具有相同消费属性的消费者组成,各自维护独立的消费进度(Offset)。不同消费组同时订阅同一主题时,每条消息会被每个消费组各自消费一次;同一消费组内(非广播模式),每条消息仅被组内某一个消费者消费一次。
为什么需要消费组
在现代分布式系统中,消息的消费端往往需要多个实例协同工作,以应对高并发和可靠性的需求。然而,多个消费者实例如何高效分摊消息、如何在实例故障时保障消息不丢失,是需要解决的问题。消费组通过将多个消费者实例组织在一起,实现了消息的负载均衡和重平衡,既提升了消费端的处理能力,又保障了故障场景下的消息可靠性。
消费组的优势是什么
- 负载均衡:消费组内的消费者实例可以自动分配消息,确保每个实例的负载均衡,提高系统整体处理能力。
- 重平衡:当消费者实例故障时,消费组自动将其负责的消息队列重新分配给其他实例,从已提交的消费进度继续消费,确保消息不丢失。
- 有序消费:消费组支持同一消息队列内的有序消费,确保该队列中的消息按发送顺序被处理,适用于对消息顺序有严格要求的场景。
消费组的工作原理
消费原理
RocketMQ为每个Topic划分了消息队列(Queue),队列数越大消费的并发度越大。一个消费组表示一个消费者群组,在分布式应用场景下,同一个消费组中的多个消费者共同完成Topic所有Queue的消费。Queue的分配以消费组为单位,会均匀分配给消费组下的消费者,而不会在意该消费者是否订阅了当前Topic。一个消费者只会分配到Topic中的某几个Queue,而一个Queue只会分配给一个消费者。
正确的订阅关系
在分布式应用场景下,一个消费组中所有的消费者拥有一个相同的消费组ID,他们需订阅相同的Topic和Tag,保持订阅关系一致,才能保证消息消费逻辑正确,消息不丢失。
- 同一个消费组的消费者必须订阅同一个Topic。例如,消费组Group1中有消费者A和消费者B,消费者A订阅了Topic A和Topic B,则消费者B也必须订阅Topic A和Topic B,不能只订阅Topic A或只订阅Topic B,或者额外订阅Topic C。
- 同一个消费组的消费者订阅同一个Topic下的Tag必须一致,包括Tag的数量和顺序。例如,消费组Group2中有消费者A和消费者B,消费者A订阅Topic A且Tag为Tag A||Tag B,则消费者B订阅Topic A时Tag也必须为Tag A||Tag B,不能只订阅Tag A或只订阅Tag B或订阅Tag B||Tag A。
消费组的分类
依据消息分发到组内实例的方式,消费组的消费模式可分为集群消费模式和广播消费模式。
- 集群消费模式:核心特征是负载均衡,组内实例分摊消息,每条消息仅被一个实例消费,适用于通过扩容提升处理能力的场景,如订单处理、日志分析等。消费进度由服务端统一维护。
- 广播消费模式:核心特征是全量分发,组内每个实例都会消费所有消息,适用于所有节点同步执行相同逻辑的场景,如配置更新、缓存刷新等。消费进度由各实例本地维护。
与消费组相关的操作和特性
在全面了解消费组的核心概念与应用场景后,本小节将为您介绍消费组的常用基础操作与高级应用特性。如果您想要深入了解并在实际业务中配置使用,可以点击相关超链接跳转查看详细的华为云官方文档。
消费组相关基础操作:
- 创建消费组:创建一个消费组后,消费者可以将同一类消息的消费归入同一个消费组,方便管理,详情请参考创建RocketMQ消费组。
- 修改消费组:消费组创建成功后,可以根据业务需要修改消费组的配置信息,详情请参考修改RocketMQ消费组配置。
- 删除消费组:当消费组不需要使用时,可以删除消费组,释放资源,详情请参考删除RocketMQ消费组。
更多相关操作:
- 消费消息:消费者登录客户端连接RocketMQ实例,消费主题中的消息,详情请参考使用客户端连接RocketMQ(关闭SSL)或使用客户端连接RocketMQ(开启SSL)。
- 为用户赋予不同的消费组权限:当您需要创建多个用户并为其赋予不同的消费组权限,以达到用户之间的权限隔离时,可以开启ACL访问控制并配置用户,详情请参考开启RocketMQ ACL访问和配置RocketMQ ACL用户。
- 重置消费进度:当消费者希望重新消费或跳过消费部分消息时,可以通过重置消费位点来调整消费进度,详情请参考重置RocketMQ消费进度。