前言

看日期,今天都是4月了,这春招也差不多进入尾声了。

近期任有不少朋友都在找工作,很多人开始抱怨,工作可真难找啊!身边不少朋友问我咋搞呀,秋招都要结束了,工作还没着落呢…额…这个…今年是有点难啊。说实话,面试只是对个人技术及应变能力的一次考验。只有解决了一个问题,你才有机会遇见下一个问题。

这不,今天我总结了饿了么4面(Java岗)面经,问题如下,都是真真的经历,准备面试找工作的朋友可自行检测一下。

思考

前面提到 Kafka 帮我们实现了各个版本的生产者代码,其实他也可以完全不提供这份代码,因为核心的队列的功能已经实现了,这些客户端的代码也可以完全交由用户自己实现。

那么假如没有官方代码,我们又该实现一些什么功能,有哪些接口,哪些方法,以及如何组织这些代码呢。带着这样的问题我们一起来思考一下!一般对于这种带有数据流转的设计,我会从 由谁产生? 什么数据? 通往哪去? 如何保证通路可靠? 这几个方面来考虑。

消息自然是通过应用程序构造出来并提供给生产者,生产者首先要知道需要将消息发送到哪个 Broker 的哪个 Topic,以及 Topic 的具体 Partition 。那么必然需要配置客户端的 Broker集群地址 ,需要发送的 Topic 名称 ,以及 消息的分区策略 ,是指定到具体的分区还是通过某个 key hash 到不同的分区。

知道了消息要通往哪,还需要知道发送的是什么格式的消息,是字符串还是数字或是被序列化的二进制对象。 消息序列化 将需要消息序列化成字节数组才方便在网络上传输,所以要配置生产者的消息序列化策略,最好是可以通过传递枚举或者类名的方式自动构造序列化器,便于后续序列化过程的扩展。

消息队列常常用于多个系统之间的异步调用,那么这种调用关系就没有强实时依赖。由于发消息到 Kafka 会产生 网络 I/O ,相对来说比较耗时,那么消息发送这一动作除了同步调用, 是否也可以设置为异步,提高生产者的吞吐呢? 。并且大量消息发送场景, 我们可以设置一个窗口,窗口可以是时间维度也可以是消息数量维度,将消息积攒起来批次发送,减少网络 I/O 次数,提高吞吐量。

最后呢为了保证消息可以最大程度的成功发送到 Broker ,我们还需要一些 失败重试机制 ,例如失败后放到重试队列中,隔一段时间尝试再次发送。

理清思路

通过上面的分析,我们会有一个大致的认识,应该会有哪些方法,以及底层的大致的设计会分为哪几个部分。但是不够清楚,不够明晰。

首先总结一下实现客户端的几个要点在于:

  1. 配置 Broker 基础信息:集群地址、Topic、Partition

  2. 消息序列化,通过可扩展的序列化器实现

  3. 消息异步写入缓冲区,网络 I/O 线程实现消息发送

  4. 消息发送的失败重试机制

话不多说,用一张图画出各个核心模块以及他们之间的交互顺序:

用户设定 Kafka 集群信息,生产者从 Kafka Broker 上拉取 可用 Kafka 节点、Topic 以及 Partition 对应关系。缓存到生产者成员变量中,如果 Broker 集群有扩容,或者有机器下线需要重新获取这些服务信息。

客户端根据用户设置的序列化器,对消息进行序列化,之后异步的将消息写入到客户端缓冲区。缓冲区内的消息到达一定的数量或者到达一个时间窗口后,网络 I/O 线程将消息从缓冲区取走,发送到 Broker 。

以上就是我对于一个 Kafka 生产者实现的思考,接下来看看官方的代码设计与我们的思路有何差别,他又是为什么这么设计。

官方设计

其实经过上面的思考和整理,我们的设计已经非常接近 Kafka 的官方设计了,官方的模块拆分的更加细致,功能更加独立。

核心组件

