Kafka面经

news2024/11/16 1:30:28

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

生产者:

  1.Producer 默认是异步发送消息,这种情况下要确保消息发送成功,有两个方法
        a. 把异步发送改成同步发送,这样 producer 就能实时知道消息发送的结果。
        b. 添加异步回调函数来监听消息发送的结果,如果发送失败,可以在回调中重试
2.Producer 本身提供了一个重试参数 retries,如果因为网络问题或者 Broker 故障导致发送失败, Producer 会自动重试 


Kafka:

Kafka为了提高性能,采用的是异步批量,存储到磁盘的机制,就是有一定的消息量和时间间隔要求的,刷磁盘的这个动作是操作系统来调度的,如果在刷盘之前系统就崩溃了,就会数据丢失。它没有同步刷盘的机制

针对这个问题,需要Partition的副本机制,acks机制来解决。Partition的副本机制是针对每个数据分区的高可用策略,每个副本集会包含唯一的一个leader和多个follower,leader负责处理事务类型的请求,follower负责同步leader的数据。

所以Kafka提供了一个 acks的参数,Producer可以设置这个参数,去结合broker的副本机制来共同保障数据的可靠性。

acks=0 表示producer不需要等待broker的响应,就认为消息发送成功了(可能存在数据丢失)

acks=1 表示broker的leader和Partition收到消息之后 不等待其他的follower Partition的同步就给Producer发一个确认,假设leader和Partition
挂了(可能存在数据丢失)

acks=-1 表示broker的leader和Partition收到消息之后 并且等待 ISR列表中的follower同步完成,再给Producer返回一个确认(保证数据不丢失)


消费者:
在消费端,Kafka通常不会出现消息丢失的情况。如果发生消息丢失,可以调offset来实现消息的重新消费

2.Kafka如何保证不重复消费

原因:1.Kafka有个offset的概念,当每个消息被写进去后,都有一个offset,代表他的序号,然后consumer消费该数据之后,隔一段时间,会把自己消费过的消息的offset提交一下,代表我已经消费过了。下次我要是重启,就会继续从上次消费到的offset来继续消费。但是当我们直接kill进程了,再重启。这会导致consumer有些消息处理了,但是没来得及提交offset。等重启之后,少数消息就会再次消费一次
2.在Kafka中有一个Partition Balance机制,就是把多个Partition均衡的分配给多个消费者。消费端会从分配到的Partition里面去消费消息,如果消费者在默认的5分钟内没有处理完这一批消息。就会触发Kafka的Rebalance机制,从而导致offset自动提交失败。而Rebalance之后,消费者还是会从之前没提交的offset位置开始消费,从而导致消息重复消费。

措施:

1.Kafka的幂等性就是为了避免出现生产者重试的时候出现重复写入消息的情况。

开启功能配置(该配置默认为false)如下:

prop.put(ProducerConfig.ENABLE_IDEMPOTENCE_CONFIG,true);

2.提高消费端的处理性能避免触发 Balance,比如可以用异步的方式来处理消息,缩短单个消息消费

的市场。或者还可以调整消息处理的超时时间。还可以减少一次性从 Broker 上拉取数据的条数。

3.Kafka如何保证消费的顺序性

默认存储和消费消息,是不能保证顺序性的,因为一个topic数据可能存储在不同的分区中,每个分区都有一个按照顺序的存储的偏移量,如果消费者关联了多个分区不能保证顺序性

如果有这样的需求的话,我们是可以解决的,把消息都存储同一个分区下就行了,有两种方式都可以进行设置,第一个是发送消息时指定分区号,第二个是发送消息时按照相同的业务设置相同的key,因为默认情况下分区也是通过key的hashcode值来选择分区的,hash值如果一样的话,分区肯定也是一样的。

4.Kafka为什么这么快

  1. 磁盘顺序读写:Kafka利用磁盘顺序读写来提高性能。在Kafka中,消息是不断地追加到本地磁盘的末尾,而不是随机写入。这种顺序写入的方式可以显著提高磁盘的写入吞吐量,因为顺序写入可以避免磁盘头的频繁移动和寻址操作。
  2. 稀疏索引:Kafka的索引并不是为每一条消息都建立索引,而是采用稀疏索引的方式。这意味着Kafka在插入一批数据时才会产生一条索引记录,后续利用二分查找可以快速找到对应的数据。这种稀疏索引的设计可以大大提高检索效率,减少不必要的磁盘I/O操作。
  3. 批量文件压缩:Kafka默认不会删除数据,而是把所有的消息变成一个批量的文件,并对多次插入相同Key对应的Value进行合并,从而实现对消息的批量压缩。这种压缩技术可以减少网络I/O的消耗,提高数据传输的效率。
  4. 零拷贝机制:Kafka的文件传输最终调用的是Java NIO里面的transferTo方法,这个方法实际上调用的是Linux的sendfile()函数,可以实现零拷贝。零拷贝技术可以避免用户进程和内核空间之间的数据拷贝操作,从而大大提高文件传输的性能。
  5. 分区并行处理:Kafka通过分区(Partition)实现并行处理。每个主题可以划分多个分区,不同分区可以位于不同的节点上,从而充分利用集群优势实现机器间的并行处理。同时,分区在物理上对应一个文件夹,即使多个分区位于同一个节点,也可以通过配置让同一节点上的不同分区置于不同的磁盘上,实现磁盘间的并行处理。这种并行处理的方式可以显著提高Kafka的吞吐量。

