Kafka源码分析(一) - 概述
系列文章目录
https://zhuanlan.zhihu.com/p/367683572
一. 实际问题
我们在业务开发的过程中,会涉及很多“事件驱动”的场景,比如:
- 处理IoT设备上报的事件(如红外传感器检测到有人经过、温度传感器检测到温度变化等等);
- 实时监控金融用户的行为,识别可疑行为并作拦截处理;
- 对微服务进行监控,实时上报服务的异常情况;
这些场景有一个共同的模式:有一个“事件源”、需要实时处理“事件序列”。
那么问题来了,事件源通过什么方式上报数据?上报来的事件数据如何存储?如何实时感知新事件的产生并作处理?于是,Kafka应运而生。
二. 什么是Kafka, 如何解决这些问题的
Kafka官方的定义是
Apache Kafka is an open-source distributed event streaming platform.
即一个开源的、分布式的事件流处理平台。起初由LinkedIn公司(没错,就是领英)研发,用于处理数据管道的问题。后LinkedIn将其贡献给了Apache基金会,成为Apache的顶级项目之一。
Kafka采用"Producer -> Server -> Consumer"的业务模型来解决上文提到的实际问题:
- Producer:生产者,事件源通过该组件上报事件信息;
- Server:对上报来的事件数据作持久化存储,并通过精心设计的机制保证高吞吐量;
- Consumer:负责从Server端实时拉取事件数据,以执行相应的业务处理;
三. 基本原理
这里将通过“逐步引入”的方式向诸君阐述Kafka架构中的核心概念(基于Kafka 2.0版本)。更多细节将通过后续文章从源码层面给大家分析。
1. 基本框架
通过上文介绍,我们有了下图:

3类组件的职责不再赘述。
2. Topic
实际应用中,一个Kafka集群会承载很多类别的事件流。那么不同事件流之间如何作区分呢?实际上,Kafka使用"发布订阅模式"组织事件数据,为一类事件流分配一个主题(Topic)。Producer可将事件发到某个Topic下,Consumer可以订阅其感兴趣的Topic,从而可以处理对应的事件流。

3. Partition 和 Consumer Group
对于Kafka的目标场景,"高吞吐"是很必要的。而对于提高吞吐量,增加并行度是很常见的手段。在Kafka业务模型下体现在一个Topic允许多个Consumer同时消费数据。可是并行操作同一份数据的话,就需要完善的同步机制,而同步本身又不利于提高吞吐。所以,Kafka将一个Topic下的数据横向分成了多个"分区"(Partition),而每个Partition只允许一个Consumer来消费。那么如何决定将一个Partition分给哪个Consumer呢?Kafka引入了ConsumerGroup的概念,即将订阅同一个Topic的多个Consumer打成"组",然后在将Topic内的Parition通过一定的算法分配给组内的Consumer。

4. Replica
考虑一个问题,如果Parition对应的文件损坏,或者Partition所在机器下线,那是否就意味着这部分数据就丢失了?为了避免这类数据单点问题,Kafka引入了Replica(副本)的概念:
- 一个Partition的数据会同时保存N份,即N个Replica;
- Replica之间有"主从"之分,Producer将数据写入主Replica中,从Replica异步到主Replica拉数据以实现同步;
- Producer在产生数据时可以指定acks参数,表示本次写入需要有多少个从Replica完成同步才视为成功;
- 当主Replica损坏或宕机时,其中一个从Replica会被选举为主Replica;

5. Broker & KafkaController
到目前为止,我们都是将"服务端"视为一个整体,接下来就介绍下服务端节点组成。Kafka Server端有多个节点组成,每个节点都有一个名字叫Broker。其中一个Broker会被选举称为KafkaController,用于监测所有Broker的状态,发现故障后启动故障转移过程。例如,假设Broker_1上承载两个Replica,分别为Partition_1-1的主Replica和Partition_1-2的从Replica;若Broker_1宕机,KafkaController会将Broker_2上的Partition_1-1的从Replica提升为主Replica,使得集群可以继续对外提供服务。

