20220406151651.png

幂等性

幂等性原理

Producer 的幂等性指的是Producer不论向Broker发送多少次重复数据,数据在 Broker 端只会被持久化一次,保证了数据不重复。

精确一次(Exactly Once):幂等性+至少一次(ack=-1 + 分区副本>=2 + ISR最小副本数量>=2)

这里的幂等性是有条件的:

  • 只能保证 Producer 在单个会话内不丟不重,如果 Producer 出现意外挂掉再重启是无法保证的(幂等性情况下,是无法获取之前的状态信息,因此是无法做到跨会话级别的不丢不重);
  • 幂等性不能跨多个 Topic-Partition,只能保证单个 partition 内的幂等性,当涉及多个 Topic-Partition 时,这中间的状态并没有同步。

所以幂等性==只能保证的是在单分区单会话内不重复==

重复数据的判断标准:具有 ==<PID, Partition, SeqNumber>== 相同主键消息提交时,只会持久化一次。

  • PID(Producer ID):每次会话重启都会分配一个新的。
  • Partition:表示分区号
  • SeqNumber:单调递增

20220406153628.png

如何使用幂等性

  • 开启参数enable.idempotence:默认为true,false关闭。

事务

Kafka事务原理

20220406152507.png

  • 凡是开启幂等性都是需要生成 PID(Producer ID),只不过未开启事务的 PID 可以在任意 broker 生成,而开启事务只能在 TransactionCoordinator 节点生成。
    • TransactionCoordinator 节点选择描述中的【Leader副本】:每个分区都会有多个副本,主要分为两种:Leader副本和Follower副本。

20220406154818.png