Kafka学习(7)- kafka使用Java开发-3-手动提交

目录:

  1. 为什么要手动提交
  2. 什么是手动提交 

一.为什么要手动提交

  1. 问题一:已经消费的数据对于kakfa来说,会将该消费组里面的offset值进行修改。什么时候去修改的?
    1. 当数据被消费者拿去之后就自动提交,而不关注消费者是否成功消费,如果消费者端出现故障,就会导致此条数据没有被消费,继续运行就会导致此数据丢失
    2. 如果消费者成功消费此数据,而在提交的过程的出现故障,会导致再次发送此数据到消费者,继续运行就会到此数据重复提交
    3. kafka没有提供一个绝对安全的方案,只提供了多种选择来供用户解决此类问题
  2. 问题二:比如消费者拿到数据之后,存入到mysql数据库中。但是mysql数据库这个时候,连接不上,抛出异常。但是在处理的时候已经进行提交了,那么kafka上的offset值已经修改了,可是mysql数据库中没有数据--数据丢失
    解决方案:
    可以将数据在处理完成之后,再进行提交,然后进行offset值的修改。默认情况下是自动提交,需要修改为手动提交。
    Kafka学习(7)- kafka使用Java开发-3-手动提交_第1张图片
  3. 问题三:如果在处理代码中正常处理了,但是在提交的offset请求时,没有连接到kafka或者出翔了故障,那么该次请求,是失败的。那么下次进行读取同一个分区的数据时,会从已经处理掉的offset值在进行处理一次,那么在hbase中就会产生两条一样的数据,也就是重复提交
    Kafka学习(7)- kafka使用Java开发-3-手动提交_第2张图片

二.什么是手动提交

如果消费者在获得数据后需要加入处理,数据处理完毕后才确认offset值的修改,怎么使用程序来控制offset的确认?很简单

  1. 关闭自动确认选项
    porps.put("enable.auto.commit","false");
    Kafka学习(7)- kafka使用Java开发-3-手动提交_第3张图片
  2. 消费者提交
    consumer.commitSync();
    Kafka学习(7)- kafka使用Java开发-3-手动提交_第4张图片

你可能感兴趣的:(kafka)