rocketmq:订阅组和消费组的关系。

之前在没看过源码之前对于 订阅组和消费组没有一个清楚的认知。

今天就来分析下两者的关系。

订阅组:订阅组的创建是依赖于消费组的创建。从订阅组的创建运维命令可以发现。有3个参数是必填(cluster和broker选填一个,最佳实践肯定是选择把cluster给填了), -n和-c或者-b肯定不用说的,nameserver地址和cluster名称或者broker地址肯定是要填上的,因为在cluster填上的情况下,我们必须借助namerserver去找到对应的cluster下面的所有broker地址才能发送请求给所有的broker去创建对应的订阅组。 接下来就要讲另外一个很关键的参数-g了-----订阅组名。 这个订阅组名设置为必输入选项。那么这个订阅组名要输入什么呢。 答案就是消费组的名字。所以说订阅组的创建是依赖于消费组创建的从这个运维命令行都能够得到答案。

那么究竟订阅组和消费组到底有什么关系呢。且听下面分析。

先来看一看broker的配置参数autoCreateSubscriptionGroup,这个参数是控制是否自动创建订阅组的,默认情况下是开启的。

 

那么这个参数是在什么地方用的呢?在方法findSubscriptionGroupConfig里用到,那么我们就需要研究下这个方法。

1.首先这个方法是在broker端的。

2.其次这个方法主要是用在处理消费者拉取消息时会用到,client(生产者,消费者的载体)发送心跳会用到,消息消费失败的重试consumerSendMsgBack这三个地方。

那么上述所讲的三地方,如果没开启autoCreateSubscriptionGroup且没有在对应的broker集群(cluster)通过命令行创建对应的订阅组(以消费组的么名称命名),那么将会导致消费组不能消费在这个broker集群里面创建的topic的相关信息。会被拦截掉。

这边直接返回 而不会走下面的逻辑,这个代码段在处理消费者拉取消息时和消息消费失败的重试consumerSendMsgBack都是在方法体的前面校验部分,校验不通过直接返回。

 

那么现在应该能清晰的指导订阅组和消费组的关系了。如果某个broker集群没开启autoCreateSubscriptionGroup,某个消费组刚好想消费这个集群上的某个topic信息,那么将会致使无法消费。需要显示通过运维命令行创建对应的消费组的订阅组。

之前在起初学习rocketmq的时候,看到网上有些博客写到autoCreateSubscriptionGroup开启将会导致负载均衡失败,这个应该是有问题的。所以在学习编程的道路上还是应该要知之为知之,将疑惑从源码上解决。 会造成负载均衡失败的应该是设置了自动创建topic为true的情况 详见我上篇博客rocketmq 自动创建topic的过程分析。

 

再强调下!!!不会影响负载均衡(autoCreateSubscriptionGroup默认为true的情况)

RocketMQ中,主题(topic)消费(consumer group)存在明显区别,也有一定联系。 ### 区别 - **定义与作用**:主题是用于定义消息的逻辑分类,生产者将消息发送到特定的主题,其作用是让消息的分类、过滤路由更简单灵活。而消费是一具有相同消费逻辑的消费者的集合,引入消费主要是为了实现负载均衡、故障转移顺序消费 [^3]。 - **消息处理方式**:一个主题可以有多个生产者向其发送消息,也能有多个消费订阅该主题。而消费内的消费者共享相同的消费队列,但每个消费者只消费其中一部分消息。比如一个包含三个消费者的消费,发送到对应主题的消息会被分发到这三个消费者上 [^3]。 - **消费进度状态**:不同的消费可以独立消费相同的主题,且每个消费都有自己的消费进度状态 [^3]。 ### 联系 - **消息传递关联**:生产者将消息发送到主题,消费中的消费订阅该主题以接收消息,主题是消息的来源,消费是消息的接收方,二者共同完成消息的生产 - 消费流程 [^3]。 - **消费模式关联**:消费消费模式(集群消费广播消费)决定了消费消费者对主题中消息的消费方式。在集群消费模式下,主题中的消息只会被消费中的一个消费消费;在广播消费模式下,主题中的消息会被消费中的所有消费消费 [^1]。 ```python # 示例伪代码,展示主题消费关系 # 定义主题 topic = "example_topic" # 定义消费 consumer_group = "example_consumer_group" # 生产者向主题发送消息 def producer_send_message(topic, message): # 模拟发送消息到主题 print(f"Message '{message}' sent to topic '{topic}'") # 消费订阅主题并消费消息 def consumer_group_consume(topic, consumer_group): # 模拟消费订阅主题 print(f"Consumer group '{consumer_group}' subscribed to topic '{topic}'") # 模拟消费消息 print(f"Consumer group '{consumer_group}' is consuming messages from topic '{topic}'") # 发送消息 producer_send_message(topic, "Hello, RocketMQ!") # 消费消息 consumer_group_consume(topic, consumer_group) ```
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值