【问题标题】:Does consumer consume from replica partitions if multiple consumers running under same consumer group?如果多个消费者在同一个消费者组下运行,消费者是否从副本分区消费?
【发布时间】:2019-06-10 07:49:37
【问题描述】:
我正在编写一个 kafka 消费者应用程序。我有一个有 4 个分区的主题 - 1 个是领导者,3 个是追随者。 Producer 使用 key 来标识一个 partition 来推送消息。
如果我编写一个消费者并在不同的节点上运行它或启动同一个消费者的 4 个实例,消息消费将如何发生?所有 4 个实例都会收到相同的消息吗?
- 如果多个消费者(同一组)消费一个主题会发生什么情况?
- 他们获得相同的数据吗?
- 如何管理偏移量?是否针对每个消费者分开?
【问题讨论】:
标签:
apache-kafka
kafka-consumer-api
【解决方案1】:
如果多个消费者(同一组)消费一个主题会发生什么?
答案: 生产者根据此处记录的键将记录发送到特定分区。 Java 的默认分区器使用记录键的散列来选择分区。当同一个消费者组中有多个消费者时,每个消费者得到不同的分区。因此,在这种情况下,只有单个消费者接收所有消息。当接收消息的消费者宕机时,组协调器(集群中的代理之一)触发重新平衡,然后将该分区分配给可用消费者之一。
他们得到相同的数据吗?
答案: 如果消费者将消费的消息提交到分区并宕机,如上所述,就会发生重新平衡。获得此分区的消费者将不会收到消息。但是如果消费者在提交之前就宕机了,那么获得这个分区的消费者就会得到消息。
如何管理偏移量?每个消费者是分开的吗?
答案: 不,offset 不是针对每个消费者的。分区永远不会一次分配给同一消费者组中的多个消费者。默认情况下,分配分区的消费者也会获得偏移量。
【解决方案2】:
我建议您至少阅读 confluent 的 kafka 权威指南的前几章,以初步了解 kafka 的工作原理。
我的回答很简短。详细解释请参考本书。
如何管理偏移量?每个消费者是分开的吗?
取决于组 ID。一个组只管理一个偏移量。
如果多个消费者(同一组)消费一个主题会发生什么情况?
消费者可以是多个——都可以由相同或不同的组来识别。
如果 2 个消费者属于同一组,则两者都不会收到所有消息。
他们得到相同的数据吗?
不会。一旦发送消息并提交读取,该组的偏移量就会增加。因此,同一组的不同消费者将不会收到该消息。
希望有帮助:)