Kafka中如何做到数据唯一,即数据去重?

打印 上一主题 下一主题

主题 901|帖子 901|积分 2703

数据传递语义

   至少一次(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 

  1. 跟java代码中的事务一模一样
  2. try{
  3.         begin 开启事务
  4.         此处写代码
  5.         commit();
  6.    
  7.     }catch(){
  8.        // 回滚
  9.       rollback();
  10.    
  11.     }
复制代码
 
   // 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企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

大号在练葵花宝典

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表