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

[Kafka 常见面试题]如何保证消息的不重复不丢失


文章目录

  • Kafka
    • 1. Kafka如何保证不丢失消息?
      • 生产者数据的不丢失
      • 消费者数据的不丢失
      • Kafka集群中的broker的数据不丢失
    • 2. Kafka中的消息是否会丢失和重复消费?
      • 1. 消息发送
      • 2. 消息消费
    • 3. Kafka 的设计是什么样的呢?
    • 4. 数据传输的事务定义有哪三种
    • 5. Kafka 怎么判断一个节点存活
    • 6. 生产者是否直接将数据发送到 broker 的 leader (主节点)
    • 7. Kafka 消费者是否可以消费指定分区消息?
    • 8. Kafka 消息是采用 Pull 模式,还是 Push 模式?
    • 9. Kafka 存储在硬盘上的消息格式是什么? (存疑)
    • 10. 介绍一下kafka 的 ack 机制
    • 11. Kafka 的消费者如何消费数据

Kafka

1. Kafka如何保证不丢失消息?

生产者数据的不丢失

  • 如果是同步模式:

ack机制能够保证数据的不丢失,如果ack设置为0,风险很大,一般不建议设置为0。即使设置为1,也会随着leader宕机丢失数据。

producer.type=sync 
request.required.acks=1
  • 如果是异步模式:

也会考虑ack的状态,除此之外,异步模式下的有个buffer,通过buffer来进行控制数据的发送,有两个值来进行控制,时间阈值与消息的数量阈值,如果buffer满了数据还没有发送出去,有个选项是配置是否立即清空buffer。可以设置为-1,永久阻塞,也就数据不再生产。异步模式下,即使设置为-1。也可能因为程序员的不科学操作,操作数据丢失,比如kill -9,但这是特别的例外情况。

producer.type=async
request.required.acks=1
queue.buffering.max.ms=5000
queue.buffering.max.messages=10000 
queue.enqueue.timeout.ms = -1 
batch.num.messages=200

结论:producer有丢数据的可能,但是可以通过配置保证消息的不丢失。

消费者数据的不丢失

通过 offset commit 来保证数据的不丢失,Kafka自己记录了每次消费的offset数值,下次继续消费的时候,会接着上次的offset进行消费。

而offset的信息在Kafka0.8版本之前保存在Zookeeper中,在0.8版本之后保存到topic中,即使消费者在运行过程中挂掉了,再次启动的时候会找到offset的值,找到之前消费消息的位置,接着消费,由于 offset的信息写入的时候并不是每条消息消费完成后都写入的,所以这种情况有可能会造成重复消费,但是不会丢失消息。
唯一例外的情况是,我们在程序中给原本做不同功能的两个consumer组设置

Kafka SpoutConfig.bulider.setGroupid的时候设置成了一样的 groupid,这种情况会导致这两个组共享同一份数据,就会产生组A消费 partition1,partition2 中的消息,组B消费 partition3 的消息,这样每个组消费的消息都会丢失,都是不完整的。 为了保证每个组都独享一份消息数据,groupid一定不要重复才行。

Kafka集群中的broker的数据不丢失

每个broker中的partition我们一般都会设置有replication(副本)的个数,生产者写入的时候首先根据分发策略(有partition按partition,有key按key,都没有轮询)写入到leader中,follower(副本)再跟leader同步数据,这样有了备份,也可以保证消息数据的不丢失。

2. Kafka中的消息是否会丢失和重复消费?

要确定Kafka的消息是否丢失或重复,从两个方面分析入手:消息发送和消息消费。

1. 消息发送

Kafka消息发送有两种方式:同步(sync)和异步(async),默认是同步方式,可通过 producer.type属性进行配置。
Kafka通过配置 request.required.acks属性来确认消息的生产:

0---表示不进行消息接收是否成功的确认;
1---表示当Leader接收成功时确认;
-1---表示Leader和Follower都接收成功时确认;

综上所述,有6种消息生产的情况,下面分情况来分析消息丢失的场景:
(1) acks=0,不和 Kafka 集群进行消息接收确认,则当网络异常、缓冲区满了等情况时,消息可能丢失;
(2) acks=1、同步模式下,只有Leader确认接收成功后但挂掉了,副本没有同步,数据可能丢失;

2. 消息消费

