阿里面试官问题,消息队列之Kafka,java实习生面试题

Kafka适合什么样的场景?

它可以用于两大类别的应用:

构造实时流数据管道,它可以在系统或应用之间可靠地获取数据。 (相当于message queue)构建实时流式应用程序,对这些流数据进行转换或者影响。 (就是流处理,通过kafka stream topic和topic之间内部进行变化

Kafka有四个核心的API:

The Producer API 允许一个应用程序发布一串流式的数据到一个或者多个Kafka topic。

The Consumer API 允许一个应用程序订阅一个或多个 topic ,并且对发布给他们的流式数据进行处理。

The Streams API 允许一个应用程序作为一个 流处理器 ,消费一个或者多个topic产生的输入流,然后生产一个输出流到一个或多个topic中去,在输入输出流中进行有效的转换。

The Connector API 允许构建并运行可重用的生产者或者消费者,将Kafka topics连接到已存在的应用程序或者数据系统。比如,连接到一个关系型数据库,捕捉表(table)的所有变更内容。

在这里插入图片描述

在Kafka中,客户端和服务器使用一个简单、高性能、支持多语言的 TCP 协议.此协议版本化并且向下兼容老版本, 我们为Kafka提供了Java客户端,也支持许多其他语言的客户端。

———————————————————————————————

以上摘自Apache Kafka官网

而本文关注的焦点是:构造实时流数据管道,即message queue部分。也就是我们常使用的“消息队列”部分,这部分本身也是Kafka最初及最基本的底层设计。

让我们回到最初Kafka还没有设计出来的时候,通过重新设计Kafka,一步步了解为什么Kafka是我们现在看到的样子,到时我们将了解到Kafka作为消息队列会高吞吐量、分布式、高容错稳定。我们把这个项目命名为: Kafka-R 。

现在我们开始设计 Kafka-R ,我们正式设计 Kafka-R 之前需要考虑设计目标,也就是我的 Kafka-R 设计出来到底是用来干嘛的,适用于什么业务场景,解决什么需求痛点。

可以很快想到:数据交换。这是消息队列的基本功能与要求。

然后呢?可以作为个大平台,支持多语言,最好能满足大公司的业务需求,而且最好是实时的,至少是低延迟。

概括起来就是:我们设计 Kafka-R 的目标是可以作为一个统一的平台来处理大公司可能拥有的所有实时数据馈送。

为了满足我们的 Kafka-R 的设计目标,那么 Kafka-R 需要具备以下这些特征:具有高吞吐量来支持高容量事件流。能够正常处理大量的数据积压,以便支持来自离线系统的周期性数据加载。系统必须处理低延迟分发,来处理更传统的消息传递用例。数据馈送分区与分布式,以及实时。系统在出现机器故障时能够保证容错。

一、数据的存储方式——in-memory&in-disk

有两种选择:第一种,使用in-memory cache,并在空间不足的的时候将数据flush到文件系统中。

另外一种,使用in-disk,一开始把所有的数据写入文件系统的持久化日志中。

我们的 Kafka-R 采用in-disk。实际上在此情况数据被转移到了内核的pagecache中。

“磁盘速度慢”是人们的普遍印象,那么 Kafka-R 的数据存储和缓存基于文件系统,这样的性能能够接受吗?

而事实是,磁盘的速度比人们预期的要慢得多,也快得多,取决于人们使用磁盘的方式。

我们知道磁盘有顺序读和随机读两种模式,之间的性能差异很大,但具体差距多少呢?

使用6个7200rpm、SATA接口、RAID-5的磁盘阵列在JBOD配置下的顺序写入的性能约为600MB/秒,但随机写入的性能仅约为100k/秒,相差6000倍。

线性的读取和写入是磁盘使用模式中最有规律的,并且操作系统进行了大量的优化。现代操作系统提供了read-ahead和write-behind技术,read-ahead是以大的data block为单位预先读取数据,而write-hehind将多个小型的逻辑写合并成一次大型的物理磁盘写入。

磁盘除了访问模式,还有两个低效率操作影响系统的性能:大量的小型I/O操作,过多的字节拷贝。

那么我们怎么处理这些问题呢?

针对于大量的小型I/O操作, Kafka-R 使用“消息块”将消息合理分组。使网络请求将多个消息打包成一组,而不是每次发送一条消息,从而使整组消息分担网络往返的开销。

另一个过多的字节拷贝, Kafka-R 使用producer,broker和consumer都共享的标准化通用的二进制消息格式,这样数据块不用修改就能在他们之间传递。

保持这种通用的格式有什么用呢?

可以对持久化日志块的网络传输进行优化。现代的unix操作系统提供了一个高度优化的编码方式,用于将数据从pagecache转移到socket网络连接中。

数据从文件到套接字的常见数据传输过程:磁盘->pagecache->用户空间缓存区->套接字缓冲区(内核空间)->NIC缓存区

  1. 操作系统从磁盘读区数据到内核空间的pagecache

  2. 应用程序读取内核空间的数据到用户空间的缓存区

  3. 应用程序将数据(用户空间的缓存区)写会内核空间到套接字缓冲区(内核空间)

  4. 操作系统将数据从套接字缓冲区(内核空间)复制到能够通过网络发送的NIC缓冲区

共进行了4次copy操作和2次系统调用,显然很低效。在Linux系统中使用zero-copy(零拷贝)优化,其中之一 sendfile ,使用后的数据传输过程是这样:磁盘->pagecache->NIC缓存区。

我们的Kafka-R通过使用zero-copy优化技术,可以用尽可能低的消费代价让多个consumer消费。数据在使用时只会被复制到pagecache中一次,这样消息能够以接近网络连接的速度上限进行消费。

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
img

总结

至此,文章终于到了尾声。总结一下,我们谈论了简历制作过程中需要注意的以下三个部分,并分别给出了一些建议:

  1. 技术能力:先写岗位所需能力,再写加分能力,不要写无关能力;
  2. 项目经历:只写明星项目,描述遵循 STAR 法则;
  3. 简历印象:简历遵循三大原则:清晰,简短,必要,要有的放矢,不要海投;

以及最后为大家准备的福利时间:简历模板+Java面试题+热门技术系列教程视频

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

)

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

  • 30
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值