【Kafka】面试题总结

news2025/1/6 19:45:19

Kafka

  • 1、什么是消息队列
  • 2、消息队列有什么用
  • 3、Kafka 的多分区以及多副本机制有什么好处呢
  • 4、Zookeeper 在 Kafka 中的作用知道吗
  • 5、Kafka 如何保证消息的消费顺序
  • 6、Kafka 如何保证消息不丢失
  • 7、Kafka 如何保证消息不重复消费
  • 7、Kafka为什么快/吞吐量大

1、什么是消息队列

我们可以把消息队列看作是一个存放消息的容器,当我们需要使用消息的时候,直接从容器中取出消息供自己使用即可。由于队列 Queue 是一种先进先出的数据结构,所以消费消息时也是按照顺序来消费的。参与消息传递的双方称为 生产者 和 消费者 ,生产者负责发送消息,消费者负责处理消息。

在这里插入图片描述

2、消息队列有什么用

通常来说,使用消息队列能为我们的系统带来下面三点好处:

  1. 应用解耦

举个常见业务场景:下单扣库存,用户下单后,订单系统去通知库存系统扣减。传统做法就是1订单系统直接调用库存系统:

在这里插入图片描述

  • 如果库存系统无法访问,下单就会失败,订单和库存系统存在耦合关系
  • 如果业务又接入一个营销积分服务,那订单下游系统要扩充,如果未来接入越来越多下游系统,那订单系统代码需要经常修改

在这里插入图片描述

如何解决这个问题呢?可以引入消息队列

在这里插入图片描述

  • 订单系统:用户下单后,消息写入到消息队列,返回下单成功。
  • 库存系统:订阅下单消息,获取下单信息,进行库存操作。
  1. 削峰/限流。

流量削峰也是消息队列的常用场景。我们做秒杀实现的时候,需要避免流量暴涨,打垮应用系统的风险。可以在应用前面加入消息队列。

在这里插入图片描述
假设秒杀系统每秒最多可以处理 2k个请求,每秒却有 5k 的请求过来,可以引入消息队列,秒杀系统每秒从消息队列拉 2k 请求处理得了。

有些伙伴担心这样会出现消息积压的问题,首先秒杀活动不会每时每刻都那么多请求过来,高峰期过去后,积压的请求可以慢慢处理;其次,如果消息队列长度超过最大数量,可以直接抛弃用户请求或跳转到错误页面。

  1. 异步处理

我们经常会遇到这样的业务场景:用户注册成功后,给它发个短信和发个邮件。如果注册信息入库 30ms,发短信、邮件也 30ms,三个动作串行执行的话,会比较耗时,响应 90ms

在这里插入图片描述

如果采用并行执行的方式,可以减少响应时间。注册信息入库后,同时异步发短信和邮件。如何实现异步呢,用消息队列即可,就是说,注册信息入库成功后,写入到消息队列(这个一般比较快,如只需要 3ms),然后异步读取发邮件和短信。

在这里插入图片描述

3、Kafka 的多分区以及多副本机制有什么好处呢

  1. Kafka 通过给特定 Topic 指定多个 Partition,而各个 Partition 可以分布在不同的 Broker 上,这样便能提供比较好的并发能力(负载均衡)。
  2. Partition 可以指定对应的 Replica 数,这也极大地提高了消息存储的安全性,提高了容灾能力,不过也相应的增加了所需要的存储空间。

4、Zookeeper 在 Kafka 中的作用知道吗

  1. Broker 注册 :在 Zookeeper 上会有一个专门用来进行 Broker 服务器列表记录的节点。每个 Broker 在启动时,都会到 Zookeeper 上进行注册,即到 /brokers/ids 下创建属于自己的节点。每个 Broker 就会将自己的 IP 地址和端口等信息记录到该节点中去。
  2. Topic 注册 : 在 Kafka 中,同一个Topic 的消息会被分成多个分区并将其分布在多个 Broker 上,这些分区信息及与 Broker 的对应关系也都是由 Zookeeper 在维护。比如我创建了一个名字为 my-topic 的主题并且它有两个分区,对应到 zookeeper 中会创建文件夹:/brokers/topics/my-topic/Partitions/0、/brokers/topics/my-topic/Partitions/1。
  3. 负载均衡 :上面也说过了 Kafka 通过给特定 Topic 指定多个 Partition, 而各个 Partition 可以分布在不同 Broker 上,这样便能提供比较好的并发能力。 对于同一个 Topic 的不同 Partition,Kafka 会尽力将这些 Partition 分布到不同的 Broker 服务器上。当生产者产生消息后也会尽量投递到不同 Broker 的 Partition 里面。当 Consumer 消费的时候,Zookeeper 可以根据当前的 Partition 数量以及 Consumer 数量来实现动态负载均衡。

