同组Consumer订阅关系一致 RocketMQ里的一个Consumer Group代表一个Consumer群组。对于大多数分布式应用来说,一个Consumer Group下通常会有多个Consumer实例。订阅关系一致指的是同一个Consumer Group下所有Consumer实例的处理逻辑必须完全一致,一旦订阅关系不一致,消息消费的逻辑就会混乱,甚至导致消息丢失。 背景信息 RocketMQ 中一个消费者代表一个Consumer实例群组。在大多数场景中,一个消费者组下面包含多个Consumer实例。 由于分布式消息服务RocketMQ的订阅关系主要由Topic+Tag共同组成,因此,保持订阅关系一致意味着同一个消费者Group ID下所有的Consumer实例订阅关系的一致性大概包括下面几个方面: 同一个消费组订阅的Topic必须一致,例如:在同一个消费组下,ConsumerA订阅Topic1和Topic2,ConsumerB也必须订阅Topic1和Topic2,只订阅Topic1、只订阅Topic2或订阅Topic2和Topic3都是不允许的。 同一个消费者订阅的同一个Topic的场景下Tag必须一致,包括Tag的数量和顺序,例如:ConsumerA订阅Topic1的Tag配置为Tag1Tag2,ConsumerB订阅Topic1的Tag也必须是Tag1Tag2,只订阅Tag1、只订阅Tag2或者订阅Tag2Tag1都是不允许的。 多个不同的Topic可以被多个消费组订阅,但是同一个消费组下的多个Consumer实例订阅Topic和Tag都必须一致。 代码示例 订阅一个Topic、一个Tag 同一个消费组下面的全部消费者实例均订阅一个Topic,且均配置同一个Tag这种是符合订阅关系一致性原则的。 consumer.setConsumerGroup("group1"); consumer.subscribe(topic,"Tag1"); consumer.registerMessageListener((MessageListenerConcurrently)(msgs, context)>{ // do something } 订阅一个Topic多个Tag 每个消费者订阅消息的代码必须一致 consumer.setConsumerGroup("group1"); consumer.subscribe(topic,"Tag1Tag2"); consumer.registerMessageListener((MessageListenerConcurrently)(msgs, context)>{ // do something } 订阅多个Topic且订阅多个Tag consumer.setConsumerGroup("group1"); consumer.subscribe(topic1,"Tag1"); consumer.subscribe(topic2,"Tag1|Tag2"); consumer.subscribe(topic3,""); consumer.registerMessageListener((MessageListenerConcurrently)(msgs, context)>{ // do something }