Kafka 消息消费有两个 consumer 接口,Low-level API 和 High-level API:
Low-level API:消费者自己维护 offset 等值,可以实现对 Kafka 的完全控制;
High-level API:封装了对 parition 和 offset 的管理,使用简单;
如果使用高级接口High-level API,可能存在一个问题就是当消息消费者从集群中把消息取出来、并提交了新的消息offset值后,还没来得及消费就挂掉了,那么下次再消费时之前没消费成功的消息就“ 诡异”的消失了;
解决办法:
针对消息丢失:
同步模式下,确认机制设置为-1,即让消息写入Leader和Follower之后再确认消息发送成功;
异步模式下,为防止缓冲区满,可以在配置文件设置不限制阻塞超时时间,当缓冲区满时让生产者一直处于阻塞状态;
针对消息重复:将消息的唯一标识保存到外部介质中,每次消费时判断是否处理过即可。
消息重复消费及解决参考: 如何保证消息不被重复消费?(如何保证消息消费时的幂等性)-Java知音

消息的重复消费问题,需要考虑幂等性,如果消费类型天生幂等,那么就没有必要去考虑重复消费的问题。
但是一般上 MQ 的任务都是一些比较耗时的任务,比如说调用第三方服务,此时可以采用第三方记录(redis),保存消息的唯一 id,定义消息的唯一id 以及时间戳的消费类型(待处理,过程中,失败/完成),如果是消费过程丢失,会导致消息长时间处于待处理的状态,我们可以另起一个定时任务,轮询一定时间间隔的任务,将它生产到兜底服务,由兜底服务去判断是否需要再次消费(比如说,一个 sms 服务,可以去查询当前消息 id 的短信是否已经成功发出,如果成功发出,则标记当前任务成功消费。)

3. Kafka 的设计是什么样的呢?

Kafka 将消息以主题为单位进行归纳。

  • 将向 Kafka 主题发布消息的程序称为生产者。
  • 将预订主题并消费消息的程序成为消费者。
  • Kafka 以集群的方式运行,可以由一个或多个服务组成,每个服务叫做一个 broker(中间人)。
  • 生产者通过网络将消息发送到 Kafka 集群,集群向消费者提供消息

4. 数据传输的事务定义有哪三种

  • 最多一次: 消息不会被重复发送,最多被传输一次,但也有可能一次不传输;
  • 最少一次: 消息不会被漏发送,最少被传输一次,但也有可能被重复传输;
  • 精确的一次(Exactly once): 不会漏传输也不会重复传输,每个消息都传输被一次而且仅仅被传输一次,这是大家所期望的。

5. Kafka 怎么判断一个节点存活

主要有两个条件

  1. 必须可以维护和 ZooKeeper 的连接,ZooKeeper 通过心跳机制检查每个节点的连接;
  2. 如果节点是个 follower,他必须能及时的同步 leader 的写操作,延时不能太久。

6. 生产者是否直接将数据发送到 broker 的 leader (主节点)

生产者直接将数据发送到 broker 的 leader(主节点),不需要在多个节点进行分发,为了 帮助 producer 做到这点,所有的 Kafka 节点都可以及时的告知,哪些节点是活动的,目标 topic 目标分区的 leader 在哪。这样 producer 就可以直接将消息发送到目的地了。

7. Kafka 消费者是否可以消费指定分区消息?

Kafka 消费消息时,向 broker 发出 “fetch” 请求去消费特定分区的消息,同时,consumer 还指定消息在日志中的偏移量(offset),这样就可以消费从这个位置开始的消息。
消费者拥有 了 offset 的控制权,可以向后回滚去重新消费之前的消息,这是很有意义的。

8. Kafka 消息是采用 Pull 模式,还是 Push 模式?

Kafka 遵循了一种大部分消息系统共同的传统 的设计:producer 将消息推送到 broker,consumer 从 broker 拉取消息 。

9. Kafka 存储在硬盘上的消息格式是什么? (存疑)

消息由一个固定长度的头部和可变长度的字节数组组成。头部包含了一个版本号和 CRC32 校验码。

  • 版本号: 1 byte
  • CRC 校验码: 4 bytes
  • 具体的消息: n bytes

10. 介绍一下kafka 的 ack 机制

在Kafka发送数据的时候,每次发送消息都会有一个确认反馈机制,确保消息正常被收到。
可以通过设置request.required.acks 决定 ack 策略。

  • 0: 生产者不会等待 broker 的 ack,这个延迟最低但是存储的保证最弱。当 server 挂掉的时候就会丢数据;
  • 1:服务端会等待 ack 值。leader 副本确认接收到消息后发送 ack 。如果 leader 挂掉后,不确保是否复制完成,也就是说新 leader 可能会丢失数据;
  • -1:同样在 1 的基础上,服务端会等所有的 follower 的副本收到数据后, leader 才会发出 的 ack,这样数据就不会丢失。