首先看一眼 KafkaProducer 类中有哪些成员变量,这些变量就是 Producer 的核心组件。

其中核心字段的解释如下:

clinetId :标识发送者Id

metric :统计指标

partitioner :分区器作用是决定消息发到哪个分区。有 key 则按照 key 的 hash ,否则使用 roundrobin

key/value Serializer :消息 key/value 序列化器

interceptors :发送之前/后对消息的统一处理

maxRequestSize :可以发送的最大消息,默认值是1M,即影响一个消息 Record 的大小,此值在服务端也是有限制的。

maxBlockTimeMs :buffer满了或者等待metadata信息的,超时的补偿机制

accumulator :累积缓冲器

networkClient :包装的网络层

sender :网络 I/O 线程

发送流程

发送一条消息的时候,数据又是怎样在这些组件之间进行流转的呢?

Producer调用 send 方法后,在从 Broker 获取的 Metadata 有效情况下,经过拦截器和序列化后,被分区器放到了一个缓冲区的特定位置,缓冲区由一个 ConcurrentHashMap 构成,key 为主题分区,value 是一个 deque 存放消息缓存块。从客户端角度来看如果无需关心发送结果,发送流程就已经结束了。

接下来是独立的Sender线程负责从缓冲中获取足量的数据调用 Network Client 封装层去真正发送数据,这里使用了 Java8 的 NIO 网络模型发送数据。

可以看到整个逻辑的关键点在于 RecordAccumulator 如何进行消息缓存,一般的成熟框架和中间件中都会有一套自己的内存管理机制,比如 Netty 也有一套复杂而又精妙的内存管理抽象层,这里的缓冲区也是一样的道理,主要需要去看看 Kafka 如何去做内存管理。

另外需要关注 Sender 从缓冲里以什么样的逻辑获取数据,来达到尽量少的网络交互发送尽量多的数据。还有网络失败又是如何保证数据的可靠性的。这个地方也是我们的设计和官方实现的差距,对于网络 I/O 的精心优化。

目前的篇幅已经比较长了,为了大家方便阅读理解,本篇主要从和大家一起思考如何设计一个 Kafka Producer 以及官方是如何实现的,我们之间的差距是什么,更需要关注的点是什么。通过自己的思考和对比更加能认识到不足学习到新的点!

最后

给大家送一个小福利

资料都是免费分享的,附送高清脑图,高清知识点讲解教程,以及一些面试真题及答案解析。送给需要的提升技术、准备面试跳槽、自身职业规划迷茫的朋友们。点我免费领取!!!

茫的朋友们。点我免费领取!!!

[外链图片转存中…(img-nK2noQEW-1619314564677)]

