数据传递语义
至少一次(At Least Once)= ACK级别设置为-1 + 分区副本大于等于2 + ISR里应答的最小副本数量大于等于2 可以保障数据可靠
• 最多一次(At Most Once)= ACK级别设置为0
• 总结:
At Least Once可以保证数据不丢失,但是不能保证数据不重复;
At Most Once可以保证数据不重复,但是不能保证数据不丢失。
• 精确一次(Exactly Once):对于一些非常重要的信息,比如和钱相关的数据,要求数据既不能重复也不丢失。 --幂等性和变乱可以保障数据精确一次
Kafka 0.11版本以后,引入了一项巨大特性:幂等性和变乱。
幂等性
1)幂等性原理
幂等性就是指Producer岂论向Broker发送多少次重复数据,Broker端都只会持久化一条,保证了不重复。
精确一次(Exactly Once) = 幂等性 + 至少一次( ack=-1 + 分区副本数>=2 + ISR最小副本数量>=2) 。
幂等性有点类似于sql语句中的 distinct
重复数据的判断尺度:具有 < ID, Partition, SeqNumber>相同主键的消息提交时,Broker只会持久化一条。其 中PID是Kafka每次重启都会分配一个新的;Partition 表示分区号;Sequence Number是单调自增的。
所以幂等性只能保证的是在单分区单会话(重启会话就是下一次了)内不重复。
如果kafka集群挂了,重启了,此时以前的数据还会发送一回,数据又重复了。
2)如何利用幂等性
开启参数 enable.idempotence 默以为 true,false 关闭。
生产者变乱:
幂等性只能保障服务器不挂掉的环境下,发送数据是唯一的,如果发送者服务器挂掉了,那么重启之后照旧会发送重复的数据,所以必要利用变乱。
1)Kafka 变乱原理
每一个broker都有一个变乱调和器,如何知道本次变乱是哪个broker对应的变乱调和器呢,有一个算法,如图所示。
2)Kafka 的变乱一共有如下 5 个 API
- 跟java代码中的事务一模一样
- try{
- begin 开启事务
- 此处写代码
- commit();
-
- }catch(){
- // 回滚
- rollback();
-
- }
复制代码
// 1 初始化变乱
void initTransactions();
// 2 开启变乱
void beginTransaction() throws ProducerFencedException;
// 3 在变乱内提交已经消耗的偏移量(重要用于消耗者)
void sendOffsetsToTransaction(Map<TopicPartition, OffsetAndMetadata> offsets,
String consumerGroupId) throws
ProducerFencedException;
// 4 提交变乱
void commitTransaction() throws ProducerFencedException;
// 5 放弃变乱(类似于回滚变乱的操作)
void abortTransaction() throws ProducerFencedException;
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |