精确一次语义(Exactly once semantics):要消息系统本身和生产、消费应用一起合作。如,成功消费后,又把消费offset重置到之前某个offset,将收到从那个到最新offset间所有消息。
一、必须被处理的故障
发“Hello Kafka“给“EoS“单分区Kafka topic。单实例消费者在另一端从topic中拉消息
broker可能故障:每写入分区都被持久化且多副本备份。只要有一个broker可用,分区就可用。写入主副本,就会被复制到其他可用副本(ISR)。
producer到broker的RPC调用可能失败:没收成功ack不代表本身失败。重发,可能造成同样的消息Kafka分区日志中重复,进而造成消费端多次收到。
客户端可能会故障:从失败状态中恢复,消费偏移量必须始终与生产同步
二、幂等的producer
创建producer客户端时,添加配置 props.put("enable.idempotence", ture),producer变成幂等,acks自动“all”,这时手动acks设置为0,会报错。
精确一次原理:每条消息生成id,broker根据id去重,
缺陷:1)只能单分区,2)只能单会话,如producer挂掉重启,无法保证两个会话间的幂等,因为broker端无法获取之前的状态信息
三、事务producer
解决幂等缺陷。支持多分区数据完整性,原子性。producer宕机重启,保证数据只处理一次。
先开启幂等性enable.idempotence为true。再对producer发送代码做修改。

https://www.cnblogs.com/listenfwind/p/12207693.html?spm=a2c4e.10696291.0.0.fde019a4a1Z8U0
网友评论