5.Kafka的高可用机制

这个问题比较系统,回答出 kafka 的系统特点,leader 和 follower 的关系,消息读写的顺序即可。

6.为什么需要消息系统,mysql 不能满足需求吗?

(1)解耦:
允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束。
(2)冗余:
消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险。许多消息队列所采用的”插入-获取-删除”范式中,在把一个消息从队列中删除之前,需要你的处理系统明确的指出该消息已经被处理完毕,从而确保你的数据被安全的保存直到你使用完毕。
(3)扩展性:
因为消息队列解耦了你的处理过程,所以增大消息入队和处理的频率是很容易的,只要另外增加处理过程即可。
(4)灵活性 & 峰值处理能力:
在访问量剧增的情况下,应用仍然需要继续发挥作用,但是这样的突发流量并不常见。如果为以能处理这类峰值访问为标准来投入资源随时待命无疑是巨大的浪费。使用消息队列能够使关键组件顶住突发的访问压力,而不会因为突发的超负荷的请求而完全崩溃。
(5)可恢复性:
系统的一部分组件失效时,不会影响到整个系统。消息队列降低了进程间的耦合度,所以即使一个处理消息的进程挂掉,加入队列中的消息仍然可以在系统恢复后被处理。
(6)顺序保证:
在大多使用场景下,数据处理的顺序都很重要。大部分消息队列本来就是排序的,并且能保证数据会按照特定的顺序来处理。(Kafka 保证一个 Partition 内的消息的有序性)
(7)缓冲:
有助于控制和优化数据流经过系统的速度,解决生产消息和消费消息的处理速度不一致的情况。
(8)异步通信:
很多时候,用户不想也不需要立即处理消息。消息队列提供了异步处理机制,允许用户把一个消息放入队列,但并不立即处理它。想向队列中放入多少消息就放多少,然后在需要的时候再去处理它们。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1490972.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

el-select下拉框选项分多列展示

前言 相信很多开发者在实际项目开发过程中都会使用到 element-ui 组件库中的 Select 选择器,这个选择器官方是默认只用一列去展示所有的选项信息,当我们需要展示的选项内容比较多时用户只能通过滚动条去查找,多少会影响操作效率,本…

redis02 安装

官网下载 传送门https://redis.io/download/#redis-downloads 安装Redis mac m1安装 下载你需要版本的软件包放到指定的目录下进行解压 cd 到解压好的redis目录 运行下面的命令进行编译测试 sudo make test 中途可能会提示你安装make工具,按提示安装即可&…

企业如何选择值得信赖的低代码技术平台?

在数字化浪潮的推动下,企业正加速向数字化转型迈进。为了快速适应市场变化并提升竞争力,越来越多的企业开始关注低代码技术平台。然而,面对市场上众多的低代码平台,企业该如何选择值得信赖的合作伙伴呢? 一、高度的可…

(学习日记)2024.03.05:UCOSIII第七节:SysTick+任务时间片

写在前面: 由于时间的不足与学习的碎片化,写博客变得有些奢侈。 但是对于记录学习(忘了以后能快速复习)的渴望一天天变得强烈。 既然如此 不如以天为单位,以时间为顺序,仅仅将博客当做一个知识学习的目录&a…

【外汇天眼】外汇投资策略:区间突破交易系统

RangeBreak系统介绍 RangeBreak区间突破交易系统被市场广泛用于日内交易,曾经连续多年在《美国期货杂志》盈利交易系统排行榜中位居前十。 目前该交易系统也仍旧被很多专业机构和个人投资者所推崇。 交易者可根据自己的交易习惯和性格特点进行改进,并不…

Jmeter 命令启动 —— 动态参数化!

Jmeter命令行参数 1、在Linux中,使用非GUI的方式执行Jmeter。若需更改参数,必须先编辑jmx文件,找到对应变量进行修改,比较麻烦。 因此,可以参数化一些常用的变量,直接在Jmeter命令行进行设置 2、参数 -J…

根据核磁共振推出的分子结构式

核磁共振仪器实验报告 实验项目名称: 根据核磁共振推出 的分子结构式 实验目的 了解核磁共振的基本原理掌握核磁共振波谱仪的使用方法学习利用核磁共振测定化合物的结构式实验设备 核磁共振波谱仪(Bruker 500) 主要规格及技术指标&#x…

【数据结构】实现队列

