【Java面试】十二、Kafka相关

文章目录

  • 1、Kafka如何保证消息不丢失
    • 1.1 生产者发消息到Brocker丢失:设置异步发送
    • 1.2 消息在Broker存储时丢失:发送确认机制
    • 1.3 消费者从Brocker接收消息丢失
    • 1.4 同步 + 异步组合提交偏移量
  • 2、Kafka如何保证消费的顺序性
  • 3、Kafka高可用机制
    • 3.1 集群模式
    • 3.2 分区备份机制
  • 4、Kafka数据清理机制
    • 4.1 数据存储
    • 4.2 数据清理
  • 5、Kafka实现高性能的设计
    • 5.1 零拷贝
  • 6、面试

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

broker:经纪人
在这里插入图片描述
和RabbitMQ类似的分析,Kafka丢数据的可能点有:

  • 生产者发消息到Brocker的过程丢消息
  • 消息存Broker时丢了
  • 消费者从Broker接收消息后丢了

1.1 生产者发消息到Brocker丢失:设置异步发送

异步发送,传入回调逻辑,回调逻辑中,判断发送有异常时,记录日志并重试:

在这里插入图片描述

配置中设置重试次数:

在这里插入图片描述

1.2 消息在Broker存储时丢失:发送确认机制

生产者发送消息到leader,leader需要把数据同步到follower

在这里插入图片描述

发送确认机制,即返给生产者producer一个acks,当设置acks = :

  • 0:producer不等Kafka的回复,消息一扔就走。因此消息发的快,但可能丢消息
  • 1:leader收到消息后,给producer一个成功的响应,告诉它消息发送成功
  • all:leader、follower都收到消息后,才给producer一个成功的响应

在这里插入图片描述

1.3 消费者从Brocker接收消息丢失

Kafka的分区机制,即一个Topic被划分成多个分区,如图,Topic1被分为P1、P2、P3、P4,且这四个分区,又在两个不同的Broker。

现有一个消费者组,里面有三个实例consume1、consume2、consume3,负责处理topic1 的消息。topic分区的消息,只能由消费者组的唯一一个消费者处理,因此,不同的分区分给了不同的消费者,如图,consume1负责P1、P2,consume2负责P3,consume3负责P4分区。

在这里插入图片描述

每个分区里,都是按照偏移量存储数据、消费数据(分区中的每条消息,都分配了一个序号,即偏移量,从0开始自增)。消费者默认每5秒自动提交一次已经消费的偏移量,即自己处理到哪个位置了
在这里插入图片描述

如上,某个消费组的实例consumer1处理P1、P2,实例consumer处理P3。假设consumer2宕机,其负责的分区分给组里的其他实例去处理,如交给了consumer1

在这里插入图片描述

此时:

  • 如果consume2消费到了偏移量3,提交的偏移量也是3,则consumer1接手后,没任何问题
  • 如果consume2消费到了偏移量6,但提交的偏移量只到3(还没来得及提交),则consumer1接手后,会导致3~6偏移量的数据重复消费
  • 如果consume2消费到了偏移量1,但提交的偏移量到了3(消息拿走了,但还没来得及处理),则consumer1接手后,会导致1~3的消息丢失

1.4 同步 + 异步组合提交偏移量

解决这个问题,可禁用自动提交偏移量,改为手动提交:

  • 同步提交:会导致消费者在提交偏移量后阻塞,直到提交成功或失败,但偏移量准确(看重可靠性)
  • 异步提交:允许消费者继续处理其他消息,而不必等待偏移量提交的确认,但偏移量可能提交失败(看重吞吐量)
  • 同步 + 异步组合使用

组合使用,处理消息时使用异步提交,而在消费完后提交出现异常时(consumer.commitAsync方法异常),使用同步提交来确保最后一批消息的偏移量被正确提交。如此,可以在保证效率的同时,尽可能地保证偏移量的正确性

在这里插入图片描述
这样写,提交偏移量可控了,但如果消费完一条消息后,还没异步提交就断电,还是会有重复消费问题。finally里写个同步提交,可以解决异步提交时,偏移量可能提交失败(有异常)的问题,但解决不了瞬间断电宕机的问题。

