3种信息交付可靠性保障幂等性 Producer
作用范围 事务型 ProducerConsumer如何设置总结
3种信息交付可靠性保障
最多一次(at most once):消息可能会丢失,但绝不会被重复发送。至少一次(at least once):消息不会丢失,但有可能被重复发送。精确一次(exactly once):消息不会丢失,也不会被重复发送。
在性能上比较 最多一次>至少一次>精确一次(幂等性>事务型)
目前默认Kafka是第二种交付情况
幂等性 Producer0.11.0.0 版本引入的新功能,指定 Producer 幂等性的方法很简单,仅需要设置一个参数即可,即 props.put(“enable.idempotence”,ture),或props.put(ProducerConfig.ENABLE_IDEMPOTENCE_CONFIG, true)。
底层具体的原理很简单,就是经典的用空间去换时间的优化思路,即在Broker 端多保存一些字段。当 Producer 发送了具有相同字段值的消息后,Broker 能够自动知晓这些消息已经重复了,于是可以在后台默默地把它们“丢弃”掉。
保证在一个Topic的单分区上保持幂等性,也就是说当重启生产者进程后,就会消失。
所以如何在多分区以及多会话连接上消息无重复呢?
事务型 Producer
和幂等性一样 开启 enable.idempotence =true
设置 Producer 端参数 transctional. id。最好为其设置一个有意义的名字。
并且在代码中添加 事务的初始化、开启、提交和停止
producer.initTransactions();
try {
producer.beginTransaction();
producer.send(record1);
producer.send(record2);
producer.commitTransaction();
} catch (KafkaException e) {
producer.abortTransaction();
}
Consumer如何设置
需要一些变更的。修改起来也很简单,设置 isolation.level参数的值即可。当前这个参数有两个取值:
- read_uncommitted:这是默认值,表明 Consumer 能够读取到 Kafka 写入的任何消息,不论事务型 Producer提交事务还是终止事务,其写入的消息都可以读取。很显然,如果你用了事务型 Producer,那么对应的Consumer 就不要使用这个值。read_committed:表明 Consumer 只会读取事务型Producer 成功提交事务写入的消息。当然了,它也能看到非事务型 Producer 写入的所有消息。
总结
由于幂等性Producer和事务型Producer性能太差,还要更具具体场景进行使用,不可能见好就用,离开了业务做技术没有意义。



