首页 笔记 图片 查字 
所属分类:Kafka
浏览:40
内容:

数据传递语义:
At least once 至少一次:消息不会丢失,可能会重复
At most once 最多一次:消息可能会丢失,但不会重复
Exactly once 精确一次:消息不丢失不重复,只且消费一次。幂等性和事务可以实现。

1、幂等性原理(Producer端)
幂等性就是指Producer不论向Broker发送多少次重复数据,Broker端都只会持久化一条,保证不重复。
精确一次(Exactly Once) = 幂等性 + 至少一次 ( ack=-1 + 分区副本数>=2 + ISR最小副本数量>=2 )。

重复数据的判断条件:具有<PID,Partition,SeqNum>相同主键的消息提交时,Broker只会持久化一条。

每个Producer在初始化的时候都会被分配一个唯一的PID,
Producer向指定的Topic的某个Partition发送消息时候,都会携带一个sequence number(简称seqNum),这个number从零开始且单调递增。
Broker会将Topic-Partition对应的seqNum在内存中维护,每次接收到消息都会进行校验,
只有seqNum比上次提交的seqNum刚好大一才被认为是正确的,比它大的,说明有消息丢失,比它小的,说明有消息重复发送。

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

2、事务(Producer端)
开启事务,必须先开启幂等性。

producer (请求produce-id) <-> (返回produce-id) Transaction Coordinator【kafka集群】
producer (发送数据) -> topic-partition leader
producer (请求commit) -> Transaction Coordinator【kafka集群】
Transaction Coordinator【kafka集群】(发送commit持久化请求)-> _transaction_state-分区-leader【存储事务信息的特殊主题】
producer <- (返回成功) Transaction Coordinator【kafka集群】
producer <- (后台发送请求commit) Transaction Coordinator【kafka集群】
producer (返回成功) -> Transaction Coordinator【kafka集群】
Transaction Coordinator【kafka集群】(持久化事务成功)-> _transaction_state-分区-leader【存储事务信息的特殊主题】