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

面试官:简单说一下使用Kafka的场景吧

面试官今天要不来聊聊消息队列吧?我看你项目不少地方都写到Kafka了

候选者:嗯嗯

面试官那你简单说明下你使用Kafka的场景吧

候选者:使用消息队列的目的总的来说可以有三种情况:解耦、异步和削峰

候选者:比如举我项目的例子吧,我现在维护一个消息管理平台系统,对外提供接口给各个业务方调用

候选者:他们调用接口之后,实际上『不是同步』下发了消息。

候选者:在接口处理层只是把该条消息放到了消息队列上,随后就直接返回结果给接口调用者了。

候选者:这样的好处就是:

候选者:1. 接口的吞吐量会大幅度提高(因为未做真正实际调用,接口RT会非常低)【异步】

候选者:2. 即便有大批量的消息调用接口都不会让系统受到影响(流量由消息队列承载)【削峰】

56e16efd2b1a44969796bda39a1c2711.png 

候选者:又比如说,我这边还有个项目是广告订单归因工程,主要做的事情就是得到订单数据,给各个业务广告计算对应的佣金。

候选者:订单的数据是从消息队列里取出的

候选者:这样设计的好处就是:

候选者:1. 交易团队的同学只要把订单消息写到消息队列,该订单数据的Topic由各个业务方自行消费使用【解耦】【异步】

候选者:2. 即便下单QPS猛增,对下游业务无太大的感知(因为下游业务只消费消息队列的数据,不会直接影响到机器性能)【削峰】

面试官:嗯,那我想问下,你觉得为什么消息队列能到削峰?

面试官:或者换个问法,为什么Kafka能承载这么大的QPS?

候选者:消息队列「最核心」的功能就是把生产的数据存储起来,然后给各个业务把数据再读取出来。

候选者:跟我们处理请求时不一样:在业务处理时可能会调别人的接口,可能会需要去查数据库…等等等一系列的操作才行

候选者:像Kafka在「存储」和「读取」这个过程中又做了很多的优化

候选者:举几个例子,比如说:

候选者:我们往一个Topic发送消息或者读取消息时,实际内部是多个Partition在处理【并行】

候选者:在存储消息时,Kafka内部是顺序写磁盘的,并且利用了操作系统的缓冲区来提高性能【append+cache】

候选者:在读写数据中也减少CPU拷贝文件的次数【零拷贝】

7e41aa635ea54f70a9538d3e5ae5f769.png 

面试官嗯,你既然提到减少CPU拷贝文件的次数,可以给我说下这项技术吗?

候选者:嗯,可以的,其实就是零拷贝技术。

候选者:比如我们正常调用read函数时,会发生以下的步骤:

候选者:1. DMA把磁盘的拷贝到读内核缓存区

候选者:2. CPU把读内核缓冲区的数据拷贝到用户空间

候选者:正常调用write函数时,会发生以下的步骤:

候选者: 1. CPU把用户空间的数据拷贝到Socket内核缓存区

候选者: 2. DMA把Socket内核缓冲区的数据拷贝到网卡

候选者:可以发现完成「一次读写」需要2次DMA拷贝,2次CPU拷贝。而DMA拷贝是省不了的,所谓的零拷贝技术就是把CPU的拷贝给省掉

候选者:并且为了避免用户进程直接操作内核,保证内核安全,应用程序在调用系统函数时,会发生上下文切换(上述的过程一共会发生4次)

f39be0b8227c42178a2674db9a5e860b.png 

候选者:目前零拷贝技术主要有:mmap和sendfile,这两种技术会一定程度下减少上下文切换和CPU的拷贝

候选者:比如说:mmap是将读缓冲区的地址和用户空间的地址进行映射,实现读内核缓冲区和应用缓冲区共享

候选者:从而减少了从读缓冲区到用户缓冲区的一次CPU拷贝

候选者:使用mmap的后一次读写就可以简化为:

候选者:一、DMA把硬盘数据拷贝到读内核缓冲区。

候选者:二、CPU把读内核缓存区拷贝至Socket内核缓冲区。

候选者:三、DMA把Socket内核缓冲区拷贝至网卡

候选者:由于读内核缓冲区与用户空间做了映射,所以会省了一次CPU拷贝

