KAFKA幂等性和幂等性!
KAFKA幂等性和幂等性!
月伴飞鱼幂等性
在
0.11.0.0
版本支持增加了对幂等的支持。
- 幂等是针对生产者角度的特性。
- 幂等可以保证上生产者发送的消息,不会丢失,而且不会重复。
开启幂等性配置
只需要把 Producer 的配置
enable.idempotence
设置为 true 即可。
1 | props.put(“enable.idempotence”, ture) |
底层具体实现原理就是用空间换时间的优化思路
- 即在
Broker
端多存一些字段来标识数据的唯一性。
当Producer
发送了具有相同字段值的消息后,Broker
会进行匹配去重,丢弃重复的数据。
只能保证单分区上的幂等性,即一个幂等性
Producer
只能够保证某个Topic
的一个分区上不出现重复消息。
- 无法实现多分区的幂等。
如果
Producer
重启,也会导致幂等重置。
事务
事务
Producer
保证消息写入分区的原子性。
- 即这批消息要么全部写入成功,要么全失败。
Producer
重启回来后,Kafka
依然保证它们发送消息的精确一次处理。
开启
enable.idempotence = true
- 设置Producer端参数
transctional.id
数据的发送需要放在
beginTransaction
和commitTransaction
之间。
- Consumer端的代码也需要加上
isolation.level
参数,用以处理事务提交的数据。- 这个参数有两个取值:
read_uncommitted
:
- 默认值,表明
Consumer
能够读取到Kafka
写入的任何消息
- 不论事务型
Producer
提交事务还是终止事务,其写入的消息都可以读取。read_committed
:表明Consumer
只会读取事务型Producer
成功提交事务写入的消息。
1 | producer.initTransactions(); |
事务
Producer
虽然在多分区的数据处理上保证了幂等,但是处理性能上相应的是会有一些下降的。