2021年互联网大厂Java面经总结,保准看明白!相关推荐

  1. 太厉害了!2021年互联网大厂Java笔经

    开头 设计模式是一套被反复使用的.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了重用代码.让代码更容易被他人理解.保证代码可靠性.在项目中合理地运用设计模式可以完美地解决很多问题 ...

  2. 2021年互联网大厂的中秋仪式感

    中秋节快到了,就想起来去年互联网大厂的月饼礼盒大比拼,来给大家盘点一下2021年互联网大厂的中秋礼盒,等今年礼盒出了再一起看看,咱吃不到,就多看看~,提前祝大家中秋节快乐喔 目录 中秋礼盒

  3. 互联网大厂Java岗考点(阿里+百度+腾讯+字节跳动+美团+京东)

    本文扼要 本文结构主要分为以下三个部分: 01 互联网大厂考点(阿里+百度+腾讯+字节跳动+美团+京东) 02 Java 面试考点大全(基本功底+常用技术+技术深度+技术经验+学习能力+工作能力+项目 ...

  4. 2021 年互联网大厂职级对应薪资一览表

    来源:HR人力资源成长俱乐部转自:探数寻理 声明:本文数据部分来自所涉公司官方微信公众号(如:字节范儿),部分来自脉脉各公司职言区,另有部分知乎网友整理内容.除官微数据外,其他内容均来自网络,我们整理 ...

  5. 【重磅】2021年互联网大厂职级对应薪资一览表

    以BAT为代表的互联网大厂,一直是求职者眼中的香饽饽,"大厂经历"在国内就业环境中无异于一块金子招牌. 对于企业和HR来说,大厂的职级规则也是整个行业的标杆,从中小微企业到大型企业 ...

  6. 互联网大厂月饼哪家强?我看了之后,口水流了一地!

    请点击上面 一键关注! 每年的中秋月饼已经成为各互联网大厂争奇斗艳的重要阵地,从某种意义而言,月饼早已不仅仅是个饼,文案有没有创意,设计美不美观,看起来高不高级,用不用心......一块小小的月饼背后 ...

  7. java redis 批量删除key_互联网大厂Java工程师面试指南——Redis篇

    注意一下咯:更多关于Java集合.JVM.多线程并发.spring原理.微服务.Netty 与RPC .Kafka.日记.设计模式.Java算法.数据库.Zookeeper.分布式缓存.数据结构面试解 ...

  8. 互联网大厂java面试题一京东

    1.哪些情况下的对象会被垃圾回收机制处理掉? 利用可达性分析算法,虚拟机会将一些对象定义为 GCRoots,从 GCRoots 出发沿着引用链向下寻找,如果某个对象不能通过 GCRoots 寻找到,虚 ...

  9. 互联网大厂java面试题-阿里

    1.TCP 和 UDP 区别? l TCP 基于连接,UDP 基于无连接. l TCP 要求系统资源较多,UDP 较少. l UDP 程序结构较简单. l TCP 保证数据正确性,UDP 可能丢包. ...

最新文章

  1. 获取文件夹所占空间的大小
  2. C#-通过OpcUA监控设备
  3. 如何在 .NETCore 中修改 QueryString ?
  4. 如何对 Jenkins 共享库进行单元测试
  5. MyFlash使用总结
  6. CSS布局口诀 - CSS BUG顺口溜
  7. DateTime 格式相比较,timestampdiff() 函数的运用
  8. Win11cpu不支持怎么办,Win11cpu不支持解决方法
  9. Vue CLI 3.0 正式发布,Vue.js 开发标准化工具
  10. navicat编程界面_navicat for mysql使用方法
  11. 职业技能鉴定 八大工种 广州紧缺工种 培训考证
  12. Teechart 的用法详解:在VC6.0 跟Visual Studio 2005及之后版本的区别
  13. Speedoffice(word)如何绘制流程图
  14. 詹姆斯·格雷克《信息简史》读后感记录
  15. 打开office显示:你的office许可证有问题,你可能是盗版软件的受害者怎么办?
  16. oracle控制台转圈进不去,老鸟帮你win10输完密码一直转圈圈进不去的具体方法
  17. 图像在计算机中通过什么方式表示_线性代数在数据科学中的十大强大应用(二)...
  18. 分享抖音账号初期运营技巧,直接可复制的运营流程
  19. 上位机与下位机交互--让socket不死
  20. python怎么使用证书_Python使用系统SSL证书?

热门文章

  1. 绘图---PS使用教程总结(一)基本操作
  2. 网络营销人员21条基本能力要求
  3. 用聚合数据API快速写出小程序(苏州实时公交)
  4. 计算机存储器件中运行速度最快,选择题:下列存储器中,存取速度最快的是()...
  5. 逻辑与,逻辑或,逻辑非关系
  6. jmeter安装成功后打不开,提示:Cause: CannotResolveClassException: com.blazemeter.jmeter.threads.concurrency.Conc
  7. 史上最强《Java 开发手册》泰山版王者归来!
  8. git master 是啥?
  9. 跬步至千里:揭秘谷歌AutoML背后的渐进式搜索技术
  10. python itchat判断加入新新好友_python itchat 群好友助手