【发布时间】:2019-07-03 08:10:47
【问题描述】:
当我们有多个消费者从单个分区的主题中读取时,是否有可能所有消费者都将获得所有消息。 我已经使用手动偏移量提交创建了两个消费者。启动了第一个消费者并在 2 分钟后启动了第二个消费者。第二个消费者正在阅读第一个消费者停止阅读的消息。第二个消费者是否有可能从头开始阅读所有消息。我是kafka的新手,请帮帮我。
【问题讨论】:
标签: apache-kafka kafka-consumer-api
当我们有多个消费者从单个分区的主题中读取时,是否有可能所有消费者都将获得所有消息。 我已经使用手动偏移量提交创建了两个消费者。启动了第一个消费者并在 2 分钟后启动了第二个消费者。第二个消费者正在阅读第一个消费者停止阅读的消息。第二个消费者是否有可能从头开始阅读所有消息。我是kafka的新手,请帮帮我。
【问题讨论】:
标签: apache-kafka kafka-consumer-api
在您的消费者中,您将使用 commitSync 提交上次轮询返回的偏移量。现在,当您启动第二个消费者时,由于它在同一个消费者组中,它将从上次提交的偏移量中读取消息。
您的消费者将消费的消息取决于它所属的 ConsumerGroup。假设您在单个 Consumer Group 中有 2 个分区和 2 个消费者,那么每个消费者将从不同的分区中读取,这有助于实现并行性。
因此,如果您希望您的第二个消费者从头开始阅读,您可以做以下两件事之一:
a) 尝试将第二个消费者放在不同的消费者组中。对于这个消费者组,任何地方都不会存储任何偏移量。此时,auto.offset.reset config 将决定起始偏移量。将auto.offset.reset设置为earliest(将偏移重置为最早的偏移)或latest(将偏移重置为最新的偏移)。
b) 使用 consumer.seekToBeginning(consumer.assignment()) 查找分配给您的消费者的所有分区的开始
【讨论】:
分区总是分配给单个消费者组中的唯一消费者,而不考虑多个消费者。这意味着只有消费者可以读取数据,其他人在分区分配给他们之前不会消费数据。当消费者宕机时,会发生分区重新平衡并将其分配给另一个消费者。由于您正在执行手动提交,因此新消费者将从已提交的偏移量开始读取。
【讨论】: