通过在每次重启应用程序时创建新的使用者组来重置主题偏移

时间:2018-03-04 19:39:59

标签: apache-kafka spring-cloud-stream

我有一个Kafka主题和一个在Spring Cloud应用程序中分配了一个消费者组(必须)的消费者。作为一项要求,在每次应用程序重启时,我都需要从头开始阅读所有收到的消息。这应该由resetOffsets属性实现,但this issue显然它目前无法正常工作。

我发现kafka consumer api中使用了this workaround,建议在每次重启时为使用者组分配一个新的随机名称作为从最早开始阅读的方式。是否可以/推荐Spring Cloud Stream?如何为消费者组定义动态名称?

3 个答案:

答案 0 :(得分:1)

是的,它也适用于SCSt,但正如您所说,设置随机组ID有点棘手,尽管您可以在启动{{1}之前将其设置为System.property }。

如果您直接使用spring-kafka,这很简单,只需实施SpringApplication,分配时即可ConsumerSeekAware

但是,使用SCSt,您无法直接访问侦听器。

一种解决方法是在通过创建具有相同组ID的使用者启动seekToBeginning之前手动执行搜索。它有点棘手,但是如果您有多个应用实例,因为每次都可能获得不同的分区。

我们会再次考虑解决这个问题(我只是对此发表评论)。

答案 1 :(得分:1)

如果您需要每次从头开始重新启动应用程序,您有几个选项:

  1. 您可以使用earliest工具(kafka-consumer-groups.sh)重新启动应用程序之前将已提交的偏移重置为kafka.admin.ConsumerGroupCommand.scala

  2. 重新启动时,应用程序可以搜索到开头并手动提交偏移量0.如果auto.offset.reset设置为earliest,即使0不是有效偏移量,它也将从开头。

  3. 您每次都可以使用不同的消费者group.id值。在您的Consumer Configuration bean中,在Properties对象中插入如下内容:

    properties.put(ConsumerConfig.GROUP_ID_CONFIG, UUID.randomUUID().toString());
    
  4. 最后,您是否使用委员会抵消?如果没有,请停用enable.auto.commit,然后应用程序将始终遵循auto.offset.reset设置。

    选项1和2通常是首选,因为它们保持一致group.id,允许轻松地将消费者实例添加到组中并监控该组。

答案 2 :(得分:0)

spring-kafka中,如果您通过application.yaml之类的配置文件(而不是以编程方式)配置消费者,您可以使用SpEL获得它(spring 表达语言)在每次执行时提供基于 UUID 的消费者组+最早的偏移

# consume-all-configuration
auto-offset-reset: earliest
group: consumer-local-#{ T(java.util.UUID).randomUUID().toString() }
相关问题