5、Kafka 如何保证消息的消费顺序

  1. 1 个 Topic 只对应一个 Partition。
  2. (推荐)发送消息的时候指定 key/Partition。

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

丢失消息有 3 种不同的情况,针对每一种情况有不同的解决方案。

  1. 生产者丢失消息的情况
  2. Kafka 弄丢了消息
  3. 消费者丢失消息的情况

生产者丢失消息的情况

生产者调用send方法发送消息之后,消息可能因为网络问题并没有发送过去。所以,我们不能默认在调用send方法发送消息之后消息发送成功了。为了确定消息是发送成功,我们要判断消息发送的结果。可以采用为其添加回调函数的形式,如果消息发送失败的话,我们检查失败的原因之后重新发送即可!

producer.send(new ProducerRecord<>(topic, message), new Callback() {
    @Override
    public void onCompletion(RecordMetadata metadata, Exception exception) {
        if (exception == null) {
            System.out.println("发送成功");
        } else {
            System.out.println("发送失败");
        }
    }
});

另外这里推荐为 Producer 的 retries (重试次数)设置一个比较合理的值,一般是 3 ,但是为了保证消息不丢失的话一般会设置比较大一点。设置完成之后,当出现网络问题之后能够自动重试消息发送,避免消息丢失。另外,建议还要设置重试间隔,因为间隔太小的话重试的效果就不明显了,网络波动一次你3次一下子就重试完了。

Kafka 弄丢了消息

我们知道 Kafka 为 Partition 引入了多副本(Replica)机制。Partition 中的多个副本之间会有一个叫做 Leader 的家伙,其他副本称为 Follower。我们发送的消息会被发送到 Leader 副本,然后 Follower 副本才能从 Leader 副本中拉取消息进行同步。生产者和消费者只与 Leader 副本交互。你可以理解为其他副本只是 Leader 副本的拷贝,它们的存在只是为了保证消息存储的安全性。

试想一种情况:假如 Leader 副本所在的 Broker 突然挂掉,那么就要从 Fllower 副本重新选出一个 Leader ,但是 Leader 的数据还有一些没有被 Follower 副本的同步的话,就会造成消息丢失。

设置 acks = all

解决办法就是我们设置 acks = all。acks 是 Kafka 生产者(Producer) 很重要的一个参数。

acks 的默认值即为1,代表我们的消息被leader副本接收之后就算被成功发送。当我们配置 acks = all 表示只有所有 ISR 列表的副本全部收到消息时,生产者才会接收到来自服务器的响应. 这种模式是最高级别的,也是最安全的,可以确保不止一个 Broker 接收到了消息. 该模式的延迟会很高。

设置 replication.factor >= 3

为了保证 Leader 副本能有 Follower 副本能同步消息,我们一般会为 Topic 设置 replication.factor >= 3。这样就可以保证每个 Partition 至少有 3 个副本。虽然造成了数据冗余,但是带来了数据的安全性。

消费者丢失消息的情况

我们知道消息在被追加到 Partition(分区)的时候都会分配一个特定的偏移量(offset)。offset 表示 Consumer 当前消费到的 Partition(分区)的所在的位置。Kafka 通过偏移量(offset)可以保证消息在分区内的顺序性。

当消费者拉取到了分区的某个消息之后,消费者会自动提交了 offset。自动提交的话会有一个问题,试想一下,当消费者刚拿到这个消息准备进行真正消费的时候,突然挂掉了,消息实际上并没有被消费,但是 offset 却被自动提交了。

这种情况的解决办法也比较粗暴,我们手动关闭自动提交 offset,每次在真正消费完消息之后之后再自己手动提交 offset 。但是,细心的朋友一定会发现,这样会带来消息被重新消费的问题。比如你刚刚消费完消息之后,还没提交 offset,结果自己挂掉了,那么这个消息理论上就会被消费两次。

7、Kafka 如何保证消息不重复消费

  • kafka出现消息重复消费的原因:服务端侧已经消费的数据没有成功提交 offset(根本原因)。
  • Kafka 侧 由于服务端处理业务时间长或者网络链接等等原因让 Kafka 认为服务假死,触发了分区 rebalance。

① 消费消息服务做幂等校验,比如 Redis 的 set、MySQL 的主键等天然的幂等功能。这种方法最有效。这部分主要集中在消费端的编码层面,需要我们在设计代码时以幂等性的角度进行开发设计,保证同一数据无论进行多少次消费,所造成的结果都一样。处理方式可以在消息体中添加唯一标识,在处理消息前先检查下Mysql/Redis是否已经处理过该消息了,消费端进行确认此唯一标识是否已经消费过,如果消费过,则不进行之后处理。从而尽可能的避免了重复消费。