再回头看瞬间断电宕机一个consumer,导致的重复消费和消息丢失问题。这么写代码,重复消费的问题还在,因此,还是要考虑幂等方案,如消费时,先判断业务ID是否存在,是则return

但消息丢失的问题就没有了,因为现在是手动提交偏移量,不存在:消息拿走了,但还没来得及处理,偏移量就被提交了(然后宕机)的情况。现在的代码是,先处理,再提交。因此,如果最坏也就是消息被处理了,但没提交偏移量,后面的consumer接手后,还是属于重复消费问题。

2、Kafka如何保证消费的顺序性

需要顺序性的场景如:聊天,A发消息的顺序 == B收消息的顺序。Kafka,一个Topic可能有多个分区,每个分区内,是有顺序的,但整个Topic的所有分区里,无顺序。因此,要顺序,可只提供一个分区。或者说,同一个业务的数据,放同一个分区。
在这里插入图片描述
以上两种写法都可,第一种写法指定分区,第二种写法用key,key被hash后,分到不同的区,因此,同一个业务,用相同的key即可。

3、Kafka高可用机制

3.1 集群模式

每一个broker,就是一个Kafka实例。 多个broker实例,组成集群。挂掉一个,其余的也能处理请求。

在这里插入图片描述

3.2 分区备份机制

一个topic有多个分区,每个分区有多个副本,其中一个是leader,另一个是follower,且follower存储在集群的其他broker实例中。如下图,topic1的分区P0,其leader在broker1,两个follower在broker1和broker2。当leader故障,Kafka会将一个follower提升为leader,且ISR的follower优先被提升。

在这里插入图片描述

ISR,即in-sync-relica,是同步复制的follower,数据更加完整,但效率不高。普通的follower,即异步复制的,不保证完整性,但性能好。
在这里插入图片描述
最后,关于ISR副本数的控制:

在这里插入图片描述

4、Kafka数据清理机制

4.1 数据存储

在这里插入图片描述

topic是一个逻辑概念,数据在磁盘,按照topic分区存,一个分区对应一个文件夹,如下图:

在这里插入图片描述
分区内部,存储了数据,且是分段存储,segment,每一段,对应三个文件,.index索引文件、.log真正的数据文件、.timeindex时间索引文件。采取分段,而不是将所有数据都放到一个文件,是因为分段后:

  • 删除已被消费的无用分段文件更方便
  • 查找数据更便捷(文件名是以偏移量命名的)

都放一个文件,不分段,则不管是删除还是查找都很烦。

4.2 数据清理

清理策略1:消息保存时间超过了指定时间,默认168h即7天。

在这里插入图片描述

清理策略2:当topic所有分区的文件总和,所占的文件大小超过配置的阈值,开始删除最久的消息。需手动开启。

在这里插入图片描述

5、Kafka实现高性能的设计

  • 消息分区:一个topic分成多个part,在不同的broker节点上。不再受单台服务器的限制,可以不受限的处理更多的数据
  • 顺序读写:磁盘顺序读写,而不是随机磁盘寻道,提升读写效率
  • 页缓存:把磁盘中的数据缓存到内存中,把对磁盘的访问变为对内存的访问。第二次读相同数据时,直接走页缓存,写时,先写到页缓存,再刷回磁盘。

在这里插入图片描述

  • 零拷贝:减少上下文切换及数据拷贝
  • 消息压缩:Kafka提供了多种数据压缩算法,东西变小了,从而减少磁盘IO和网络IO,但同时压缩也会额外损耗CPU资源
  • 分批发送:将多个消息打包批量发送,减少网络开销,默认16KB一发,如果指定时间内,不到16KB,也会发,以防消息积压

5.1 零拷贝

现在有一个producer需要发送消息,过程为:从用户空间(权限小,无法直接调用硬件资源磁盘)拷贝到内核空间的页缓存,到一定批次后,将数据写进磁盘。

在这里插入图片描述

