当前位置: 首页 > 后端技术 > Java

Kafka的数据丢失、重复消费、顺序消费

时间:2023-04-01 22:39:29 Java

采访者:今天想聊聊消息队列吗?我看到你的项目中很多地方都写了Kafka候选人:嗯面试官:那你可以简单介绍一下你使用Kafka的场景候选人:使用消息队列的目的一般可以是三种情况:,异步和调峰候选人:例如,以我的项目为例。我现在维护一个消息管理平台系统,对外提供接口供各业务方调用候选人:他们调用接口后,实际上是向其发送“非同步”的信息。候选:接口处理层只是将消息放到消息队列中,然后直接将结果返回给接口调用者。考生:这样做的好处是:考生:1.接口的吞吐量会大大提高(因为没有实际调用,接口RT会很低)【异步】考生:2.即使有大消息调用次数接口不会影响系统(流量由消息队列承载)【削峰】面试官:嗯……应聘者:比如我这里还有一个项目,是广告订单归因项目。主要做的是获取订单数据,计算每条商家广告对应的佣金。考生:订单的数据取自消息队列。考生:这种设计的优点是:考生:1、交易组的同学只需要将订单消息写入消息队列即可,订单数据的主题由各业务方自行决定。消费使用【解耦】【异步】考生:2、即使一个订单的QPS激增,对下游业务的感知也不大(因为下游业务只消费消息队列的数据,不会直接影响到机器的性能)[切枫]面试官:那我想问一下,你认为消息队列为什么能达到峰值?面试官:或者另一个问题,为什么Kafka可以承载这么大的QPS?考生:消息队列的“核心”功能是存储生产数据,然后为每个业务读取数据。考生:和我们处理请求的时候不一样:在业务处理的时候,我们可能会调用别人的接口,可能需要去查数据库……等考生:像Kafka在“存储”和“读取”的过程中fetching,做了很多优化candidates:举几个例子,例如:Candidates:当我们向一个Topic发送或读取消息时,实际上多个Partitions在内部处理[parallel]candidates:当存储消息时,Kafka在内部写入到disksequentially,利用操作系统的buffer来提高性能[append+cache]候选人:也减少了读写数据时CPU拷贝文件的次数[零拷贝]面试官:嗯,既然你说减少CPU拷贝文件的次数,能介绍一下这个技术吗?考生:嗯,对,其实就是零拷贝技术。Candidate:比如我们正常调用read函数时,会发生以下步骤:Candidate:1.DMA拷贝磁盘到readkernelbufferCandidate:2.CPU从readkernelbuffer拷贝数据到userspacecandidate候选:当write函数被正常调用时,会发生以下步骤:候选:1.CPU将用户空间中的数据复制到Socket内核缓冲区中候选:2.DMA将Socket内核缓冲区中的数据复制到网络中cardcandidate:可以发现需要两个DMA副本和两个CPU副本才能完成“一次读写”。无法保存DMA副本。所谓零拷贝技术,就是将CPU的拷贝保存到候选:而为了防止用户进程直接操作内核,保证内核安全,当应用程序调用系统函数时,会进行一次上下文切换发生(以上过程一共会发生4次)面试官:...考生:目前主要的零拷贝技术有:mmap和sendfile。这两项技术会在一定程度上减少上下文切换和CPU拷贝。候选:例如:mmap是将读缓冲区的地址和用户空间的地址进行映射,实现读内核缓冲区和应用程序缓冲区的共享候选:从而减少了一次CPU从读缓冲区到用户的拷贝buffer候选:使用mmap后面的读写可以简化为:候选:1.DMA将硬盘数据复制到读取内核缓冲区。候选:2.CPU将读取的内核缓冲区复制到Socket内核缓冲区。候选:3.DMA复制Socket内核缓冲区到网卡Gather是将读取内核缓冲区的文件描述符/长度信息发送到Socket内核缓冲区实现CPU零拷贝候选:使用sendfile+DMAScatter/Gather来readandwriteonce可以简化为:考生:1.DMACopy硬盘数据读取内核buffer。候选:2.CPU将读缓冲区的文件描述符和长度信息发送给Socket缓冲区。考生:3.DMA根据文件描述符和数据长度,将读取到的内核缓冲区中的数据复制到网卡中。候选人:回到卡夫卡。最重要的是mmap(从2个CPU副本减少到1个)。考生:从Broker->Consumer,Kafka将数据从硬盘发送到网卡,使用sendFile(实现CPU零拷贝)面试官:稍微打断了下,我还在忙,我总结一下你说的吧。面试官:你用Kafka的原因是异步、削峰、解耦。面试官:Kafka之所以能这么快,是因为它实现了并行,充分利用了操作系统。缓存、顺序写入和零拷贝采访者:对吗?应聘者:是面试官:好的,下次继续面试吧,我这边有点忙。欢迎关注我的微信公众号【Java3y】聊一聊Java面试【在线面试官-手机端】系列持续每周更新两期!【在线面试官-电脑】系列每周两篇持续更新中!原创不易!!一连求三!!