11. Kafka 的消费者如何消费数据

消费者每次消费数据的时候,都会记录消费的物理偏移量(offset), 等到下次消费时,他会接着上次位置继续消费 。

相关文章:

[Kafka 常见面试题]如何保证消息的不重复不丢失

文章目录 Kafka1. Kafka如何保证不丢失消息?生产者数据的不丢失消费者数据的不丢失Kafka集群中的broker的数据不丢失 2. Kafka中的消息是否会丢失和重复消费?1. 消息发送2. 消息消费 3. Kafka 的设计是什么样的呢?4. 数据传输的事务定义有哪三…...

Java中System.setProperty()用法

Java中System.setProperty()用法 大家好,我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天,让我们一起深入了解Java中的System.setProperty()方法&#xff0c…...

Eclipse 自动生成注解,如果是IDEA可以参考编译器自带模版进行修改

IDEA添加自动注解 左上角选择 File -> Settings -> Editor -> File and Code Templates&#xff1b; 1、添加class文件自动注解&#xff1a; ​/*** <b>Function: </b> todo* program: ${NAME}* Package: ${PACKAGE_NAME}* author: Jerry* date: ${YEA…...

微信小程序vant安装使用过程中遇到无法构建npm的问题

官网地址&#xff0c;然而如果完全按照这个教程来&#xff0c;实际上是缺少步骤的&#xff0c;需要补充一些步骤&#xff08;参考https://www.bilibili.com/video/BV1vL41127Er&#xff09; # 这步init就是补充的 npm init npm i vant/weapp -S --production# 剩下的按照vant的…...

[python]用python获取EXCEL文件内容并保存到DBC

目录 关键词平台说明背景所需库实现过程方法1.1.安装相关库2.代码实现 关键词 python、excel、DBC、openpyxl 平台说明 项目Valuepython版本3.6 背景 在搭建自动化测试平台的时候经常会提取DBC文件中的信息并保存为excel或者其他文件格式&#xff0c;用于自动化测试。本文…...

Spring Boot 如何配置 log4j2

Log4j2 介绍 Spring Boot 中默认使用 Logback 作为日志框架&#xff0c;接下来我们将学习如何在 Spring Boot 中集成与配置 Log4j2。在配置之前&#xff0c;我们需要知道的是 Log4j2 是 Log4j 的升级版&#xff0c;它在 Log4j 的基础上做了诸多改进&#xff1a; 异步日志&…...

如何安装docker

安装Docker的步骤取决于您使用的操作系统。以下是常见操作系统上安装Docker的基本步骤&#xff1a; 对于Linux: 更新软件包索引&#xff1a; sudo apt-get update安装允许apt通过HTTPS使用仓库的包&#xff1a; sudo apt-get install apt-transport-https ca-certificates cur…...

Linux 之 性能优化

uptime $ uptime -p up 1 week, 1 day, 21 hours, 27 minutes$ uptime12:04:11 up 8 days, 21:27, 1 user, load average: 0.54, 0.32, 0.23“12:04:11” 表示当前时间“up 8 days, 21:27,” 表示运行了多长时间“load average: 0.54, 0.32, 0.23”“1 user” 表示 正在登录…...

用Go汇编实现一个快速排序算法

本代码全网首发&#xff0c;使用Go plan9 windows arm64汇编&#xff0c;实现基础版快速排序算法。 未引入随机因子的快速排序的普通Go代码长这样。 func QuickSort(arr []int) {if len(arr) < 1 {return}base, l, r : arr[0], 0, len(arr)-1for i : 1; i < r; {if arr…...

Spring-整合MyBatis

依赖 <dependencies><!--提供数据源--><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.1.9.RELEASE</version></dependency><!--提供sqlSessionFactory…...

sql宽字节注入

magic_quotes_gpc&#xff08;魔术引号开关&#xff09; https://www.cnblogs.com/timelesszhuang/p/3726736.html magic_quotes_gpc函数在php中的作用是判断解析用户提交的数据&#xff0c;如包括有&#xff1a;post、get、cookie过来的数据增加转义字符“\”&#xff0c;以…...

开源 LLM 微调训练指南:如何打造属于自己的 LLM 模型

一、介绍 今天我们来聊一聊关于LLM的微调训练&#xff0c;LLM应该算是目前当之无愧的最有影响力的AI技术。尽管它只是一个语言模型&#xff0c;但它具备理解和生成人类语言的能力&#xff0c;非常厉害&#xff01;它可以革新各个行业&#xff0c;包括自然语言处理、机器翻译、…...

Android hilt使用