再来一个consumer消费消息,过程为:用户空间的Kafka先在页缓存找有没这个消息,没找到则去磁盘,并拷贝到内核空间的页缓存,再拷贝到用户空间。想要把消息发送给消费者,就要用到socket连接和网卡,因此接下来是,数据从用户空间拷贝到内核空间的Socket缓冲区,再拷贝到网卡,然后发出去,经历了4次拷贝

在这里插入图片描述

而Kafka的零拷贝,即磁盘 copy到 页缓存,页缓存直接copy到网卡,只要两次拷贝。Kafka知道哪个消费者要消费消息,因此,把整个操作委托给系统,不再经过用户空间。

在这里插入图片描述

6、面试

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

小程序自定义marker弹出框教程

需求背景 微信小程序开发,需要使用腾讯地图显示自定义marker,并且点击marker后弹出自定义的customCallout,并且customCallout的内容为用户点击marker的时候再从后台接口获取数据。 百度了一圈后发现居然没有一篇文章可以一次性完成&#xf…

Polar Web【简单】upload

Polar Web【简单】upload Contents Polar Web【简单】upload思路EXPPythonGo 运行&总结 思路 如题目所说,本题考查的是文件上传漏洞的渗透技巧。 打开环境,发现需要上传的是图片文件,故考虑使用截取数据包进行数据修改进行重放。在重发器…

王学岗鸿蒙开发(北向)——————(十三)音乐播放器

