关于java:Kafka丢数据重复消费顺序消费的问题

39次阅读

共计 2064 个字符,预计需要花费 6 分钟才能阅读完成。

面试官 明天要不来聊聊音讯队列吧?我看你我的项目不少中央都写到 Kafka 了

候选者:嗯嗯

面试官 那你简略阐明下你应用 Kafka 的场景吧

候选者:应用音讯队列的目标总的来说能够有三种状况:解耦、异步和削峰

候选者:比方举我我的项目的例子吧,我当初保护一个音讯治理平台零碎,对外提供接口给各个业务方调用

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

候选者:在接口解决层只是把该条音讯放到了音讯队列上,随后就间接返回后果给接口调用者了。

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

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

候选者:2. 即使有大批量的音讯调用接口都不会让零碎受到影响(流量由音讯队列承载)【削峰】

面试官:嗯…

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

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

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

候选者:1. 交易团队的同学只有把订单音讯写到音讯队列,该订单数据的 Topic 由各个业务方自行生产应用【解耦】【异步】

候选者:2. 即使下单 QPS 猛增,对上游业务无太大的感知(因为上游业务只生产音讯队列的数据,不会间接影响到机器性能)【削峰】

面试官 :嗯,那我想问下, 你感觉为什么音讯队列能到削峰?

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

候选者:音讯队列「最外围」的性能就是把生产的数据存储起来,而后给各个业务把数据再读取进去。

候选者:跟咱们解决申请时不一样:在业务解决时可能会调他人的接口,可能会须要去查数据库…等等等一系列的操作才行

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

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

候选者:咱们往一个 Topic 发送音讯或者读取音讯时,理论外部是多个 Partition 在解决【并行】

候选者:在存储音讯时,Kafka 外部是程序写磁盘的,并且利用了操作系统的缓冲区来进步性能【append+cache】

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

面试官 嗯,你既然提到缩小 CPU 拷贝文件的次数,能够给我说下这项技术吗?

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

候选者:比方咱们失常调用 read 函数时,会产生以下的步骤:

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

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

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

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

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

候选者:能够发现实现「一次读写」须要 2 次 DMA 拷贝,2 次 CPU 拷贝。而 DMA 拷贝是省不了的,所谓的零拷贝技术就是把 CPU 的拷贝给省掉

候选者:并且为了防止用户过程间接操作内核,保障内核平安,应用程序在调用零碎函数时,会产生上下文切换(上述的过程一共会产生 4 次)

面试官:…..

候选者:目前零拷贝技术次要有:mmap 和 sendfile,这两种技术会肯定水平下缩小上下文切换和 CPU 的拷贝

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

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

候选者:应用 mmap 的后一次读写就能够简化为:

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

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

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

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

面试官:嗯…

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

候选者:应用 sendfile+DMA Scatter/Gather 一次读写就能够简化为:

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

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

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

候选者:回到 Kafka 上

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

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

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

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

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

面试官:没错吧?

候选者:嗯

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

欢送关注我的微信公众号【Java3y】来聊聊 Java 面试

【对线面试官 - 挪动端】系列 一周两篇继续更新中!
【对线面试官 - 电脑端】系列 一周两篇继续更新中!

原创不易!!求三连!!

正文完
 0