Apache kafka 使Kafka消费者在订阅之前使用现有消息

Apache kafka 使Kafka消费者在订阅之前使用现有消息,apache-kafka,Apache Kafka,拥有Publisher和N个使用者,如果使用者使用auto.offset.reset=latest,则他们会错过订阅主题之前发布到主题的所有消息。。。已知的事实是,具有auto.offset.reset=latest的使用者在订阅主题之前不会重播主题中存在的消息 因此,我需要: 使发布服务器等待所有订阅服务器开始使用消息,然后开始发布。不知道如何在不使用Zookeeper的情况下做到这一点。卡夫卡提供了这样做的手段吗 另一种方法是让auto.offset.reset=latest使用者明确地使用

拥有Publisher和N个使用者,如果使用者使用
auto.offset.reset=latest
,则他们会错过订阅主题之前发布到主题的所有消息。。。已知的事实是,具有
auto.offset.reset=latest
的使用者在订阅主题之前不会重播主题中存在的消息

因此,我需要:

  • 使发布服务器等待所有订阅服务器开始使用消息,然后开始发布。不知道如何在不使用Zookeeper的情况下做到这一点。卡夫卡提供了这样做的手段吗
  • 另一种方法是让
    auto.offset.reset=latest
    使用者明确地使用所有现有消息,以防他们将要使用现有消息订阅主题
  • 这种情况下的最佳做法是什么


    我猜消费者必须检查主题中是否有现有消息,如果有,就使用它们,然后启动
    auto.offset.reset=latest
    consumption。对我来说,这似乎是最好的方法…

    如果高级消费者开始使用,它会执行以下操作:

  • 寻找其消费者群体的承诺补偿

    a。如果找到有效的偏移量,则从那里继续

    b。如果未找到有效的偏移,请根据
    auto.offset.reset

  • 因此,
    auto.offset.reset
    仅在未提交有效偏移量的情况下触发。此行为旨在且有必要在发生故障时提供至少一次处理保证


    因此,如果要从头开始阅读主题,可以使用新的使用者
    组.id
    并设置
    auto.offset.reset=earliest
    ,或者在启动
    seektobegining()
    循环之前,使用
    seektobegining()
    在启动时显式修改偏移量。

    如果启动高级使用者,它做了以下工作:

  • 寻找其消费者群体的承诺补偿

    a。如果找到有效的偏移量,则从那里继续

    b。如果未找到有效的偏移,请根据
    auto.offset.reset

  • 因此,
    auto.offset.reset
    仅在未提交有效偏移量的情况下触发。此行为旨在且有必要在发生故障时提供至少一次处理保证


    因此,如果您想从头开始阅读主题,您可以使用新的使用者
    组.id
    并设置
    auto.offset.reset=earliest
    ,或者在启动
    seektobegining()
    循环之前,使用
    seektobegining()
    显式修改启动时的偏移量。

    我们执行选项(1)使用Eureka提供的服务发现功能(任何其他服务发现应用程序都可以完成此工作)+别名。基本上,在至少有一个订阅者可用之前,发布者不会自行注册(并开始处理请求或发布通知)。

    我们使用Eureka提供的服务发现功能(任何其他服务发现应用程序都可以)执行选项(1)并使用别名。基本上,发布者在至少有一个订阅者可用之前不会注册自身(并开始处理请求或发布通知)。

    使用
    auto.offset.reset=earlime
    ?如果使用earlime,您需要记录或保存上次偏移,以便知道上次停止的位置,对吗?我刚刚意识到这两个选项都是完全错误的,唯一的方法是记住最后的偏移量…是的,你是对的。您只需要每次跟踪偏移。您是否介意告诉我们您的用例,例如您在哪里使用Kafka,以及您使用的是哪种处理引擎,如spark或storm?另外,无论是批处理还是流式处理?使用
    auto.offset.reset=earlime
    ,是否有任何危害?如果使用earlime,您需要记忆或保留上次偏移量,以便知道上次停止的位置,对吗?我刚刚意识到这两个选项都是完全错误的,唯一的方法是记住最后的偏移量…是的,你是对的。您只需要每次跟踪偏移。您是否介意告诉我们您的用例,例如您在哪里使用Kafka,以及您使用的是哪种处理引擎,如spark或storm?还有,是批量处理还是流式处理?