at most once:最多消费一次,可能出现数据丢失
at least once:最小消费一次,可能出现数据重复消费
exactly once:只消费一次,保证数据不丢失,不重复消费
实现方案
生产者端 如何保证exactly once
1.每个分区只有一个消费者写入数据,当出现异常或宕机时,生产者只需要检查此分区的最后一个数据来判断是否重传还是继续发送
2.生产者为每个消息添加一个全局唯一主键,生产者不做任何操作,有消费者对消息进行去重操作,实现‘exactly once’
实现方案
消费者:
1.消费者关闭自动提交功能, auto.commit.enable=false,且不再进行手动提交offset。由消费者自己保持offset。利用事务的原子性来实现‘exactly once’
我们将offset和消息处理结果放在一个事务中,事务执行成功则认为此消费是被消费,否则事务回滚重新消费