如何在Spring Kafka客户端中寻找偏移量?

时间:2020-02-12 09:22:47

标签: java apache-kafka kafka-consumer-api spring-kafka

在开发来自提要的微服务消耗数据时,我们使用ConsumerSeekAwareseekToBeginning。准备好后,我们希望消费者使用偏移量。由于文档的原因,我真的无法理解seekToEnd的含义。这是否意味着它会寻找偏移量(最后一个ACK消息)还是会寻找主题的最后一条消息(无论偏移量如何)并等待新消息?

@Slf4j
public class KafkaSeekOffsetAwareListener implements ConsumerSeekAware {
    protected final ThreadLocal<ConsumerSeekCallback> seekCallBack = new ThreadLocal<>();

    @Override
    public void registerSeekCallback(ConsumerSeekCallback callback) {
        log.info("Registering seek callback");
        this.seekCallBack.set(callback);
    }

    @Override
    public void onPartitionsAssigned(Map<TopicPartition, Long> assignments, ConsumerSeekCallback callback) {
        log.info("Incoming Topic Partitions {}", assignments);
---->   assignments.forEach((assignment, assignmentKey) -> assignments.forEach((t, o) -> callback.seekToBeginning(t.topic(), t.partition())));
    }

    public void onIdleContainer(Map<TopicPartition, Long> assignments, ConsumerSeekCallback callback) {
        log.info("Container idle");
    }
}

3 个答案:

答案 0 :(得分:1)

请参阅JavaDocs:

import asyncio

async def nested():
    return 42

async def main():
    # Nothing happens if we just call "nested()".
    # A coroutine object is created but not awaited,
    # so it *won't run at all*.
    nested()

    # Let's do it differently now and await it:
    print(await nested())  # will print "42".

asyncio.run(main())

如您所见,它是纯Apache Kafka客户端。用于Apache Kafka的Spring只不过是对该功能的委派。我什至会说说Apache Kafka的Spring是“ Kafka的客户端”是错误的。它只是围绕标准Apache Kafka客户端的包装器和高级Spring API。

答案 1 :(得分:0)

由于文档的原因,我真的无法理解seekToEnd的含义。这是否意味着它会寻找偏移量(最后一个ACK消息)还是会寻找主题的最后一条消息(无论偏移量如何)并等待新消息?

这些是同一回事。主题中的最后一个偏移量是最后确认的(假设生产者甚至启用了acks},并且寻找到结束确实将消费的“游标”移动到结尾,而不管偏移量

答案 2 :(得分:0)

seekToEnd就是这个意思;将此位置设置为分区的END,而不考虑此使用者的“当前”位置;下一个收到的记录将是执行查找后添加到分区的下一个记录。

在使用者停止时发布的任何记录都将被跳过。