Java:当我开始阅读卡夫卡主题时,如何从当前偏移量读取
我正在使用JavaAPI消费者连接器。每当消费者开始阅读某个主题时,他们都会从该主题的开头开始阅读,并且需要相当长的时间才能跟上最新的事件。如何确保消费者读取当前偏移量?对于卡夫卡9:Java:当我开始阅读卡夫卡主题时,如何从当前偏移量读取,java,apache-kafka,Java,Apache Kafka,我正在使用JavaAPI消费者连接器。每当消费者开始阅读某个主题时,他们都会从该主题的开头开始阅读,并且需要相当长的时间才能跟上最新的事件。如何确保消费者读取当前偏移量?对于卡夫卡9: 如果为消费者设置组id,kafka将为您存储提交(处理)的偏移量。如果您在卡夫卡中使用新的消费者,则此功能有效 如果始终希望从最新偏移量读取,可以指定OffsetResetStrategy.latest 对于卡夫卡9: 如果为消费者设置组id,kafka将为您存储提交(处理)的偏移量。如果您在卡夫卡中使用新的消
为了完成Natalia的回答,我想说的是,您可能不关心存储偏移量,您只想始终使用最新的消息 要使用大多数消费者实现实现这种行为(包括0.8.x中的“旧”消费者和0.9.x及以上版本中的“新”消费者),您需要做两件事:
OffsetRequestStrategy
(或您使用的客户端中的任何调用)设置为latest
,以便当您的客户端请求Kafka提供可用的偏移量时,它会获取日志中最后一条(最新)消息的偏移量为了完成Natalia的回答,我想说的是,您可能不关心存储偏移量,您只想始终使用最新的消息 要使用大多数消费者实现实现这种行为(包括0.8.x中的“旧”消费者和0.9.x及以上版本中的“新”消费者),您需要做两件事:
OffsetRequestStrategy
(或您使用的客户端中的任何调用)设置为latest
,以便当您的客户端请求Kafka提供可用的偏移量时,它会获取日志中最后一条(最新)消息的偏移量最简单的方法是在用户配置中禁用自动提交(即,
auto.commit.enable=false
),并使用auto.offset.reset=latest
(或=maximust
,对于较旧的卡夫卡版本)
卡夫卡的流程如下:
- 如果找到,它将从那里恢复处理
- 如果未找到,则根据“自动偏移重置”开始处理
group.id
,您知道该组没有提交的偏移量。)
作为所有这些的替代方案,您还可以在使用者中“寻求结束”每个分区。但这会使您的代码更加复杂,如果您的消费群体根本没有提交,则可以避免。最简单的方法是在您的消费配置中禁用自动提交(即,
auto.commit.enable=false
),并使用auto.offset.reset=latest
(或=maxist
,对于较旧的卡夫卡版本)
卡夫卡的流程如下:
- 如果找到,它将从那里恢复处理
- 如果未找到,则根据“自动偏移重置”开始处理
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不感兴趣