1、至少一次:at-least-once 表示的是关闭offset自动提交功能,消费端在消费数据的时候很可能在commitAync之前,已经保存在数据库,但是这个时候服务器宕机了,从而导致offset不能提交成功。这个时候再次启动消费者的时候,还是会再次写入数据库,也就是至少一次会重复消费,至少不会丢数据。
2、至多一次:at-most-once 表示有可能是0次或者1次,可以选择开启自动提交offset的功能,然后把自动提交offset的时间设置一下,有可能消费者在消费的时间段内就到了自动提交的时间,从而导致了offset已经提交了,但是数据库保存还没进行。下一次再消费的时候就会认为offset已经成功了,直接丢弃消息。就会造成丢数据。
3、仅一次:exactly-once 表示数据仅被消费一次,还是开启自动开启offset提交的功能,可以开启consumer.seek()方法,相当于自己处理分区和offset,可以在此基础上开启事务,保持原子性,只有数据库保存成功再提交offset,保证两者同时成功。