Kafka面经

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.mzph.cn/news/721382.shtml

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

相关文章

redis02 安装

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

JWT身份验证

在实际项目中一般会使用jwt鉴权方式。 JWT知识点 jwt,全称json web token ,JSON Web令牌是一种开放的行业标准RFC 7519方法,用于在两方安全地表示声明。具体网上有许多文章介绍,这里做简单的使用。 1.数据结构 JSON Web Token…

Unity 动态加载音频和音效

想要加载音效和音频需要两个组件: 听: 播: 一收一发 在层级中,右键创建 音频源 ,放入物体的子物体中。 播放 方式一 拖动需要播放的音频文件到,音频源组件中。 using System.Collections; using Syst…

Guitar Pro 8.1中文版永久许可证激活2024最新24位注册激活码生成器

Guitar Pro是一款非常受欢迎的音乐制作软件,它可以帮助用户创建和编辑各种音乐曲谱。从其诞生以来就送专门为了编写吉他谱而研发迭代的。 尽管这款产品可能已经成为全球最受欢迎的吉他打谱软件,在编写吉他六线谱和乐队总谱中始终处于行业领先地位&#…

Java求职技能清单(2024版)

一、Java基础扎实(反射、集合、IO、NIO、多线程、设计模式、通信协议等基础技术) (一)Java (二)网络IO (三)NIO模型 (…

释放数据湖潜力:小红书如何实现数仓效率与成本的双重优化

在当今以数据为核心的商业环境中,企业正面临着海量数据的处理和分析挑战。为克服传统数据仓库在处理速度、灵活性和成本效率方面的局限,小红书数据仓库团队引入如 Apache Iceberg 等数据湖技术,将其与数仓架构相结合,以释放数据湖…

2024全网最全Excel函数与公式应用

💂 个人网站:【 海拥】【神级代码资源网站】【办公神器】🤟 基于Web端打造的:👉轻量化工具创作平台💅 想寻找共同学习交流的小伙伴,请点击【全栈技术交流群】 引言 Excel是一款广泛应用于商业、教育和个人…

VUE3项目学习系列--项目配置(二)

在项目团队开发过程中,多人协同开发为保证项目格式书写格式统一标准化,因此需要进行代码格式化校验,包括在代码编写过程中以及代码提交前进行自动格式化,因此需要进行在项目中进行相关的配置使之代码格式一致。 一、eslint配置 …

【世界首富宝座易主】贝佐斯超越马斯克,再登世界首富宝座

贝佐斯超越马斯克,再登世界首富宝座 杰佛瑞普雷斯顿「杰夫」贝佐斯(英语:Jeffrey Preston1964年1月12日),生于美国新墨西哥州,美国网际网路巨头亚马逊公司创始人及现任董事长,《华盛顿邮报》大股…

哈希的简单介绍

unordered系列关联式容器 在C98中,STL提供了底层为红黑树结构的一系列关联式容器,在查询时效率可达到 l o g 2 N log_2 N log2​N,即最差情况下需要比较红黑树的高度次,当树中的节点非常多时,查询效率也不理想。最好的…

一本书讲透ChatGPT——理论与实践的完美结合,大模型技术工程师的必备指南

写在前面 OpenAI 在 2022 年 11 月推出了人工智能聊天应用—ChatGPT。它具有广泛的应用场景,在多项专业和学术基准测试中表现出的智力水平,不仅接近甚至有时超越了人类的平均水平。这使得 ChatGPT 在推出之初就受到广大用户的欢迎,被科技界誉…

Vue3学习记录(三)--- 组合式API之生命周期和模板引用

一、生命周期 1、简介 ​ 生命周期,指的是一个 Vue 实例从创建到销毁的完整阶段,强调的是一个时间段。 ​ 生命周期钩子函数,指的是 Vue 实例提供的内置函数,函数的参数为一个回调函数。这些钩子函数会在实例生命周期的某些固定…

win系统如何同时安装MySQL5和MySQL8

win系统如何同时安装MySQL5和MySQL8 文章目录 win系统如何同时安装MySQL5和MySQL81、准备好两种版本的数据库2、下载后解压到你指定的目录3、手动配置安装MySQL5和8安装MySQL53.1创建my.ini文件3.2生成data文件夹 安装MySQL83.1创建my.ini文件3.2生成data文件夹 4、配置环境变量…

汽车车灯照明灯具维修的常见误区有哪些呢?

汽车车灯照明灯具维修的常见误区有哪些呢? 汽车灯具维修的常见误区包括以下几个方面: 忽视车灯的日常保养:许多车主在日常使用中忽视了车灯的保养,只有当车灯出现故障时才进行维修。然而,定期检查和保养车灯是预防故障发生的重要…

蓝牙耳机什么牌子好?五款优质蓝牙耳机无广推荐!

​许多人向我询问关于蓝牙耳机的推荐,以及如何选购蓝牙耳机,有哪些性价比高的蓝牙耳机等问题。我已经从网络上搜集并比较了几十款耳机,现在我将分享一些我认为不错的蓝牙耳机。无论是在音质还是配置方面,这些耳机都是非常不错的。…

关于vue创建项目以及关于eslint报错的问题

vue创建完项目以后如果报parsing error no babel config file。。。这样的错误的话,关闭项目,用vscode进入项目中打开项目就可以解决了。 1 代码保存的时候会自动将单引号报错为双引号 导致eslint报错的问题, 解决思路: 在项目根…

启英泰伦「离线自然说」:让照明语音交互更自然、更便捷

随着科技的不断发展,智能家居已经成为现代生活的一部分。其中,智能照明作为智能家居的重要组成部分,为人们带来了更加便捷、舒适的照明体验。然而,传统的离线语音交互技术在智能照明领域的应用一直受到词条存储量的限制&#xff0…

有个朋友被骗了,大家要擦亮眼睛

1.引言 大家好,我是Leo哥🫣🫣🫣,昨天凌晨有个粉丝朋友找到Leo哥,咨询一些问题,现在的朋友们真卷呐,大半夜还在挑灯夜战。可无奈Leo哥12点之前已经睡了,身体为重&#xf…

智慧公厕:改变城市公共卫生管理的未来

现代城市发展快速,人口不断增加,公共卫生管理面临着严峻的挑战。传统公厕的建设、管理和使用模式已经无法满足日益提高的卫生与环保需求。然而,随着科技的进步与智能化的发展,智慧公厕正成为一种全新的解决方案,为城市…

数据库设计革命:逻辑模型的演变与面向对象的突破

✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua,在这里我会分享我的知识和经验。&#x…