之前我写了《Kafka入门教程轻松学》系列文章,半年来有1万多的阅读量,虽然不算很多,但看到很多朋友的支持,也给了我继续写下去的动力。接下来我会再写一个系列文章----《你绝对能看懂的Kafka源代码分析》,对Kafka源代码进行分析。文章还是延续之前的特色,采取形象的例子和图表帮助阅读者理解。

源代码阅读是一个难度很大,也比较枯燥的工作。所以这个系列文章持续时间会比较长,我有时间就会写一点。

目录:

《Kafka Producer设计分析》

《KafkaProducer类代码分析》

《RecordAccumulator类代码分析》

《Sender类代码分析》

《NetworkClient类代码分析》

------------------------------------------------

环境准备

在阅读Kafka源代码之前,需要做环境准备,我使用的是intelliJ IDEA,我们按照如下步骤操作:

1、下载Kafka源代码包https://www.apache.org/dyn/closer.cgi?path=/kafka/2.1.1/kafka-2.1.1-src.tgz

2、源代码根目录下运行gradle idea

3、启动IDEA,导入项目

现在你就在IDEA中查看Kafka的源代码了。

Producer源代码分析

Producer设计分析

客户端通过调用producer进行消息发送,这是消息的起源,所以我们最先分析Producer源代码。但如果一上来就切入代码,难免晦涩难以理解,在这里我先以生活中的例子作为开始,帮助理解Producer的设计理念。

我们举一个很常见的例子:发快递。为什么举这个例子呢,因为Kafka采用NIO通讯,如果大家学习过NIO,会知道经常用发快递来举例讲解NIO。另外发快递的场景确实也很像Kafka producer发送消息的场景。

快递公司一般是这样运作,由快递员上门取件,统一送回站点,站点进行分拣,同一个地区的包裹会装进一辆车,装满后发送出去。

在这个过程中,有如下几个角色

  1. 收件员,负责把快递运送回站点
  2. 分拣员,负责把快递按地区分类,比如唐山和秦皇岛,虽然具体的地址不一样但是都属于一个大区。
  3. 运输车,负责把快递运输出去,送到指定地区。

我们思考一下快递公司这样设计的好处

  1. 角色分工,收件员只负责收取快递,黏贴快递单,协助打包,然后送回站点。分拣员负责分类。运输车负责运输。分工明确,相互之间不需要知道对方在做什么。多人并行工作。
  2. 快递累积,分拣员把快递按地区分类,够一车后,发送出去。而不是收到一个件就发送出去。这是快递公司的通常做法,显然效率是更高的。然而实效性要求更高的闪送,则是收到一个件,马上发送出去,这样做是延迟最小的方式。
  3. 同区归并,真正发送的时候,唐山的快递和秦皇岛的快递会在一辆车发送出去,先统一发往河北总站。到达总站后再分车运往具体的城市。这样减少了发车的频次。如果唐山一车,秦皇岛一车,如果装不满一车,就会造成资源浪费,并且发车次数变多。

了解了快递公司的工作方式后,我们在宏观上看一下KafkaProducer的设计。

KafkaProducer的设计理念如出一辙,首先主线程把要发送的消息按照主题分区进行累积,达到一定数量后,触发发送线程进行发送。为了提高发送的效率,把发往同一个服务器的消息进行归并,一次性发往相应的服务器。

Producer设计中也有相应的角色:

  1. 收件员-KafkaProducer。实际除收件员外,它还承担了更多的工作。我们发送消息第一步就是调用KafkaProducer.send()方法
  2. 分拣员-RecordAccumulator。负责把消息按照分区分类,放入相应队列的ProducerBatch
  3. 运输车-Sender。负责运输,把消息真正发送出去。其实它内部还很复杂,通过NIO实现网络传输。

此外还有些相关类如下:

  1. ProducerBatch,每个ProducerBatch是一个信件箱,而同一个patition的信件箱码放在一起,程序中这就是Deque<ProducerBatch>
  2. ClientRequest,可以理解为运输车的货箱,在运输前,我们会把发往同一个服务器的消息放入ClientRequest,那么只需要发送一次ClientRequest,就可以把不同主题不同分区,但发往同一台服务器上的消息,一次性发送过去。

通过以上的讲解,Producer涉及到的主要类都已经进行了简单讲解,各自负责的事情也很清晰。下面我给出一张图,通过此图来讲解producer工作的主流程:

图中可以看到,有两个线程同时在工作,一个线程负责把消息送往消息站进行分组,另外一个线程负责把消息真正发送出去。

客户端发送消息时调用KafkaProducer的send方法。内部逻辑如下:

  1. 首先对消息进行加工,如序列化,选择分区等。
  2. 然后通过RecordAccumulator把加工好的消息放入相应的ProducerBatch中。
  3. 当batch满时,触发sender线程工作
  4. sender线程首先把batche从原列表中取出来,按照发往broker进行分组,然后封装到ClientRequest中
  5. 最后通过NIO的方式把ClientRequest发往相应的broker

至此,我们应该已经理解了Kafka Producer的设计思路。可见所有软件设计都来源于生活,都是对生活中的相应场景进行抽象和面向对象的设计。软件是无形的,但是实际生活中我们所采用的工作方式是有型的。通过参照实际生活场景和解决方案做软件的设计,让你的设计贴近实际场景,这样的代码写出来易于理解和扩展。

