什么决定卡夫卡消费者的抵消?

Asi*_*bal 151 java distributed-computing apache-kafka

我对卡夫卡比较新.我已经做了一些实验,但有一些事情我不清楚消费者抵消.从我到目前为止所理解的情况来看,当消费者开始时,它将开始读取的偏移量由配置设置决定auto.offset.reset(如果我错了,请纠正我).

现在说,例如主题中有10条消息(偏移0到9),并且消费者在它关闭之前(或者在我杀死消费者之前)恰好消耗了其中的5条消息.然后说我重启那个消费者流程.我的问题是:

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

  2. 如果auto.offset.reset设置为largest,是否将从偏移量5开始消耗?

  3. 关于这种情况的行为总是确定的吗?

如果我的问题中的任何内容不清楚,请不要犹豫.提前致谢.

ser*_*jja 234

它比你描述的要复杂一点.在auto.offset.reset只有当您的消费群没有一个有效的抵消致力于某处配置踢(2支持偏移存储器现在卡夫卡和动物园管理员).它还取决于您使用的消费者类型.

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

  1. 您的消费者群体中的消费者group1已经消耗了5条消息并且已经死亡.下次启动此消费者时,它甚至不会使用该auto.offset.reset配置,并将从它死亡的地方继续,因为它只会从偏移存储(Kafka或ZK,如我所提到的)获取存储的偏移量.

  2. 您在主题中有消息(如您​​所述),并在新的消费者组中启动消费者group2.在任何地方都没有存储偏移量,这次auto.offset.reset配置将决定是从topic(smallest)的开头还是从主题的结尾开始(largest)

影响什么偏移值将对应smallestlargest配置的另一件事是日志保留策略.想象一下,您的主题保留配置为1小时.您生成5条消息,然后一小时后再发布5条消息.该largest偏移将仍然相同,前面的例子,但smallest一个不能是0因为卡夫卡都已经删除这些信息,从而可用最小的偏移会5.

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

  • 非常感谢你的回答.对于高级消费者来说,一旦消费者承诺了某些东西(无论是在ZK还是Kafka),`auto.offset.reset`之后没有任何意义?该设置的唯一意义是什么时候没有任何承诺(理想情况下,这将是消费者的第一次启动)? (3认同)
  • 正是您所描述的 (2认同)
  • @ha9u63ar 不太明白你的问题。如果您在同一组中重新启动消费者,那么是的,它不会使用“auto.offset.reset”并从提交的偏移量继续。如果您始终使用不同的消费者组(例如在启动消费者时生成它),那么消费者将始终遵循“auto.offset.reset” (2认同)
  • _“仅当您的消费者组没有有效的偏移量时,auto.offset.reset 配置才会生效”..._ 该声明是对的,错误的位是“仅”。如果消费者没有使用消费者组,但调用了消费者的“assign()”方法并指定了无效的偏移量,则偏移量重置也可以启动。 (2认同)

Isr*_*inc 78

只是一个更新:从Kafka 0.9开始,Kafka正在使用消费者的新Java版本,并且auto.offset.reset参数名称已更改; 从手册:

当Kafka中没有初始偏移量或者服务器上不再存在当前偏移量时(例如因为该数据已被删除)该怎么办:

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

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

none:如果没有找到消费者组的先前偏移量,则向消费者抛出异常

其他:向消费者抛出异常.

在检查接受的答案后我花了一些时间才找到这个,所以我认为社区发布它可能是有用的.

  • 接受的答案是用新名称写的 - 这个答案没有提供任何独特之处,不是吗?(如果在撰写本文时没有获得 90 票赞成,我建议将其删除;)) (2认同)

Sas*_*vic 8

更进一步的是o​​ffsets.retention.minutes。如果自上次提交以来的时间为> offsets.retention.minutes,则auto.offset.reset也开始执行

  • 这对于日志保留来说似乎是多余的吗?抵消保留应该基于日志保留吗? (2认同)
  • 这个答案让我害怕了一段时间,直到我检查了“offsets.retention.mines”的[文档](http://kafka.apache.org/documentation.html#brokerconfigs):<b>在消费者组失去所有之后它的消费者(即变空)其偏移量将在被丢弃之前保留此保留期。</b>对于独立消费者(使用手动分配),偏移量将在上次提交时间加上此保留期后过期。(这是针对“Kafka 2.3”) (2认同)