Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 什么决定卡夫卡消费者补偿?_Java_Apache Kafka_Kafka Consumer Api_Distributed Computing - Fatal编程技术网

Java 什么决定卡夫卡消费者补偿?

Java 什么决定卡夫卡消费者补偿?,java,apache-kafka,kafka-consumer-api,distributed-computing,Java,Apache Kafka,Kafka Consumer Api,Distributed Computing,我对卡夫卡比较陌生。我已经用它做了一些实验,但是关于消费者补偿,有一些事情我还不清楚。根据我到目前为止的理解,当耗电元件启动时,它将开始读取的偏移量由配置设置auto.offset.reset(如果我错了,请纠正我) 现在假设主题中有10条消息(偏移量为0到9),一个消费者恰好在消息停止之前(或在我杀死消费者之前)消费了其中的5条消息。然后,假设我重新启动消费者流程。我的问题是: 如果auto.offset.reset设置为earlime,它是否总是从偏移量0开始消耗 如果auto.offse

我对卡夫卡比较陌生。我已经用它做了一些实验,但是关于消费者补偿,有一些事情我还不清楚。根据我到目前为止的理解,当耗电元件启动时,它将开始读取的偏移量由配置设置
auto.offset.reset
(如果我错了,请纠正我)

现在假设主题中有10条消息(偏移量为0到9),一个消费者恰好在消息停止之前(或在我杀死消费者之前)消费了其中的5条消息。然后,假设我重新启动消费者流程。我的问题是:

  • 如果
    auto.offset.reset
    设置为
    earlime
    ,它是否总是从偏移量0开始消耗

  • 如果
    auto.offset.reset
    设置为
    latest
    ,它将从偏移量5开始消耗吗

  • 这种情况下的行为总是确定性的吗


  • 如果我的问题中有什么不清楚的地方,请不要犹豫发表评论。

    这比你描述的要复杂一些。
    只有当您的消费者组在某个地方没有提交有效的偏移量时(现在支持的两个偏移量存储是Kafka和Zookeeper),才会生效,这还取决于您使用的消费者类型

    如果您使用高级java使用者,请想象以下场景:

  • 您的消费者组
    group1
    中有一名消费者已消费了5封邮件并死亡。下次启动此消费程序时,它甚至不会使用该
    auto.offset.reset
    config,并将从其停止的位置继续,因为它只会从偏移存储中获取存储的偏移量(如我所述的Kafka或ZK)

  • 您在一个主题中有消息(如您所述),并且您在一个新的消费者组
    group2
    中启动了一个消费者。任何地方都没有存储偏移量,这一次,
    auto.offset.reset
    config将决定是从主题的开头(
    最早的
    )还是从主题的结尾(
    最新的
    )开始

  • 影响偏移量值与
    最早
    最新
    配置相对应的另一个因素是日志保留策略。假设您有一个保留时间配置为1小时的主题。你发了5条信息,一小时后又发了5条。
    最新的
    偏移量仍将与前一示例中的相同,但
    最早的
    偏移量将不能是
    0
    ,因为卡夫卡将已经删除这些消息,因此最早的可用偏移量将是
    5

    上面提到的所有内容都与
    SimpleConsumer
    无关,每次运行它时,它都会决定从何处开始使用
    auto.offset.reset
    config


    如果您使用的卡夫卡版本早于0.9,则必须将
    最早的
    最新的
    替换为
    最小的
    最大的
    ,只是一个更新:从卡夫卡0.9和更高版本开始,卡夫卡正在使用新的Java版本的使用者,并且auto.offset.reset参数名称已更改;从手册中:

    如果卡夫卡中没有初始偏移或当前 服务器上不再存在偏移量(例如,因为该数据 已删除):

    最早的:自动将偏移重置为最早的偏移

    最新:自动将偏移重置为最新偏移

    none:如果未找到以前的偏移量,则向使用者抛出异常 针对消费者群体

    其他:向消费者抛出异常


    在检查了已接受的答案后,我花了一些时间找到了这个答案,因此我认为社区发布它可能会有用。

    此外还有offset.retention.minutes。如果自上次提交后的时间是>
    偏移量.保留时间.分钟
    ,那么
    自动偏移量.重置
    也会起作用

    非常感谢您的回答。对于高级消费者来说,一旦消费者做出了承诺(在ZK或Kafka中),那么
    auto.offset.reset
    此后就没有任何意义了?该设置的唯一意义在于没有任何承诺(理想情况下是在消费者首次启动时)?与您完全一样described@serejja您好-如果我总是每个组有一个消费者,并且您的答案中的场景1出现在我身上,那又如何?还是一样吗?@ha9u63ar不太明白你的问题。如果在同一组中重新启动消费者,则是,它将不会使用
    auto.offset.reset
    并从提交的偏移量继续。如果您总是使用不同的消费者组(如启动消费者时生成它),那么消费者将始终遵守
    auto.offset.reset
    @serejja yes,这对我不起作用。你能看一下吗?这是我的问题。这看起来与日志保留无关吗?设置保留是否应该基于日志保留?@mike01010是的。它应该以日志保留为基础,这是本文建议的解决方案之一
    将offset.retention.minutes的默认值延长到至少是log.retention.hours的两倍。
    这个答案让我害怕了一段时间,直到我检查了
    offset.retention.minutes
    :消费者组失去所有消费者后(即变为空)其偏移量将在此保留期内保留,然后丢弃。对于独立使用者(使用手动分配),偏移量将在上次提交时间加上此保留期后过期。(这是针对《卡夫卡2.3》)被接受的答案是用新名字写的-这个答案没有提供任何独特之处,是吗?(如果在写这篇文章的时候它没有90张赞成票,我建议删除它。)令人惊讶的是,很多人发现它很有用