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

news/2024/11/13 2:22:10/

数据传递语义

至少一次(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.ppmy.cn/news/1545920.html

相关文章

Linux---进程间通信之共享内存

前言 我们前面学习了管道&#xff0c;今天我们学习另一种进程间通信方式--->共享内存。管道通信本质是基于文件系统的&#xff0c;并不关操作系统什么事&#xff0c;而system V IPC是操作系统特地设计的一种通信方式。但他们的目的都是一样的&#xff0c;就是让不同的进程看…

分布式数据库技术深度解析与代码实践

分布式数据库技术深度解析与代码实践 随着大数据和云计算的快速发展,分布式数据库作为一种高性能、高可用性和可扩展性的数据存储解决方案,被广泛应用于各种业务场景中。本文将深入探讨分布式数据库的核心技术、架构设计及其实践应用,并通过具体代码示例展示如何在实际项目…

jmeter 性能测试步骤是什么?

JMeter是一款流行的开源性能测试工具&#xff0c;用于测试各种服务器和网络应用的性能。在进行JMeter性能测试时&#xff0c;通常需要遵循以下步骤&#xff1a; 确定测试目标&#xff1a;首先&#xff0c;明确性能测试的目标。这可以是测试一个网站的负载能力、测试一个API的响…

Ubuntu24.04网络异常与应对方案记录

PS: 参加过408改卷的ZJU ghsongzju.edu.cn 开启嘲讽: 你们知道408有多简单吗&#xff0c;操作系统真实水平自己知道就行&#xff5e;&#xff5e; Requested credits of master in UWSC30&#xff0c;in ZJU24&#xff0c;domestic master is too simple dmesg dmesg 是一个用…

Spring Boot框架下的注解(完整版)

1. 应用程序主配置类注解 这些注解用于定义 Spring Boot 应用的主配置类&#xff0c;启用自动配置&#xff0c;设置扫描路径等。 1.1 SpringBootApplication 作用&#xff1a;SpringBootApplication 是 Spring Boot 应用的核心注解&#xff0c;通常用于应用的启动类上&#…

反向代理模块

1 概念 1.1 反向代理概念 反向代理是指以代理服务器来接收客户端的请求&#xff0c;然后将请求转发给内部网络上的服务器&#xff0c;将从服务器上得到的结果返回给客户端&#xff0c;此时代理服务器对外表现为一个反向代理服务器。 对于客户端来说&#xff0c;反向代理就相当于…

Stable Diffusion WebUI或ComfyUI下载不了huggingface?修改huggingface为国内镜像地址方法在这里

有时我们可能没有科学上网的方法&#xff0c;或者Linux系统你不会搭建科学上网的方法&#xff0c;这样你就不能访问huggingface自动下载模型了。 有人说&#xff0c;可以手动下载呀&#xff01; 但是&#xff0c;手动一个一个下载会很麻烦。 下面就讲&#xff0c;如何通过修…

[安洵杯 2019]easy_web 详细题解

知识点: 编码转换 命令执行 linux空格_关键字绕过 打开页面 发现url 是 /index.php?imgTXpVek5UTTFNbVUzTURabE5qYz0&cmd 有img参数和cmd参数 cmd参数是没赋值的,随便赋值为123456 页面没有反应 鼠标移动到图片下面时发现有东西,当然直接查看页面源代码也可以发现 尝…