一&#xff0c;添加依赖库 添加依赖库app build.gradle.kts implementation("com.google.dagger:hilt-android:2.49")annotationProcessor("com.google.dagger:hilt-android:2.49")annotationProcessor("com.google.dagger:hilt-compiler:2.49"…...

2023/12/17 初始化

普通变量&#xff08;int,float,double变量&#xff09;初始化&#xff1a; int a0; float b(0); double c0; 数组初始化&#xff1a; int arr[10]{0}; 指针初始化&#xff1a; 空指针 int *pnullptr; 被一个同类型的变量的地址初始化&#xff08;赋值&#xff09; int…...

【算法Hot100系列】三数之和

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

CSS 简介

什么是 CSS? CSS 是层叠样式表(Cascading Style Sheets)的缩写,是一种用来为结构化文档(如 HTML 文档或 XML 应用)添加样式(字体、间距和颜色等)的计算机语言。 CSS 的主要作用是: 控制网页的样式,如字体、颜色、背景、布局等提高网页的开发效率CSS 的语法 CSS 的…...

myBatis-plus自动填充插件

在 MyBatis-Plus 3.x 中&#xff0c;自动填充的插件方式发生了变化。现在推荐使用 MetaObjectHandler 接口的实现类来定义字段的填充逻辑。以下是使用 MyBatis-Plus 3.x 自动填充的基本步骤&#xff1a; 1.基本配置 1.1添加 Maven 依赖&#xff1a; 确保你的 Maven 依赖中使…...

746. 使用最小花费爬楼梯 --力扣 --JAVA

题目 给你一个整数数组 cost &#xff0c;其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用&#xff0c;即可选择向上爬一个或者两个台阶。 你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。 请你计算并返回达到楼梯顶部的最低花费。 解题思路 到…...

使用Verdaccio搭建私有npm仓库

搭建团队的私有仓库&#xff0c;保证团队组件的安全维护和私密性&#xff0c;是进阶前端开发主管路上&#xff0c;必不可少的一项技能。 一、原理 我们平时使用npm publish进行发布时&#xff0c;上传的仓库默认地址是npm&#xff0c;通过Verdaccio工具在本地新建一个仓库地址…...

87 GB 模型种子,GPT-4 缩小版,超越ChatGPT3.5,多平台在线体验

瞬间爆火的Mixtral 8x7B 大家好&#xff0c;我是老章 最近风头最盛的大模型当属Mistral AI 发布的Mixtral 8x7B了&#xff0c;火爆程度压过Google的Gemini。 缘起是MistralAI二话不说&#xff0c;直接在其推特账号上甩出了一个87GB的种子 随后Mixtral公布了模型的一些细节&am…...

Golang 数组 移除元素 双指针法 leetcode27 小记

文章目录 移除元素 leetcode27暴力解法双指针法1. 快慢指针2. 双向指针 移除元素 leetcode27 go中数据类型的分类&#xff1a; 1.值类型&#xff1a;int、float、bool、string、数组、结构体 2.引用类型&#xff1a;指针、切片、map、管道、接口 由于切片为引用类型&#xff0c…...

c# OpenCV 图像裁剪、调整大小、旋转、透视(三)

图像裁剪、调整大小、旋转、透视图像处理基本操作。 croppedImage 图像裁剪Cv2.Resize() 调整图像大小图像旋转 Cv2.Rotate()旋转Cv2.Flip()翻转Cv2.WarpAffine()任意角度旋转Cv2.GetAffineTransform()透视 一、图像裁剪 // 读取原始图像 Mat image new Mat("1.png&q…...

Kafka相关知识

一、kafka架构 Kafka基础知识 Kafka是最初由Linkedin公司开发&#xff0c;是一个分布式、分区的、多副本的、多生产者、多订阅者&#xff0c;基于zookeeper协 调的分布式日志系统(也可以当做MQ系统)&#xff0c;常见可以用于webynginx日志、访问日志&#xff0c;消息服务等等&…...

gitlab 通过svn hook 触发

jenkins 起一个item 配置&#xff1a; 我选的自由风格的 源码管理配置 先选subversion 就是svn类型 url 设置project 的路径&#xff0c; 注意是工程&#xff0c;不是svn 顶层 添加一个账户来进行pull 等操作 选择添加的账号 构建触发器&#xff1a; &#xff0c;重要的是要自…...

设计模式详解---单例模式

1. 设计模式详解 单例模式是一种创建对象的设计模式&#xff0c;它确保一个类只有一个实例&#xff0c;并提供全局访问点以获取该实例。 在单例模式中&#xff0c;类负责创建自己的唯一实例&#xff0c;并确保任何其他对象只能访问该实例。这对于需要共享状态或资源的情况非常有…...