② 提高消费端的处理性能避免触发Balance,比如可以用多线程的方式来处理消息,缩短单个消息消费的时长。或者还可以调整消息处理的超时时间,也还可以减少一次性从Broker上拉取数据的条数。

7、Kafka为什么快/吞吐量大

  1. 顺序读写:Kafka每个分区对应一个日志文件,消息写入是追加到日志文件后面、顺序写磁盘的速度快于随机写。
  2. 批量发送:Kafka发送消息时将消息缓存到本地,达到一定数量或者间隔一定时间再发送,减少了网络请求的次数。
  3. 批量压缩:发送的时候对数据进行压缩。
  4. 页面缓存:Kafka大量使用了页面缓存,就是将数据写入磁盘前会先写入系统缓存,然后进行刷盘;读取数据也会先读取缓存,没有再读磁盘。虽然异步刷盘会因单点故障导致数据丢失,但是多副本的机制保障了数据的持久化。
  5. 零拷贝:Kafka使用了DMA的技术,使Socket缓冲池可以直接读取内核内存的数据,减少了数据拷贝到应用再拷贝到Socket缓冲池的过程,也减少了2次上下文切换。

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

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

相关文章

【JavaScript】对象继承精华提炼

继承机制 每个函数都有一个prototype属性&#xff0c;指向一个对象&#xff0c;该对象是原型对象&#xff1b;构造函数生成实例时&#xff0c;该属性会自动成为实例对象的原型&#xff1b;原型对象上的所有属性和方法&#xff0c;都能被实例对象共享继承&#xff1b;原型对象的…

使用HALCON标定板快速标定,纠正成像畸变

使用HALCON标定板快速标定&#xff0c;纠正成像畸变 1生成标定板描述文件 gen_caltab (7, 7, 0.00375, 0.5, caltab.descr, caltab.ps)gen_caltab ( : : XNum, YNum, MarkDist, DiameterRatio, CalPlateDescr, CalPlatePSFile : ) 为具有矩形排列标记的标定板生成标定板描述文…

Linux环境下安装RocketMQ(单机、集群)

目录 前置要求&#xff1a; 一、下载RocketMQ 二、上传解压 三、配置rocketmq的环境变量 四、查看rocketmq的目录结构 五、启动 5.1 启动nameserver 5.2 启动broker 六、测试发送消息 七、关闭 八、RocketMQ集群搭建 8.1 RocketMQ集群模式介绍 8.2 搭建 8.2.1 准…

海康机器视觉Visionmaster-VM3D常见问题及解决方法

软件及环境问题 第一个问题&#xff1a;软件获取问题 官网获取 第二个问题&#xff1a;环境配置类问题 1.软件打不开&#xff0c;加密狗灯不亮&#xff0c;6报错&#xff1a;加密狗未检测到或异常。解决方法&#xff1a;安装3DVM的驱动。 安装后加密狗无法识别&#xff0c…

SLAM论文速递:SLAM—— MID-Fusion:基于八叉树的对象级多实例动态SLAM—4.26(1)

论文信息 题目&#xff1a; MID-Fusion:Octree-based Object-Level Multi-Instance Dynamic SLAMMID-Fusion:基于八叉树的对象级多实例动态SLAM 论文地址&#xff1a; https://ieeexplore.ieee.org/abstract/document/8794371发表期刊&#xff1a; 2019 International Conf…

LVS-NAT模式

什么是群集&#xff1f; 多台主机组成的一个整体&#xff0c;提供一个ip访问通道&#xff0c;所有的主机干一件事 提供同样的服务。 群集有哪些类型&#xff1f; ①负载均衡群集&#xff08;LB&#xff09;&#xff1a; 提高系统的响应能力&#xff0c;处理更多的访问请求&am…

Linux进程(1)

目录 ⛹&#x1f3fd;进程简介⛹&#x1f3fd;查看进程⛹&#x1f3fd;系统调用&#x1f6b4;&#x1f3fd;获取进程标示符&#x1f6b4;&#x1f3fd;创建进程 ⛹&#x1f3fd;进程状态&#x1f6b4;&#x1f3fd;孤儿进程&#xff1a;&#x1f6b4;&#x1f3fd;进程优先级 ⛹…

一次使用netcat的经验记录

1.netcat安装 参考&#xff1a;https://my.oschina.net/u/3530967/blog/1560985 2.netcat使用 参考&#xff1a;https://zhuanlan.zhihu.com/p/83959309 3.创建udp服务 &#xff08;1&#xff09;使用&#xff1a;nc -l -u -p 8810 创建udp服务端监听8810端口 在另一台机…

基于信度感知的半监督医学图像分类对比自集成

