幂等性
幂等性(Idempotence): 是指一个操作可以执行多次,但其执行的结果与执行一次的结果相同。
换句话说,无论执行多少次,系统的最终状态保持一致。
幂等性通常用于设计容错系统,保证在发生重试或网络异常时不会导致系统状态异常。
假设一个银行账户的余额是 100 元,执行一个“加款 10 元”的操作。
如果这个操作被重复执行了两次,账户余额就会变成 120 元,这显然不是我们期望的结果。
Kafka幂等性
Kafka 幂等性:是指 Kafka 生产者(Producer),向 Kafka Broker 发送消息时。
即使由于网络抖动…等原因,导致消息被重复发送,Broker 最终也只会持久化一条相同的消息。
Kafka 的幂等性是生产者端的特性,它解决的是在单个生产者会话(Producer Instance)内,向单个分区(Partition)发送消息时的重复写入问题。
如何解决Kafka幂等性?
Kafka通过以下机制实现幂等写入:
首先,启用幂等生产者配置。
enable.idempotence=true
其次,两个关键实现。
Kafka Producer端会自动生成以下标识:
Producer ID(PID)
Kafka 为每个生产者实例分配一个唯一的 PID,这个 PID 在生产者的整个生命周期内保持不变。
序列号(Sequence Number)
对于每个 PID,生产者发送的每条消息都会有一个单调递增的序列号。
当 Broker 接收到来自某个 PID 的消息时,它会记录下该 PID 最近接收到的 SeqNumber。
如果 Broker 再次收到来自相同 PID 、且 SeqNumber 小于、或等于已记录的 SeqNumber 的消息。
就会判断这条消息是重复的,并直接将其丢弃,而不会再次写入到 Partition 中。
Kafka幂等性总结
Kafka的幂等性是为了解决Producer在网络波动、超时、重试等情况下的消息重复发送问题。
启用幂等性后,Kafka保证即使Producer重试消息发送,同一消息也只会在分区中出现一次。
幂等性依赖Producer ID 和 消息序列号 实现精确去重。
Kafka默认开启幂等性(在新版本中,如使用事务时),但也可以通过配置手动启用。
幂等性适用于**“只发一次”**的语义,但其范围不包括消费端处理、跨多个主题或分区的一致性(这需要事务支持)。
mikechen
mikechen睿哥,10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!

后台回复【架构】即可获取《阿里架构师进阶专题全部合集》,后台回复【面试】即可获取《史上最全阿里Java面试题总结》