五. 源码结构
1. 源码地址
- Kafka官方源码地址:https://github.com/apache/kafka
- 我也维护了一个"注释版"Kafka源码镜像,供诸君参考:
https://github.com/Hao1296/kafka (见note-hao分支,基于Kafka 2.0)
2. 目录结构
Kafka核心目录如下:
- clients: 客户端实现源码,包括Producer和Consumer
- core: 服务站实现源码
- connect: connector实现源码,用于执行Kafka数据的导入/导出
- stream: 流式计算相关源码
六. 总结
本文作为Kafka源码分析系列文章的概述,宏观简要介绍了下Kafka的基本原理,没有深入。更多细节会在后续文章中逐个分析。Kafka源码分析系列文章目录: https://www.cnblogs.com/zhanghao2244/p/14701269.html,欢迎诸君随时交流。
Kafka源码分析(一) - 概述的更多相关文章
- Kafka源码分析系列-目录(收藏不迷路)
持续更新中,敬请关注! 目录 <Kafka源码分析>系列文章计划按"数据传递"的顺序写作,即:先分析生产者,其次分析Server端的数据处理,然后分析消费者,最后再补充 ...
- Apache Kafka源码分析 – Broker Server
1. Kafka.scala 在Kafka的main入口中startup KafkaServerStartable, 而KafkaServerStartable这是对KafkaServer的封装 1: ...
- Kafka源码分析(三) - Server端 - 消息存储
系列文章目录 https://zhuanlan.zhihu.com/p/367683572 目录 系列文章目录 一. 业务模型 1.1 概念梳理 1.2 文件分析 1.2.1 数据目录 1.2.2 . ...
- kafka源码分析之一server启动分析
0. 关键概念 关键概念 Concepts Function Topic 用于划分Message的逻辑概念,一个Topic可以分布在多个Broker上. Partition 是Kafka中横向扩展和一 ...
- apache kafka源码分析-Producer分析---转载
原文地址:http://www.aboutyun.com/thread-9938-1-1.html 问题导读1.Kafka提供了Producer类作为java producer的api,此类有几种发送 ...
- Netty源码分析(前言, 概述及目录)
Netty源码分析(完整版) 前言 前段时间公司准备改造redis的客户端, 原生的客户端是阻塞式链接, 并且链接池初始化的链接数并不高, 高并发场景会有获取不到连接的尴尬, 所以考虑了用netty长 ...
- Kafka源码分析及图解原理之Producer端
一.前言 任何消息队列都是万变不离其宗都是3部分,消息生产者(Producer).消息消费者(Consumer)和服务载体(在Kafka中用Broker指代).那么本篇主要讲解Producer端,会有 ...
- Kafka源码分析(二) - 生产者
系列文章目录 https://zhuanlan.zhihu.com/p/367683572 目录 系列文章目录 一. 使用方式 step 1: 设置必要参数 step 2: 创建KafkaProduc ...
- Kafka源码分析-序列2 -Producer
在上一篇,我们从使用方式和策略上,对消息队列做了一个宏观描述.从本篇开始,我们将深入到源码内部,仔细分析Kafka到底是如何实现一个分布式消息队列.我们的分析将从Producer端开始. 从Kafka ...
随机推荐
- CCPC-2020 黑龙江省赛——Let’s Get Married
题意:~~ 思路:题目给出的数字太少了,我们多写几个,就会发现每层最左边的值等于1.2*k(k+1) ,k代表层数,找规律发现如果一个点的坐标为2.(x,y)且|a|+|b|=k,id<=2*k ...
- P1177【模板】快速排序(JAVA语言)
import java.util.Scanner; import java.util.ArrayList; import java.util.Collections; import java.util ...
- x64dbg 条件断点相关文档
输入 字符格式 条件断点 Input When using x64dbg you can often use various things as input. Commands Commands ha ...
- java例题_14 该日期一年中的第几天问题
1 /*14 [程序 14 求日期] 2 题目:输入某年某月某日,判断这一天是这一年的第几天? 3 程序分析:以 3 月 5 日为例,应该先把前两个月的加起来,然后再加上 5 天即本年的第几天,特殊情 ...
- 分享15个实用VSCode插件,快来收藏吧!
Visual Studio Code 是由微软开发的一款免费.跨平台的文本编辑器.它有卓越的性能和丰富的功能.VSCode 也有一个扩展和主题市场,为了帮助大家挑选出值得下载的插件,我们针对性的收集了 ...
- STM32内存结构介绍和FreeRTOS内存分配技巧
这是我第一次使用FreeRTOS构建STM32的项目,踩了好些坑,又发现了我缺乏对于操作系统的内存及其空间的分配的知识,故写下文档记录学习成果. 文章最后要解决的问题是,如何恰当地分配FreeRTOS ...
- 借鉴Elasticsearch 7.x 深入系列学习
开始 Elasticsearch 深入系列目录如下: Elasticsearch 7.x 深入 数据准备 Elasticsearch 7.x 深入[1]索引[一]原理 Elasticsearch 7. ...
- [2020年10月28日普级组]1408.MSWORLD
1408. M S W O R L D 1408.MSWORLD 1408.MSWORLD 题目描述 Bessie , Farmer John 的优选牛,刚刚获得了一个牛科动物选美比赛的冠军!并得到了 ...
- 并发编程-线程池&J.U.C
8. 共享模型之工具 8.1 线程池 池化技术相比大家已经屡见不鲜了,线程池.数据库连接池.Http 连接池等等都是对这个思想的应用.池化技术的思想主要是为了减少每次获取资源的消耗,提高对资源的利用率 ...
- Polly-故障处理和弹性应对很有一手
前言 对于运行中的系统,可以说百分百的小伙伴会经常遇见以下问题: 网络不通,突然又好了: 服务器宕机了: 调用服务接口超时了: 调用接口报错啦: 通讯信息发送失败需要重发: 以上只是列举了一些常遇到的 ...