​Exactly-once Semantics are Possible: Here’s How Kafka Does it​

Official Docs

​Idempotent Producer​​​​Transactional Messaging in Kafka​​​​KIP-98 - Exactly Once Delivery and Transactional Messaging​​:Transactions feature,以​​Idempotent Producer​​和​​Transactional Messaging in Kafka​​为基础,阐述了如何实现如下的目标

  1. 基于Producer Identifiers(PIDs)构建的可以用来消除针对一个TopicPartition的重复消息的Idempotent Producer
  2. 跨Topic Partition写和更新offset 的能力
  3. Consumer支持只获取所在事务已经commit的消息

​KIP-129: Streams Exactly-Once Semantics​​:基于KIP-98阐述的能力,在Kafka Stream API中出现各种失败情况时,以用户(业务应用开发者)透明的方式,提供强语义:使用Kafka Streams API,从各个Topic拉取的消息将只被处理一次,此消息的处理结果,不管是对state store的更新还是process之后用于发送到kafka 输出topic的结果消息,都将只成功执行一次;也就是说,拉取输入消息,处理消息,更新state store,输出结果这四个操作,是在一个事务中,要么全部成功,要么全部失败;

​KIP-192 : Provide cleaner semantics when idempotence is enabled​

​Exactly Once Delivery and Transactional Messaging in Kafka​​​:KIP-98的设计文档,包含所有的实现细节
​​​Streams Exactly Once Design​​:KIP-129的设计文档,包含所有的实现细节

Blogs

​Kafka 事务性之幂等性实现​​​​Kafka Exactly-Once 之事务性实现​

​Exactly-once Semantics in Apache Kafka​​​​Transactions in Apache Kafka​​​​Kafka Exactly Once Semantics​