我正在使用事务性KafkaProducer向主题发送消息。这很好用。我使用具有read_committed隔离级别的KafkaConsumer,我遇到了seek和seekToEnd方法的问题。根据文档,seek和seekToEnd方法给了我LSO(Last Stable Offset)。但这有点令人困惑。因为它给我总是相同的值,主题的结尾。无论最后一个条目是由提交者提交还是由中止事务的一部分提交。 例如,在我中止最后5次尝试插入20_000条消息后,消费者不应读取最后100_000条记录。但是在seekToEnd期间,它会移动到主题的末尾(包括100_000条消息)。但poll()不会返回它们。
我正在寻找一种方法来检索Last Committed Offset(生成器最后一次成功提交的消息)。似乎没有适当的API方法。所以我需要自己动手吗?
选项是返回并轮询直到不再检索到记录,这将导致最后提交的消息。但我认为卡夫卡提供了这种方法。
我们使用Kafka 1.0.0。
答案 0 :(得分:0)
班级KafkaConsumer
有一些不错的方法,例如:partitionFor
,begginingOffsets
和endOffsets
也commited
和position
。
检查哪一个符合您的需求。特别仔细考虑所有4种与偏移相关的方法。
方法partitionFor
返回包含其他信息的完整元数据对象,但对于丰富日志记录非常有用。
答案 1 :(得分:0)
要获取主题分区的最后提交的偏移量,可以使用KafkaConsumer.committed(TopicPartition partition)
函数。
TopicPartition topicPartition = new TopicPartition(record.topic(), record.partition());
Long committedOffset = consumer.committed(topicPartition).offset();
System.out.println("last committed offset: " + committedOffset);