大家好,我是苏貝,本篇博客带大家了解队列,如果你觉得我写的还不错的话,可以给我一个赞👍吗,感谢❤️ 目录 一. 队列的概念及结构二. 队列的实现队列的结构体初始化销毁队尾插入队头删除显示第一个节点的值…

盘点Java爬虫框架

盘点Java爬虫框架 Java 爬虫框架提供了许多功能丰富的工具和库,用于从网页抓取数据、解析HTML、处理HTTP请求等任务。以下是一些常用的 Java 爬虫框架: 1. **Jsoup**: - Jsoup 是一个用于解析HTML的Java库,它提供了简洁的API&am…

python自学3

第一节第六章 数据的列表 列表也是支持嵌套的 列表的下标索引 反向也可以 嵌套也可以 列表的常用操作 什么是列表的方法 学习到的第一个方法,index,查询元素在列表中的下标索引值 index查询方法 修改表功能的方法 插入方法 追加元素 单个元素追加 多…

C语言-两数组元素互换

#include <stdio.h> #include <string.h>//两数组元素互换 void swap(int ch1[],int ch2[],int sz) {int i 0;char ch 0;for(i 0;i < sz;i){ch ch1[i];ch1[i] ch2[i];ch2[i] ch;} } //打印数组元素 void print(int ch[],int sz) {int i 0;for(i 0;i <…

Git分布式管理-头歌实验日志和版本回退

在Git使用过程中&#xff0c;一种很常见的情况是&#xff1a;发现某个已经提交到仓库里的代码文件有致命的bug&#xff0c;必须将代码回滚到上一个版本&#xff0c;在这种情况下就显示出了Git的强大。Git为每次提交&#xff0c;都保留了日志&#xff0c;根据提交日志&#xff0…

前端开发中,并发请求工具的实现<多文件上传,数据切片>

前端开发中涉及到并发的业务中&#xff0c;如何优雅的实现一个并发工具 1.涉及并发的业务场景 1.> 多文件上传&#xff0c;支持过程中的进度展示&#xff0c;暂停&#xff0c;删除业务 2.> 多数据源的无参静态数据分片获取&#xff0c;如地图业务中海量静态点位的获取分…

centos7升级openssl_3

1、查看当前openssl版本 openssl version #一般都是1.几的版本2、下载openssl_3的包 wget --no-check-certificate https://www.openssl.org/source/old/3.0/openssl-3.0.3.tar.gz#解压 tar zxf openssl-3.0.3.tar.gz#进入指定的目录 cd openssl-3.0.33、编译安装遇到问题缺…

激活函数Swish(ICLR 2018)

paper&#xff1a;Searching for Activation Functions 背景 深度网络中激活函数的选择对训练和任务表现有显著的影响。目前&#xff0c;最成功和最广泛使用的激活函数是校正线性单元&#xff08;ReLU&#xff09;。虽然各种手工设计的ReLU替代方案被提出&#xff0c;但由于在…

机器学习入门-小白必看

机器学习 1. 机器学习的基本概念与背景2. 机器学习的常用方法3.是否需要学习机器学习&#xff0c;机器学习已经过时了&#xff1f;&#xff1f;4. 如何在机器学习上进行创新&#xff1f;5. 我该用哪种机器学习方法&#xff0c;如何定下来呢&#xff1f;总结&#xff08;对小白的…

gazebo平衡车模拟

gazebo和Ros中的平衡车模拟&#xff08;Noetic&#xff09; 控制原理 使用说明 在URDF模型中使用gazebo的 imu 插件获取平衡车姿态从 /joint_state 话题消息获取两轮的速度&#xff0c;相当于电机编码器速度环和直立环使用 串级PID 控制&#xff0c;框图如下&#xff1a;转向环…

02.变量

02.变量 01.变量 变量的概念&#xff1a; 1.变量的作用&#xff1a; 计算机中的存储空间&#xff0c;用于保存数据 2.定义变量的格式 变量名 值 注意&#xff1a; 是赋值运算符&#xff0c;左右两边打上空格是为了代码的规范性&#xff0c;美观性。 num1 3 #num1就是…

零基础学VR全景制作,新手制作流程有哪些?

VR全景技术可以应用于旅游、房地产、教育、娱乐等多个领域&#xff0c;可以为观众提供更加真实、更具沉浸感的体验。可以说&#xff0c;VR全景技术已经逐渐深入到各个领域中&#xff0c;那么对于新手来说&#xff0c;该如何制作VR全景呢&#xff1f; VR全景制作也是需要一定的技…

基于springboot的抗疫物资管理系统论文

目 录 摘 要 1 前 言 2 第1章 概述 2 1.1 研究背景 3 1.2 研究目的 3 1.3 研究内容 4 第二章 开发技术介绍 5 2.1相关技术 5 2.2 Java技术 6 2.3 MySQL数据库 6 2.4 Tomcat介绍 7 2.5 Spring Boot框架 8 第三章 系统分析 9 3.1 可行性分析 9 3.1.1 技术可行性 9 3.1.2 经济可行…