下一小节,我们将会深入每个方法中,分析在发送过程中发生了什么。

下一节《KafkaProducer类代码分析》

你绝对能看懂的Kafka源代码分析-Kafka Producer设计分析相关推荐

  1. 你绝对能看懂的Kafka源代码分析-RecordAccumulator类代码分析

    目录: <Kafka Producer设计分析> <KafkaProducer类代码分析> <RecordAccumulator类代码分析> <Sender类 ...

  2. 你绝对能看懂的Kafka源代码分析-KafkaConsumer类代码分析

    目录: <Kafka Producer设计分析> <KafkaProducer类代码分析> <RecordAccumulator类代码分析> <Sender类 ...

  3. 很简单能看懂阿里数据中台分析

    数据中台被誉为大数据的下一站,由阿里兴起,核心思想是数据共享,2015年阿里提出"大中台,小前台"的策略.2018 年因为"腾讯数据中台论",中台再度成为了人们 ...

  4. 一文看懂产品运营的分析方法

    面对一个产品的数据如何去分析?要关注哪些指标才能提高运营的效果? 说到产品运营,和用户行为分析,必须要提到AARRR模型.今天我从下面几个部分系统来聊聊: 第1部分:产品运营的分析方法:AARRR模型 ...

  5. 电视剧《赘婿》宁毅与乌家的岁布战没怎么看懂,可以细致分析一下吗?

    电视剧里绕了半天,其实几句话可以说清楚,和炒股一个道理. 宁毅和秦老关系好,掌握内幕消息--朝廷主战,将会停了岁贡,布匹股看跌.乌家这样的小散不知道,以为朝廷还会主和,增加岁贡,布匹股看涨. 宁毅这个 ...

  6. matlab中ode45如何设置,matlab 中ode45的源代码如何看懂

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 求常微分方程的数值解 ode45方法的源代码怎么看懂呢?四百多行 如何理解这些代码的核心思想 以方便未来自己使用呢?求大神指点迷津 感激不尽 functi ...

  7. matlab编程ode45,matlab 中ode45的源代码如何看懂

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 求常微分方程的数值解 ode45方法的源代码怎么看懂呢?四百多行 如何理解这些代码的核心思想 以方便未来自己使用呢?求大神指点迷津 感激不尽 functi ...

  8. 如何看懂源代码–(分析源代码方法)

    我们在写程式时,有不少时间都是在看别人的代码.例如看小组的代码,看小组整合的守则,若一开始没规划怎么看, 就会"噜看噜苦(台语) " 不管是参考也好,从开源抓下来研究也好,为了了解 ...

  9. 如何看懂源代码--(分析源代码方法) 1

    如何看懂源代码--(分析源代码方法)  -- 转载 作者: fandyst 出处: http://www.cnblogs.com/todototry/ 原文: https://www.cnblogs. ...

最新文章

  1. 程序员SQL都不会?能干啥?资深研发:别再瞎努力了!
  2. bootstrap的两种在input框后面增加一个图标的方式
  3. Pandas常用I/O(一)------read_csv(),read_table()
  4. nyoj 677 碟战(最大流最小割定理)
  5. 计算机课听课评议,听课优缺点评语
  6. PyTorch官方教程中文版:Pytorch之图像篇
  7. 5895. 获取单值网格的最小操作数
  8. 计算机应用基础 a卷,计算机应用基础笔试A卷.doc
  9. SpringCloud Eureka自我保护机制介绍及配置
  10. Pandas数据框索引函数 iloc、loc和ix学习使用
  11. 日记侠:如何提高朋友圈活跃度,给你5种实用方法
  12. 盘点 11 月份 火火火 的 GitHub 项目
  13. 手游辅助制作原理和学习思路
  14. 鼠标滚轮控制横向滚动条
  15. 格芯美国芯片厂项目或推迟;​云洲智能撤回IPO申请;节卡机器人完成近10亿元D轮融资 | 每日大事件...
  16. 2021.8.14【提高B组模拟6】T3 + P7527 [USACO21OPEN] United Cows of Farmer John (树状数组)
  17. Metal 框架之 MTKView
  18. 跟着老猫来搞GO——工欲善其事必先利器
  19. Windows程序以特定用户身份运行
  20. 三分钟深入TT猫之故障转移

热门文章

  1. 云计算进入多云时代 青云QingCloud如何帮企业做好多云管理?
  2. java matcher.group_详解正则表达式Matcher类中group方法
  3. python医疗系统代码_吴裕雄 人工智能 java、javascript、HTML5、python、oracle ——智能医疗系统WEB端初诊代码简洁版实现...
  4. mac os 10.8.5下 微信开发者工具安装问题
  5. 激活函数σ、tanh、relu、Leakyrelu、LR_BP反向传播推导
  6. 怎样在VS2005中添加Flash控件
  7. win7计算机组策略打不开,三个步骤解决win7系统本地组策略打不开的问题
  8. Android HIDL 简介
  9. vscode 添加新建文件夹快捷键 (配置 when 属性)
  10. 精读数据,2020年手机直播app制作备受瞩目的几大方向预测