文章目录 Reliability-Aware Contrastive Self-ensembling for Semi-supervised Medical Image Classification摘要本文方法Reliability-Aware Contrastive Mean TeacherWeight FunctionReliability-Aware Consistency LossReliability-Aware Contrastive LossObjective Functi…

windows 安装mysql5.7

确认是否安装了mysql winr 输入services.msc , 找mysql 下载 链接&#xff1a;https://pan.baidu.com/s/1zPuvzjWovky3MrpNlIt9uw 提取码&#xff1a;y52i 安装 https://blog.csdn.net/u012318074/article/details/124042756 家目录下新建配置文件 my.ini 注意路径中 // &a…

企业进行数字化转型的优劣势分别有哪些?

数字化转型是指将数字技术融入企业的方方面面&#xff0c;从而导致企业运营方式和为客户创造价值的方式发生根本性变化。企业数字化转型既有优势也有劣势&#xff0c;概述如下&#xff1a; 优点&#xff1a; 提高效率和生产力&#xff1a;数字化转型使企业能够自动化和简化业…

Session服务端会话追踪

1. Session基本使用 将数据&#xff08;cookie&#xff09;保存在客户端不安全&#xff0c;因为客户端在不停的进行着网络传输&#xff0c;所以把数据存储在服务端。 存储的对象就是session&#xff0c;例如AServlet往session中存数据&#xff0c;BServlet往session中读数据。 …

纯 CSS 实现几个 Loading 效果

1. 平滑加载 <div class"progress-1"></div>.progress-1 {width:120px;height:20px;background:linear-gradient(#000 0 0) 0/0% no-repeat#ddd;animation:p1 2s infinite linear; } keyframes p1 {100% {background-size:100%} }linear-gradient(#000 0…

11.java程序员必知必会类库之word处理库

前言 正常业务中&#xff0c;可能涉及到和合作方签约电子合同&#xff0c;此时&#xff0c;我们需要先设计合同模板&#xff0c;维护固定内容&#xff0c;将可变的内容通过占位符替代&#xff0c;等签章的时候&#xff0c;生成pdf,然后可以根据设计的合同章的坐标&#xff0c;…

家庭私人影院 - Windows搭建Emby媒体库服务器并远程访问 「无公网IP」

文章目录 1.前言2. Emby网站搭建2.1. Emby下载和安装2.2 Emby网页测试 3. 本地网页发布3.1 注册并安装cpolar内网穿透3.2 Cpolar云端设置3.3 Cpolar内网穿透本地设置 4.公网访问测试5.结语 1.前言 在现代五花八门的网络应用场景中&#xff0c;观看视频绝对是主力应用场景之一&…

第十章_Redis集群(cluster)

是什么 定义 由于数据量过大&#xff0c;单个Master复制集难以承担&#xff0c;因此需要对多个复制集进行集群&#xff0c;形成水平扩展每个复制集只负责存储整个数据集的一部分&#xff0c;这就是Redis的集群&#xff0c;其作用是提供在多个Redis节点间共享数据的程序集。 官…

cad怎么转换成pdf格式,3个方法快速搞定

cad怎么转换成pdf格式&#xff1f;首先我们来了解一下CAD是什么。CAD是一种计算机辅助设计软件&#xff0c;其文件格式为DWG&#xff08;Drawing&#xff09;和DXF&#xff08;Drawing Exchange Format&#xff09;。DWG是CAD程序的本地文件格式&#xff0c;用于存储2D和3D图形…

【LLM】LLaMA简介:一个650亿参数的基础大型语言模型

LLaMA简介&#xff1a;一个650亿参数的基础大型语言模型 PaperSetup其他资料 作为 Meta 对开放科学承诺的一部分&#xff0c;今天我们将公开发布 LLaMA (大型语言模型 Meta AI) &#xff0c;这是一个最先进的大型语言基础模型&#xff0c;旨在帮助研究人员推进他们在人工智能这…

刘宇:如何打造快、稳、易、专的多元数据库运行平台

导语 4月8日下午&#xff0c;为期两天的第十二届数据技术嘉年华&#xff08;DTC 2023&#xff09;在北京新云南皇冠假日酒店圆满落下帷幕。大会以“开源融合数字化——引领数据技术发展&#xff0c;释放数据要素价值”为主题&#xff0c;汇聚产学研各界精英到场交流。云和恩墨作…

直面GPT-4的缺陷和风险,OpenAI提出多种安全应对措施

深入研究OpenAI官方团队发布的长达99页的技术报告&#xff0c;我们发现在GPT-4光鲜亮丽功能的背后&#xff0c;还隐藏了OpenAI团队付出的的汗水和努力&#xff0c;尤其是在缓解GPT模型自身缺陷和模型安全落地方面。 报告链接&#xff1a; https://arxiv.org/abs/2303.08774 一、…