如果我不想使用自动提交模式 - sping提供了另一种方法。
spring-kafkfa/#committing-offsets向我们提供有关提交抵消的以下信息:
RECORD
- 在侦听器处理后返回时提交偏移量 记录。
BATCH
- 在返回所有记录时提交偏移量 poll()已经处理完毕TIME
- 在所有的时候提交偏移量 poll()返回的记录已经处理完毕 自上次提交以来已经超过了ackTimeCOUNT
- 提交 处理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_IMMEDIATE
和MANUAL
请为我澄清这些问题。
P.S。
据我所知,Garry Russel回答foreach看起来像这样:
while(true){
data = consumer.poll();
data.foreach(record->new Thread(()->listener.listen(record)).start());
}
答案 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,我建议使用该版本。