AudioRenderer适合录音 AVPlayer:简单的本地单曲播放 MP3文件放置的地方 import media from ohos.multimedia.media import common from ohos.app.ability.common; Entry Component struct Index {//第1步:avPlayer:media.AVPlayer nullasync onPageShow(){//第…

AI-知识库搭建(一)腾讯云向量数据库使用

一、AI知识库 将已知的问答知识,问题和答案转变成向量存储在向量数据库,在查找答案时,输入问题,将问题向量化,匹配向量库的问题,将向量相似度最高的问题筛选出来,将答案提交。 二、腾讯云向量数…

Nvidia/算能 +FPGA+AI大算力边缘计算盒子:医疗健康智能服务

作为国产运动医学的领导者,致力于提供运动医学的整体临床解决方案,公司坐落于北京经济技术开发区。应用于肩关节、膝关节、足/踝关节、髋关节、肘关节、手/腕关节的运动医学设备、植入物和手术器械共计300多个品规通过NMPA的批准,临床应用于国…

AJAX 跨域

这里写目录标题 同源策略JSONPJSONP 是怎么工作的JSONP 的使用原生JSONP实践CORS 同源策略 同源: 协议、域名、端口号 必须完全相同、 当然网页的URL和AJAX请求的目标资源的URL两者之间的协议、域名、端口号必须完全相同。 AJAX是默认遵循同源策略的,不…

AI漫画赛道,10分钟快速赚钱秘诀!

AI百宝箱-Chatgpt4.0、Midjourney绘画、人工智能绘画、AI换脸、AI图片放大、AI图片分析、AI图片融合https://h5.cxyhub.com/?invitationhmeEo7 先使用ChatGPT写小说 ComicAI 漫画小说生成网站 1. 创建小说漫画 2. 故事模板 3. 生成角色形…

【Linux】ls命令

这个命令主要是用于显示指定工作目录下之内容(列出目前工作目录所含的文件及子目录)。 掌握几个重点的常使用的就可以: ls -l # 以长格式显示当前目录中的文件和目录 ls -a # 显示当前目录中的所有文件和目录&am…

【C++题解】1457 - 子数整除

问题:1457 - 子数整除 类型:循环应用 题目描述: 于一个五位数 abcde ,可将其拆分为三个子数: sub1abc sub2bcd sub3cde 例如,五位数20207 可以拆分成sub1202 sub2020 (也就是 20) sub3207 现在给定一个正…

Soap - ScriptableObject 架构模式

厌倦了意大利面代码吗?🍝 Soap提供了无代码解决方案来解决常见的意大利面代码问题,让您可以: 在场景和组件之间共享变量 以简单而强大的方式发送和接收事件 自动将UI和组件绑定到数据 一键保存关键变量 让游戏开发更容易 🎲 Soap使得解耦您的代码变得简单而无缝,使您能…

助力高考,一组彩色的文字

1、获取文本内容 首先&#xff0c;获取每个<div>元素的文本内容&#xff0c;并清空其内部HTML&#xff08;innerHTML ""&#xff09;。 2、创建<span>元素 然后&#xff0c;它遍历文本的每个字符&#xff0c;为每个字符创建一个新的<span>元素…

linux网络服务“PXE网络批量装机和Kickstart全自动化安装”

PXE网络批量装机 pxe自动装机&#xff1a; 服务端和客户端 pxe c/s 模式&#xff1a;允许客户端通过网络从远程服务器&#xff08;服务端&#xff09;下载引导镜像&#xff0c;加载安装文件&#xff0c;实现自动化安装操作系统。 无人值守 :安装选项不需要人为干预&#xf…

STM32智能家居项目esp8266上云OneNet【附源码+详细教程】

目录 一、硬件选材 二、OneNet使用教程 三、代码修改教程 四、添加数据流方法 五、项目工程&#xff08;源码元件清单教程&#xff09; 小白也能做&#xff0c;项目工程在后文可下载。 一、硬件选材 二、OneNet使用教程 拿到代码后肯定是连不上网的&#xff0c;因为源码…

【漏洞复现】宏景eHR openFile.jsp 任意文件读取漏洞

0x01 产品简介 宏景eHR人力资源管理软件是一款人力资源管理与数字化应用相融合&#xff0c;满足动态化、协同化、流程化、战略化需求的软件。 0x02 漏洞概述 宏景eHR openFile.jsp 接口处存在任意文件读取漏洞&#xff0c;未经身份验证攻击者可通过该漏洞读取系统重要文件(如…

第18篇 Intel FPGA Monitor Program的使用<一>

Q&#xff1a;Intel FPGA Monitor Program开发工具可以支持Terasic的FPGA开发板使用吗&#xff1f; A&#xff1a;Intel FPGA Monitor Program 是Intel提供的适用于 ARM* Cortex*-A9 处理器和 Nios II 处理器的完整软件开发环境&#xff0c;它包括编译工具以及完整的调试功能&…

【双指针算法】原地处理数组的双指针算法思想

移动零 题目中已经明确表示不能重新创建数组来辅助解题&#xff0c;因此只能对数组进行原地操作&#xff0c;即双指针算法思想。 算法思想&#xff1a; 题目要求我们将非0元素放在数组的左边&#xff0c;0元素放在数组的右边&#xff0c;同时保持非0元素的相对位置。 这种对…

【优选算法】详解target类求和问题(附总结)

目录 1.两数求和 题目&#xff1a; 算法思路&#xff1a; 代码&#xff1a; 2.&#xff01;&#xff01;&#xff01;三数之和 题目 算法思路&#xff1a; 代码&#xff1a; 3.四数字和 题目&#xff1a; 算法思路&#xff1a; 代码&#xff1a; 总结&易错点&…

csdn上传图片失败解决办法

今天下午写笔记&#xff0c;上传图片的时候总是出现图片上传不成功。查询了下解决方案&#xff1a; C:\Windows\System32\drivers\etc &#xff0c;使用管理员打开hosts文件加入&#xff1a; 49.7.22.7 csdn-img-blog.oss-cn-beijing.aliyuncs.com保存之后&#xff0c;&#x…

Mac怎么读取内存卡 Mac如何格式化内存卡

在今天的数字化时代&#xff0c;内存卡已经成为了我们生活中不可或缺的一部分。对于Mac电脑用户而言&#xff0c;正确地读取和管理内存卡中的数据至关重要。下面我们来看看Mac怎么读取内存卡&#xff0c;Mac如何格式化内存卡的相关内容。 一、Mac怎么读取内存卡 苹果电脑在读…

Nacos长轮询底层是怎么实现的?

点击下方“JavaEdge”&#xff0c;选择“设为星标” 第一时间关注技术干货&#xff01; 免责声明~ 任何文章不要过度深思&#xff01; 万事万物都经不起审视&#xff0c;因为世上没有同样的成长环境&#xff0c;也没有同样的认知水平&#xff0c;更「没有适用于所有人的解决方案…