毕设之-Hlang后端架构-双系统交互

文章目录 前言交互流程基本流程约定公钥人人中台携带公钥获取私钥私钥生成人人中台携带私钥访问私钥验证&#xff08;博客系统&#xff09; 调试演示总结 前言 前天我们完成了基本的整合&#xff0c;但是还没有整合到我们的业务系统&#xff0c;也就是博客系统。本来昨天要搞一…...

什么同源策略?

同源 同源指的是URL有相同的协议、主机名和端口号。 同源策略 同源策略指的是浏览器提供的安全功能&#xff0c;非同源的RUL之间不能进行资源交互 跨域 两个非同源之间要进行资源交互就是跨域。 浏览器对跨域请求的拦截 浏览器是允许跨域请求的&#xff0c;但是请求返回…...

破译模式:模式识别在计算机视觉中的作用

一、介绍 在当代数字领域&#xff0c;计算机视觉中的模式识别是关键的基石&#xff0c;推动着众多技术进步和应用。本文探讨了计算机视觉中模式识别的本质、方法、应用、挑战和未来趋势。通过使机器能够识别和解释视觉数据中的模式&#xff0c;模式识别不仅推动了计算机视觉领域…...

c语言-全局变量与局部变量

目录 1、&#xff08;作用&#xff09;域的概念 2、全局与局部的相对性 3、生命周期 3、静态变量static 结语&#xff1a; 前言&#xff1a; 在c语言中&#xff0c;全局变量的可见范围是整个工程&#xff0c;而局部变量的可见范围从该变量被定义到该作用域结束&#xff0c…...

【Spring】00 入门指南

文章目录 1.简介2.概念1&#xff09;控制反转&#xff08;IoC&#xff09;2&#xff09;依赖注入&#xff08;DI&#xff09; 3.核心模块1&#xff09;Spring Core2&#xff09;Spring AOP3&#xff09;Spring MVC4&#xff09;Spring Data5&#xff09;Spring Boot 4.编写 Hel…...

兰州网站建设网站建设/合肥关键词排名提升

linux 时间子系统 二 时间系统的组成 时间轮&#xff0c;jiffies与HZ 时间轮是linux kernel处理内核低精度定时器的机制&#xff0c;由周期的定时器中断驱动。定时器中断以配置的HZ参数为频率产生&#xff0c;在中断中更新系统时间jiffies&#xff0c;摘取到期的定时器执行&a…...

wordpress分享到微博才能看到/信息发布平台推广有哪些

一、选项卡 如今很多应用都会使用碎片以便在同一个活动中能够显示多个不同的视图。在Android 3.0 以上的版本中&#xff0c;我们已经可以使用ActionBar提供的Tab来实现这种效果&#xff0c;而不需要我们自己去实现碎片的切换。ActionBar默认是不具备选项卡功能的&#xff0c;所…...

东莞网站se/seo网络推广什么意思

处理过线上问题的同学基本上都会遇到系统突然运行缓慢&#xff0c;CPU 100%&#xff0c;以及 Full GC 次数过多的问题。 当然&#xff0c;这些问题最终导致的直观现象就是系统运行缓慢&#xff0c;并且有大量的报警。 本文主要针对系统运行缓慢这一问题&#xff0c;提供该问题…...

做网站外包哪家好/网络营销类型有哪些

前言安全保护几乎对于所有的项目都是一个挑战&#xff0c;对于物联网项目更是如&#xff0c;自普及应用以来物联网业内已经发生过多起安全事故。作为物联网通信协议事实标准&#xff0c;MQTT 保持着较高的安全性&#xff0c;提供了多层次的安全设计&#xff1a;传输层&#xff…...

网站建设赚钱么/网站备案是什么意思

此文转载自&#xff1a;https://blog.csdn.net/vivid117/article/details/110871426#commentBoxAMBA总线协议(六)—— 一文看懂 AXI3 协议 原子访问 2 AMBA总线协议(一)—— 一文看懂APB总线协议AMBA总线协议(二)—— 一文看懂AMBA2 AHB2与AMBA3 AHB-Lite总线协议的区别AMBA总线…...

网站建设活动海报/成都seo排名

创造者的思维方式 我不知道人们是怎么回事&#xff0c;缺乏想象力还是怎么的&#xff0c;所以我跟其他人对话常常遇到类似的问题。 我&#xff1a;A其实不怎么好。 其他人&#xff1a;你说A不好&#xff0c;难道你要我用B&#xff1f; &#xff08;对于政治爱好者&#xff0c;如…...