KAFKA幂等性和幂等性!

幂等性

0.11.0.0 版本支持增加了对幂等的支持。

  • 幂等是针对生产者角度的特性。
  • 幂等可以保证上生产者发送的消息,不会丢失,而且不会重复。

开启幂等性配置

只需要把 Producer 的配置 enable.idempotence 设置为 true 即可。

1
2
3
props.put(“enable.idempotence”, ture)
//或者
props.put(ProducerConfig.ENABLE_IDEMPOTENCE_CONFIG, true)

底层具体实现原理就是用空间换时间的优化思路

  • 即在Broker端多存一些字段来标识数据的唯一性。

Producer发送了具有相同字段值的消息后,Broker会进行匹配去重,丢弃重复的数据。

只能保证单分区上的幂等性,即一个幂等性Producer只能够保证某个Topic的一个分区上不出现重复消息。

  • 无法实现多分区的幂等。

如果Producer重启,也会导致幂等重置。

事务

事务Producer保证消息写入分区的原子性。

  • 即这批消息要么全部写入成功,要么全失败。

Producer重启回来后,Kafka依然保证它们发送消息的精确一次处理。

开启enable.idempotence = true

  • 设置Producer端参数transctional.id

数据的发送需要放在beginTransactioncommitTransaction之间。

  • Consumer端的代码也需要加上isolation.level参数,用以处理事务提交的数据。
  • 这个参数有两个取值:
    • read_uncommitted
      • 默认值,表明 Consumer 能够读取到 Kafka 写入的任何消息
        • 不论事务型 Producer 提交事务还是终止事务,其写入的消息都可以读取。
    • read_committed:表明 Consumer 只会读取事务型 Producer 成功提交事务写入的消息。
1
2
3
4
5
6
7
8
9
producer.initTransactions();
try {
producer.beginTransaction();
producer.send(record1);
producer.send(record2);
producer.commitTransaction();
} catch (KafkaException e) {
producer.abortTransaction();
}

事务Producer虽然在多分区的数据处理上保证了幂等,但是处理性能上相应的是会有一些下降的。