kafka精确一次

kafka通过幂等性(Idempotence)事务(Transaction)实现消息精确一次(exactly once)的可靠性保障。

幂等性 Producer

设置props.put(“enable.idempotence”, ture),或props.put(ProducerConfig.ENABLE_IDEMPOTENCE_CONFIG, true)

底层原理:用空间去换时间的优化思路,即在 Broker 端多保存一些字段。当 Producer 发送了具有相同字段值的消息后,Broker 能够自动知晓这些消息已经重复了,于是可以在后台默默地把它们“丢弃”掉。

  • ProducerID:在每个新的Producer初始化时,会被分配一个唯一的ProducerID,这个ProducerID对客户端使用者是不可见的。
  • SequenceNumber:对于每个ProducerID,Producer发送数据的每个Topic和Partition都对应一个从0开始单调递增的SequenceNumber值。

作用范围:它只能保证单分区上的幂等性,即一个幂等性 Producer 能够保证某个主题的一个分区上不出现重复消息,它无法实现多个分区的幂等性。其次,它只能实现单会话上的幂等性,不能实现跨会话的幂等性。

多分区以及多会话上的消息无重复,需要依赖事务型 Producer.

事务型 Producer

事务型 Producer 能够保证将消息原子性地写入到多个分区中。这批消息要么全部写入成功,要么全部失败。

设置事务型 Producer 的方法:

  • 开启enable.idempotence = true

  • 设置 Producer 端参数transactional.id。最好为其设置一个有意义的名字。

producer.initTransactions();
try {
    producer.beginTransaction();
    producer.send(record1);
    producer.send(record2);
    producer.commitTransaction();
} catch (KafkaException e) {
    producer.abortTransaction();
}

isolation.level支持read_uncommittedread_committed


   转载规则


《kafka精确一次》 wangyixin-tom 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
kafka消费者 kafka消费者
消费者组Consumer Group 是 Kafka 提供的可扩展且具有容错性的消费者机制。 Consumer Group 下可以有一个或多个 Consumer 实例。 Group ID 是一个字符串,在一个 Kafka 集群中,它标识唯
2021-03-23
下一篇 
kafka拦截器 kafka拦截器
Kafka 拦截器分为生产者拦截器和消费者拦截器。 生产者拦截器允许你在发送消息前以及消息提交成功后植入你的拦截器逻辑; 而消费者拦截器支持在消费消息前以及提交位移后编写特定逻辑。 使用 当前 Kafka 拦截器的设置方法是通过参数配置完成
2021-03-23
  目录