Spring-kafka偏移提交方式

时间:2017-10-16 09:59:47

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

如果我不想使用自动提交模式 - sping提供了另一种方法。

spring-kafkfa/#committing-offsets向我们提供有关提交抵消的以下信息:

  

RECORD - 在侦听器处理后返回时提交偏移量   记录。
  BATCH - 在返回所有记录时提交偏移量   poll()已经处理完毕   TIME - 在所有的时候提交偏移量   poll()返回的记录已经处理完毕   自上次提交以来已经超过了ackTime   COUNT - 提交   处理poll()返回的所有记录时的偏移量   只要自上次提交以来收到了ackCount记录   COUNT_TIME - 类似于TIME和COUNT但如果执行提交   条件是真的。
  MANUAL - 消息监听器负责   承认()致谢;之后,相同的语义   应用BATCH。
  MANUAL_IMMEDIATE - 立即提交偏移量   当Acknowledgment.acknowledge()方法被调用时   监听器。

我有几个问题:

TIME 据我所知,在spring框架中的某个地方存在循环,它循环

while(true){
   data = consumer.poll();
   data.foreach(record->listener.listen(record))
}

民意调查多久发生一次?

时间是提交偏移的唯一标准吗? 让我们说poll返回了100条记录,当ackTime到期时 - 只处理了60条记录?

我没有注意到MANUAL_IMMEDIATEMANUAL

之间的区别

请为我澄清这些问题。

P.S。

据我所知,Garry Russel回答foreach看起来像这样:

while(true){
   data = consumer.poll();
   data.foreach(record->new Thread(()->listener.listen(record)).start());
}

1 个答案:

答案 0 :(得分:0)

这取决于版本;最近的1.3版本有一个更简单的线程模型,由KIP-62促进。

使用该版本,在调用者线程上调用侦听器;在消耗所有当前记录之前,下一次轮询不会发生。除RECORD(和MANUAL*)之外,在将所有记录发送给侦听器后确定提交决定。

MANUAL_IMMEDIATE就是这样;当用户确认时,立即提交偏移量;使用MANUAL,在将所有记录发送给侦听器后提交手动偏移。

早期版本有点复杂;可以提取一个或两个额外的批次,并在每次轮询之前执行确认,这样可以在第一批中的所有记录都发送给监听器之前提交偏移。

修改

在下面回答你的意见......

是;线程在1.3中发生了变化。在此之前,我们必须继续轮询消费者以避免代理重新平衡分区。当< = 1.2时,ConsumerRecords通过深度为1的队列传递给侦听器线程。轮询器继续轮询直到它不再适合队列中的ConsumerRecords;那时,消费者pause(以便随后的民意调查没有返回任何记录),但我们仍然必须继续调用poll以避免重新平衡。当听众赶上时,消费者是resume d并且消息再次开始流动。

因此,最糟糕的情况是容器包含3组记录 - 当前正由侦听器处理的记录,队列中的记录和我们无法放入队列的记录。在每次轮询之前执行任何未完成的偏移提交(手动或其他)。

  

将轮询线程等待处理器线程吗?

没有;我们无法做到这一点,因为这会导致重新平衡 - 就像我们在消费者线程上调用监听器一样。

KIP-62实际上已在0.10.1.0客户端中修复,但我们没有将线程更改为1.3;这是一个重大的简化,感谢KIP-62,我建议使用该版本。