当前位置: 首页 > article >正文

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

数据传递语义

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

重复数据的判断标准:具有 <PID, 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; 


http://www.kler.cn/a/387083.html

相关文章:

  • React的基础API介绍(二)
  • java八股-jvm入门-程序计数器,堆,元空间,虚拟机栈,本地方法栈,类加载器,双亲委派,类加载执行过程
  • Unity学习笔记(4):人物和基本组件
  • 继承和多态(上)
  • 微服务架构面试内容整理-API 网关-Gateway
  • 读数据质量管理:数据可靠性与数据质量问题解决之道03数据目录
  • 新手用docker真**难受
  • react 18 react-router-dom V6 路由传参的几种方式
  • 前端实现json动画(附带示例)
  • unplugin-vue-components 库作用
  • MyBatis 返回 Map 或 List<Map>时,时间类型数据,默认为LocalDateTime,响应给前端默认含有‘T‘字符
  • 【STM32F1】——舵机角度控制与TIM定时器
  • MySQL性能测试方案设计
  • 网站架构知识之Ansible(day020)
  • MySQL重难点(一)索引
  • 高并发分布式是什么,包含哪些核心技术
  • 45-best-time-to-buy-and-sell-stock-with-cooldown 力扣 714. 买卖股票的最佳时机包含手续费
  • JavaSE:初识Java(学习笔记)
  • 标定之---EPSON机械手与第三方相机的校准功能设计By python
  • Qt 使用QTreeView显示并动态的增删改查JSON文件数据
  • MySQL_第13章_视图
  • 量化交易系统开发-实时行情自动化交易-Okex K线数据
  • 基于深度学习的地物类型的提取
  • 【VR】PICO 手部追踪 steamvr内无法识别,依旧识别手柄的解决方案
  • Ubuntu18更新Linux内核5.15及Linux内核编译
  • 如何1小时掌握Vue3