问题描述:
2个消费者,订阅了同一个TOPIC,设置不同的TAG,但是有一个消费者没有消费出数据;
问题原因:
后启动的消费者的TAG覆盖了前一个启动的消费者的TAG,因为在同一个组中
解决方案:
各个消费者分组
原理解析:
(1) 首先TAG的作用是在消费者中作过滤
(2) 在processCallBack方法中,判断消费者的tag的hash值,是否存在一个集合中;如果集合存在这个tag的hash值,则消费,否则不处理
(3) 消息存储在commitLog中,还有消息的索引信息存储在consumerQueue这个文件中,索引信息包括:Offset、长度、tag的hash值;
(4) 在消费者启动时,在RebalanceImpl类中有一个Map,这个Map记录K是Topic v是tag,这个类是consumer group区分 的
(5) 所以消费者组中的第二个消费者启动后,覆盖前一个消费者的 TAG记录;这样就导致如果一个组内的消费者的TAG不同的话,前一个消费者就不生效了就无法获取消息;
问:其他还有消费者过滤方式吗?
答:SQL Filter