我有一个用例,我希望消费者始终从最新的偏移开始。我不需要为这个消费者提供抵消。使用spring-kafka无法实现这一点,因为新的使用者组总是提交新分配的分区。然后,在程序的后续启动时,消费者从该存储的偏移中读取,而不是从最新的偏移中读取。换句话说,只有第一次使用新的消费者群体才能正确行事,即从最新消费群体中消费。问题出在KafkaMessageListenerContainer$ListenerConsumer.onPartitionsAssigned()
作为参考,我在spring boot
中设置了以下内容spring.kafka.listener.ack-mode=manual
spring.kafka.consumer.auto-offset-reset=latest
spring.kafka.consumer.enable-auto-commit=false
答案 0 :(得分:1)
当一个新的消费者群体开始消费时,当重新分配时,添加了该代码以解决一些讨厌的竞争条件;它可能会导致丢失或重复的记录,具体取决于配置。
最好提交初始偏移以避免这些情况。
我同意,如果用户完全负责抵消(使用MANUAL ackmode),那么我们可能不应该这样做;这取决于用户代码来处理竞赛(在您的情况下,您不关心丢失的记录)。
随意打开GitHub问题(欢迎提供)。
与此同时,您可以通过让侦听器实现ConsumerSeekAware
并在分配期间寻找主题/分区来避免这种情况。
另一种方法是每次为group.id使用UUID;你将始终从主题结束开始。