1.自动提交:
1.属性enable.auto.commit -> true
2.属性auto.commit.interval.ms ->5000 默认提交时间间隔为5s
3.消费者会自动将poll()方法接收到的消息的最大偏移量提交上去
2.手动提交偏移量(分为两种)
1.同步的提交
2.异步的提交
3.属性enable.auto.commit -> false
3.同步方式提交偏移量
1.使用commitSync()提交偏移量
2.会返回由poll()方法返回的消息的最大偏移量。
3.在处理玩逻辑后要确保执行commitSync()。
4.若发生消费者再均衡,
从上次提交的偏移量后的部分数据会被重复处理。
5.例子:
4.异步方式提交偏移量
1.同步方式提交缺点:在broker对提交请求做出回应之前,应用程序会一直阻塞,
会限制Kafka的吞吐量。
2.这时用异步提交commitAsync();
3.无需等待broker响应完,应用继续跑。
4.commitAsync()支持回调函数,用来记录提交错误等
5.无回调和有回调的例子:
5.同步和异步组合提交:
1,例子:
6.提交特定的偏移量:
1.commitSync()和commitAsync()都支持提交一个Map,
Map<分区,偏移量>
2.不过可能读取很多分区,会使代码变复杂。
3.例子:
7.再均衡监听器:
1.消费者在退出或进行分区再均衡之前,会做一些工作
2.比如会在消费者失去对一个分区的所有权前提交最后一个已处理消息的偏移量。
3.就不会有丢失或重复消息。
4.具体API和例子:
8.exactly once 提交偏移量:
1.原理:将消息和偏移量通过食物存进数据库中,
再用seek()方法查找保存在数据库中的偏移量
2.这样就可以保证消息有且只有一次被处理。
3.例子: