Exactly Once 把服务器的ACK设置为-1,可以保证Producer到Server之间不会丢失数据,即At Least Once语义,至少发一次 服务器ACK设置为0,每条消息只会发一次,即At Most Once语每条消息最多发一次。、 kafka 0.11之前是有缺陷的的只能保证数据不丢失,至于从重复问题只能在下游去重。 0.11版本之后kafaka提供了幂等性,即Producer无论向Server发送多少次重复数据,Server端都只会持久化一条。 KAFA 的Exactly Once语义, At Least Once +幂等性=ExactLy Once 启用幂等性:要将Producer的参数中的enable.idompotence设置为true 开启幂等性的Producer在初始化的时候会被分配一个PID,发往同一个分区的Partition的消息会附带 Sequence Number。
而Broker端会对<PID,Partition,SequenceNumber>做缓存,当具有相同主键的消息提交时,Broker只会持久化一条。 但是当PID重新变化,同时不同的Partition也具有不同的主键,所以幂等性无法保跨分区会话的Exaclatly Once
只能解决单个会话单个分区的数据的幂等性。当生产者重启后PID变化幂等性就不会保证只有一条