Java:当我开始阅读卡夫卡主题时,如何从当前偏移量读取

Java:当我开始阅读卡夫卡主题时,如何从当前偏移量读取,java,apache-kafka,Java,Apache Kafka,我正在使用JavaAPI消费者连接器。每当消费者开始阅读某个主题时,他们都会从该主题的开头开始阅读,并且需要相当长的时间才能跟上最新的事件。如何确保消费者读取当前偏移量?对于卡夫卡9: 如果为消费者设置组id,kafka将为您存储提交(处理)的偏移量。如果您在卡夫卡中使用新的消费者,则此功能有效 如果始终希望从最新偏移量读取,可以指定OffsetResetStrategy.latest 对于卡夫卡9: 如果为消费者设置组id,kafka将为您存储提交(处理)的偏移量。如果您在卡夫卡中使用新的消

我正在使用JavaAPI消费者连接器。每当消费者开始阅读某个主题时,他们都会从该主题的开头开始阅读,并且需要相当长的时间才能跟上最新的事件。如何确保消费者读取当前偏移量?

对于卡夫卡9:

  • 如果为消费者设置组id,kafka将为您存储提交(处理)的偏移量。如果您在卡夫卡中使用新的消费者,则此功能有效
  • 如果始终希望从最新偏移量读取,可以指定OffsetResetStrategy.latest
  • 对于卡夫卡9:

  • 如果为消费者设置组id,kafka将为您存储提交(处理)的偏移量。如果您在卡夫卡中使用新的消费者,则此功能有效
  • 如果始终希望从最新偏移量读取,可以指定OffsetResetStrategy.latest

  • 为了完成Natalia的回答,我想说的是,您可能不关心存储偏移量,您只想始终使用最新的消息

    要使用大多数消费者实现实现这种行为(包括0.8.x中的“旧”消费者和0.9.x及以上版本中的“新”消费者),您需要做两件事:

  • 将组ID设置为随机值,这样每次消费者启动时都无法从任何位置恢复偏移,这将触发“偏移重置”请求
  • OffsetRequestStrategy
    (或您使用的客户端中的任何调用)设置为
    latest
    ,以便当您的客户端请求Kafka提供可用的偏移量时,它会获取日志中最后一条(最新)消息的偏移量

  • 为了完成Natalia的回答,我想说的是,您可能不关心存储偏移量,您只想始终使用最新的消息

    要使用大多数消费者实现实现这种行为(包括0.8.x中的“旧”消费者和0.9.x及以上版本中的“新”消费者),您需要做两件事:

  • 将组ID设置为随机值,这样每次消费者启动时都无法从任何位置恢复偏移,这将触发“偏移重置”请求
  • OffsetRequestStrategy
    (或您使用的客户端中的任何调用)设置为
    latest
    ,以便当您的客户端请求Kafka提供可用的偏移量时,它会获取日志中最后一条(最新)消息的偏移量

  • 最简单的方法是在用户配置中禁用自动提交(即,
    auto.commit.enable=false
    ),并使用
    auto.offset.reset=latest
    (或
    =maximust
    ,对于较旧的卡夫卡版本)

    卡夫卡的流程如下:

  • 启动消费者
  • 消费者查找有效的已提交的抵销
    • 如果找到,它将从那里恢复处理
    • 如果未找到,则根据“自动偏移重置”开始处理
  • 因此,只要您的消费群体有一个有效的提交的偏移量,“auto.offset.reset”就没有任何效果。因此,您也不应该手动提交

    如果已经有一个提交的偏移量,您需要在重新启动使用者之前手动删除它,以便从当前偏移量读取数据,而不是处理旧数据。(或者使用新的
    group.id
    ,您知道该组没有提交的偏移量。)


    作为所有这些的替代方案,您还可以在使用者中“寻求结束”每个分区。但这会使您的代码更加复杂,如果您的消费群体根本没有提交,则可以避免。

    最简单的方法是在您的消费配置中禁用自动提交(即,
    auto.commit.enable=false
    ),并使用
    auto.offset.reset=latest
    (或
    =maxist
    ,对于较旧的卡夫卡版本)

    卡夫卡的流程如下:

  • 启动消费者
  • 消费者查找有效的已提交的抵销
    • 如果找到,它将从那里恢复处理
    • 如果未找到,则根据“自动偏移重置”开始处理
  • 因此,只要您的消费群体有一个有效的提交的偏移量,“auto.offset.reset”就没有任何效果。因此,您也不应该手动提交

    如果已经有一个提交的偏移量,您需要在重新启动使用者之前手动删除它,以便从当前偏移量读取数据,而不是处理旧数据。(或者使用新的
    group.id
    ,您知道该组没有提交的偏移量。)

    作为所有这些的替代方案,您还可以在使用者中“寻求结束”每个分区。但这会使您的代码更加复杂,如果您的消费群体根本没有提交,则可以避免这种情况。

    对于kafka 0.10(或更早版本),您可以这样做:

    properties.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, false);
    consumer = new KafkaConsumer<>(properties);
    consumer.seekToEnd(Collections.emptySet());
    
    properties.put(ConsumerConfig.ENABLE\u AUTO\u COMMIT\u CONFIG,false);
    消费者=新卡夫卡消费者(房产);
    consumer.seekToEnd(Collections.emptySet());
    
    这将关闭在代理上存储使用者偏移量(因为您没有使用它),并查找所有分区的最新位置。

    对于kafka 0.10(可能更早),您可以执行以下操作:

    properties.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, false);
    consumer = new KafkaConsumer<>(properties);
    consumer.seekToEnd(Collections.emptySet());
    
    properties.put(ConsumerConfig.ENABLE\u AUTO\u COMMIT\u CONFIG,false);
    消费者=新卡夫卡消费者(房产);
    consumer.seekToEnd(Collections.emptySet());
    

    这将关闭在代理上存储使用者偏移量(因为您没有使用它),并查找所有分区的最新位置。

    OffsetResetStrategy将被忽略,如果您已存储偏移量alreadyOffsetResetStrategy,如果您已存储偏移量ALReady,则将忽略OffsetResetStrategy如果OP对存储偏移量不感兴趣,使用
    KafkaConsumer.assign()
    而不是
    subscribe()
    ,然后只使用
    seekToEnd()
    ,这不是更好吗?也许这样他就需要分配分区了himself@serejja是的,我尝试将组id设置为新名称和(auto.offset.reset=max)。成功了。但我有一些现有的消费者,我希望他们都有相同的组id。我们不能解决我们拥有相同组id的问题吗?如果OP不感兴趣