RocketMQ入门到入土(七 )为什么同一个消费组设置不同tag会出现奇怪现象

本文探讨了在RocketMQ中,同一消费组内的两个Consumer订阅不同tag时出现的消息消费异常现象。当两个Consumer分别订阅Topic的不同tag并启动时,只有订阅tag2的Consumer收到部分消息。问题的关键在于Broker的消费者管理机制,同组内最后一个启动的Consumer会覆盖先前的订阅信息,导致订阅tag1的Consumer收不到消息。源码分析揭示了Consumer心跳注册过程中的覆盖逻辑以及如何避免这种问题。
摘要由CSDN通过智能技术生成

RocketMQ入门到入土(七 )为什么同一个消费组设置不同tag会出现奇怪现象

一、问题复现

1、描述

两个一样的Consumer Group的Consumer订阅同一个Topic,但是是不同的tag,Consumer1订阅Topic的tag1,Consumer2订阅Topic的tag2,然后分别启动。这时候往Topic的tag1里发送10条数据,Topic的tag2里发送10条。目测应该是Consumer1和Consumer2分别收到对应的10条消息。结果却是只有Consumer2收到了消息,而且只收到了4-6条消息,不固定。

2、代码

2.1、Consumer
public class Consumer {
public static void main(String[] args) throws MQClientException {
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer(“test-consumer”);
consumer.setNamesrvAddr(“124.57.180.156:9876”);
consumer.subscribe(“TopicTest2”,“tag1”);
consumer.registerMessageListener(new MessageListenerConcurrently() {
public ConsumeConcurrentlyStatus consumeMessage(
List msgs, ConsumeConcurrentlyContext context) {
MessageExt msg = msgs.get(0);
System.out.println(msg.getTags());
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
}
});
consumer.start();
System.out.println(“ConsumerStarted.”);
}
}

启动这个订阅了TopicTest2的tag1标签的Consumer,然后将tag1改为tag2再次启动Consumer。这就相当于启动了两个Consumer进程,一个订阅了TopicTest2的tag1标签,另一个订阅了TopicTest2的tag2标签。

2.2、Producer
public class Producer {
public static void main(String[] args) throws MQClientException {
final DefaultMQProducer producer = new DefaultMQProducer(“test-producer”);
producer.setNamesrvAddr(“124.57.180.156:9876”);
producer.start();

    for (int i = 0; i < 10; i++){
        try {
            Message msg = new Message("TopicTest2", "tag1", ("Hello tag1 - "+i).getBytes());
            SendResult sendResult = producer.send(msg);
            System.out.println(sendResult);
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值