84e22e2b43b044d68158b9066959b937.png 

候选者:而sendfile+DMA Scatter/Gather则是把读内核缓存区的文件描述符/长度信息发到Socket内核缓冲区,实现CPU零拷贝

候选者:使用sendfile+DMA Scatter/Gather一次读写就可以简化为:

候选者:一、DMA把硬盘数据拷贝至读内核缓冲区。

候选者:二、CPU把读缓冲区的文件描述符和长度信息发到Socket缓冲区。

候选者:三、DMA根据文件描述符和数据长度从读内核缓冲区把数据拷贝至网卡

b70301e2226844338a5e0e3fd9a23680.png 

候选者:回到Kafka上

候选者:从Producer->Broker,Kafka是把网卡的数据持久化硬盘,用的是mmap(从2次CPU拷贝减至1次)

候选者:从Broker->Consumer,Kafka是从硬盘的数据发送至网卡,用的是sendFile(实现CPU零拷贝)

面试官:我稍微打断下,我还有点事忙,我总结下你说的话吧

面试:你用Kafka的原因是为了异步、削峰、解耦

面试官:Kafka能这么快的原因就是实现了并行、充分利用操作系统cache、顺序写和零拷贝

面试官:没错吧?

候选者:嗯

面试官:ok,下次继续面吧, 我这边有点忙

相关文章:

  • 【牛客 - 剑指offer】详解 JZ56 数组中只出现一次的两个数字 Java实现(HashMap方案 + 利用异或运算的形式)
  • 华为OD机考0017-0018:第K长的字串-逢7过
  • Typora基本使用
  • 2021-03-26 Linux基础
  • Efficient Elements for presentations – Add-in for PowerPoint
  • R语言ggplot2可视化:ggplot2可视化水平半小提琴图(Horizontal Half Violin Plots)
  • 如何在terminal中使用Joplin并像vim一样移动?
  • 下一个排列问题next_permutation
  • SSM传染病监测防控管理系统毕业设计-附源码061525
  • 开题报告:基于java房产中介预约看房网站系统 毕业设计论文开题报告模板
  • .NET 6 Mysql Canal (CDC 增量同步,捕获变更数据) 案例版
  • 【小程序】中的事件处理详解
  • SSM大学生心理健康服务平台毕业设计-附源码071131
  • springboot绿色食品商城毕业设计-附源码061109
  • 猿创征文|技术成长之路-【Java编程系列】之文件OSS存储实践:Amazon S3实现文件上传下载
  • [LeetCode] Wiggle Sort
  • 【347天】每日项目总结系列085(2018.01.18)
  • 0基础学习移动端适配
  • Angular数据绑定机制
  • C# 免费离线人脸识别 2.0 Demo
  • - C#编程大幅提高OUTLOOK的邮件搜索能力!
  • C++入门教程(10):for 语句
  • CODING 缺陷管理功能正式开始公测
  • es6--symbol
  • FastReport在线报表设计器工作原理
  • FineReport中如何实现自动滚屏效果
  • Gradle 5.0 正式版发布
  • Java多线程(4):使用线程池执行定时任务
  • JS基础之数据类型、对象、原型、原型链、继承
  • Mac转Windows的拯救指南
  • PHP CLI应用的调试原理
  • Protobuf3语言指南
  • quasar-framework cnodejs社区
  • Theano - 导数
  • uva 10370 Above Average
  • vue-loader 源码解析系列之 selector
  • 编写符合Python风格的对象
  • 温故知新之javascript面向对象
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • 如何用纯 CSS 创作一个货车 loader
  • ​ 无限可能性的探索:Amazon Lightsail轻量应用服务器引领数字化时代创新发展
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • ​第20课 在Android Native开发中加入新的C++类
  • !!java web学习笔记(一到五)
  • # C++之functional库用法整理
  • #HarmonyOS:Web组件的使用
  • #我与Java虚拟机的故事#连载04:一本让自己没面子的书
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (rabbitmq的高级特性)消息可靠性
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (翻译)Quartz官方教程——第一课:Quartz入门
  • (分布式缓存)Redis分片集群
  • (附源码)php新闻发布平台 毕业设计 141646
  • (汇总)os模块以及shutil模块对文件的操作