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 ...
随机推荐
- for-in 语句
for-in 语句循环专门用于遍历范围,列表,元素和字典等可迭代对象. 循环中的变量的值受for-in循环控制,该变量将会在每次循环开始时自动被赋值,因此程序不应该在循环中对该变量进行赋值 for-i ...
- PTA 中序输出叶子结点
6-8 中序输出叶子结点 (10 分) 本题要求实现一个函数,按照中序遍历的顺序输出给定二叉树的叶结点. 函数接口定义: void InorderPrintLeaves( BiTree T); T ...
- SQL排名问题,100% leetcode答案大公开!
(首先原谅我最近新番看多了,起了一个中二的名字) 最近在找实习,所以打算系统总结(复习)一下sql中经常遇到问题.不管是刷leetcode还是牛客的sql题,有一个问题总是绕不开的,那就是排名问题.其 ...
- ElasticSearch实战系列十: ElasticSearch冷热分离架构
前言 本文主要介绍ElasticSearch冷热分离架构以及实现. 冷热分离架构介绍 冷热分离是目前ES非常火的一个架构,它充分的利用的集群机器的优劣来实现资源的调度分配.ES集群的索引写入及查询速度 ...
- 敏捷史话(十二):你现在接触的敏捷也许是“黑暗敏捷”——Ron Jeffries
他很少提起往事,也不再提及二十年前那场引起软件行业变革的会议,他专注于当下,一直活跃在敏捷领域.八十多岁的他依然运营维护着网站和博客,是极限编程网站 XProgramming.com 的作者,该网站是 ...
- SqlServer游标的创建与使用
前言 大家都对SqlServer视图.存储过程.触发器的创建与使用有一定的了解了,我们来看下什么是游标,怎么使用,什么时候用. SqlServer视图的创建与使用 SqlServer存储过程的创建与使 ...
- [Fundamental of Power Electronics]-PART I-5.不连续导电模式-5.4 总结与重点
5.4 总结与重点 基本的buck,boost以及buck-boost电路的特点总结在表5.2中.其中给出了\(K_{crit}(D)\)的表达式,CCM和DCM下的变换比,以及DCM下二极管导通占空 ...
- Dynamics CRM证书更换
Dynamics CRM产品一般有两种认证方式.第一种是基于声明的内部访问也就是无证书单纯用账号密码验证.第二种就是联合身份认证,需要安装网站证书. 对于联合身份认证的情况因为需要安装证书,而且证书是 ...
- OO第二单元作业——魔鬼电梯
简介 本单元作业分为三次 第一次作业:第一次作业要实现单部简单电梯,停靠所有楼层,无载客容量,性能分考量电梯运行时间. 第二次作业: 第二次作业实现多部电梯,电梯数量由初始化设定,每部电梯都停靠所有楼 ...
- PAT A1032 Sharing
题意:给出两条链表的首地址以及若干节点的地址,数据,下一个节点的地址,求两条链表的首个共用节点的地址.如果两条链表没有共用节点,则输出-1.思路步骤1:由于地址的范围很小,因此可以直接用静态链表,但是 ...