首先,先阐述下标题是什么意思
RocketMQ在相同的GroupId下,每一个消费者他们的订阅内容要保持一致,否则会导致消息无法被正常消费,即下面的关系,所有的Consumer要完全一样
GroupId — Topic + Tags
那么,我们也在源码的角度上分析下为什么需要保持一致
源码注释 GitHub https://github.com/beastmouth/rocketmq
branch:learning
着重看 RebalanceImpl 和 DefaultMessageStore
另外我还画了个源码方面的思维导图
最后的结论:
为什么同一个groupid下的consumer的topic订阅内容不能不同?
一个group下两个消费者,消费者a订阅了topica,消费者b订阅了topicb,然后在对topica做rebalance的时候,实际上ab都回去订阅里面的queue,然后消费者b没有对应的处理方法,导致出现了消息无法消费的情况
为什么同一个groupid下的consumer的tag订阅内容不能不同?
consumer注册的时候,会把他的信息提交给broker,然后broker的getMessage的时候,会有一个过滤器,然后过滤器会去看consumer的信息,然后把他关注的tag的消息给他。此时如果有新的不同tag的consumer进来,会覆盖掉原来老的tag信息,导致出现消息无法消费的情况
假如有写的有问题的地方,欢迎大佬们指出讨论~