系列文章目录

https://zhuanlan.zhihu.com/p/367683572


一. 实际问题

我们在业务开发的过程中,会涉及很多“事件驱动”的场景,比如:

  1. 处理IoT设备上报的事件(如红外传感器检测到有人经过、温度传感器检测到温度变化等等);
  2. 实时监控金融用户的行为,识别可疑行为并作拦截处理;
  3. 对微服务进行监控,实时上报服务的异常情况;

这些场景有一个共同的模式:有一个“事件源”、需要实时处理“事件序列”。

那么问题来了,事件源通过什么方式上报数据?上报来的事件数据如何存储?如何实时感知新事件的产生并作处理?于是,Kafka应运而生。

二. 什么是Kafka, 如何解决这些问题的

Kafka官方的定义是

Apache Kafka is an open-source distributed event streaming platform.

即一个开源的、分布式的事件流处理平台。起初由LinkedIn公司(没错,就是领英)研发,用于处理数据管道的问题。后LinkedIn将其贡献给了Apache基金会,成为Apache的顶级项目之一。

Kafka采用"Producer -> Server -> Consumer"的业务模型来解决上文提到的实际问题:

  1. Producer:生产者,事件源通过该组件上报事件信息;
  2. Server:对上报来的事件数据作持久化存储,并通过精心设计的机制保证高吞吐量;
  3. 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(副本)的概念:

  1. 一个Partition的数据会同时保存N份,即N个Replica;
  2. Replica之间有"主从"之分,Producer将数据写入主Replica中,从Replica异步到主Replica拉数据以实现同步;
  3. Producer在产生数据时可以指定acks参数,表示本次写入需要有多少个从Replica完成同步才视为成功;
  4. 当主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. 源码地址

2. 目录结构

Kafka核心目录如下:

  • clients: 客户端实现源码,包括Producer和Consumer
  • core: 服务站实现源码
  • connect: connector实现源码,用于执行Kafka数据的导入/导出
  • stream: 流式计算相关源码

六. 总结

本文作为Kafka源码分析系列文章的概述,宏观简要介绍了下Kafka的基本原理,没有深入。更多细节会在后续文章中逐个分析。Kafka源码分析系列文章目录: https://www.cnblogs.com/zhanghao2244/p/14701269.html,欢迎诸君随时交流。

Kafka源码分析(一) - 概述的更多相关文章

  1. Kafka源码分析系列-目录(收藏不迷路)

    持续更新中,敬请关注! 目录 <Kafka源码分析>系列文章计划按"数据传递"的顺序写作,即:先分析生产者,其次分析Server端的数据处理,然后分析消费者,最后再补充 ...

  2. Apache Kafka源码分析 – Broker Server

    1. Kafka.scala 在Kafka的main入口中startup KafkaServerStartable, 而KafkaServerStartable这是对KafkaServer的封装 1: ...

  3. Kafka源码分析(三) - Server端 - 消息存储

    系列文章目录 https://zhuanlan.zhihu.com/p/367683572 目录 系列文章目录 一. 业务模型 1.1 概念梳理 1.2 文件分析 1.2.1 数据目录 1.2.2 . ...

  4. kafka源码分析之一server启动分析

    0. 关键概念 关键概念 Concepts Function Topic 用于划分Message的逻辑概念,一个Topic可以分布在多个Broker上. Partition 是Kafka中横向扩展和一 ...

  5. apache kafka源码分析-Producer分析---转载

    原文地址:http://www.aboutyun.com/thread-9938-1-1.html 问题导读1.Kafka提供了Producer类作为java producer的api,此类有几种发送 ...

  6. Netty源码分析(前言, 概述及目录)

    Netty源码分析(完整版) 前言 前段时间公司准备改造redis的客户端, 原生的客户端是阻塞式链接, 并且链接池初始化的链接数并不高, 高并发场景会有获取不到连接的尴尬, 所以考虑了用netty长 ...

  7. Kafka源码分析及图解原理之Producer端

    一.前言 任何消息队列都是万变不离其宗都是3部分,消息生产者(Producer).消息消费者(Consumer)和服务载体(在Kafka中用Broker指代).那么本篇主要讲解Producer端,会有 ...

  8. Kafka源码分析(二) - 生产者

    系列文章目录 https://zhuanlan.zhihu.com/p/367683572 目录 系列文章目录 一. 使用方式 step 1: 设置必要参数 step 2: 创建KafkaProduc ...

  9. Kafka源码分析-序列2 -Producer

    在上一篇,我们从使用方式和策略上,对消息队列做了一个宏观描述.从本篇开始,我们将深入到源码内部,仔细分析Kafka到底是如何实现一个分布式消息队列.我们的分析将从Producer端开始. 从Kafka ...

随机推荐

  1. android分析之Condition

    Condition的含义是条件变量,其实现依赖于系统,一般都要配合Mutex使用,使用步骤为:给mutex上锁(Lock),调用wait等待"条件"发生,如果没有发生则re-wai ...

  2. 最新版Swagger 3升级指南和新功能体验!

    Swagger 3.0 发布已经有一段时间了,它于 2020.7 月 发布,但目前市面上使用的主流版本还是 Swagger 2.X 版本和少量的 1.X 版本,然而作为一名合格的程序员怎么能不折腾新技 ...

  3. 让你的浏览器变成Siri一样的语音助手

    最近业余时间浏览技术文章的时候,看到了一篇关于语音朗读的文章:Use JavaScript to Make Your Browser Speak(用Javascript让你的浏览器说话),文章中提到可 ...

  4. 配置docker的pdflatex环境

    技术背景 Latex在文档撰写方面是不可或缺的工具,尤其是在写文章方面,是必须要用到的文字排版工具.但是latex的环境部署并不是一个特别人性化的操作,尤其是在各种不同的平台上操作是完全不一样的,还经 ...

  5. 2021精选 Java面试题附答案(一)

    1.什么是Java Java是一门面向对象的高级编程语言,不仅吸收了C++语言的各种优点,比如继承了C++语言面向对象的技术核心.还摒弃了C++里难以理解的多继承.指针等概念,,同时也增加了垃圾回收机 ...

  6. 2,turicreate入门 - 一个简单的回归模型

    turicreate入门系列文章目录 1,turicreate入门 - jupyter & turicreate安装 2,turicreate入门 - 一个简单的回归模型 3,turicrea ...

  7. E. 【例题5】生日相同

    解析 字符串操作,本题解采取了多关键词排序 Code #include <bits/stdc++.h> using namespace std; int f, n; struct node ...

  8. hadoop 简单安装部署

    hadoop第一课:虚拟机搭建和安装hadoop及启动 hadoop第二课:hdfs集群集中管理和hadoop文件操作 hadoop第三课:java开发hdfs hadoop第四课:Yarn和Map/ ...

  9. 关于Green AI

    上一篇文章提到了模型不环保这个话题.这篇文章就这个问题展开唠叨一下. 自从BERT, GPT此类的大型模型诞生以来,小作坊们除了把pre-trained的模型拿过来微调一下,就束手无策了,因为成本实在 ...

  10. 后端Spring Boot+前端Android交互+MySQL增删查改

    2021.1.27 更新 已更新新版本博客,更新内容很多,因此新开了一篇博客,戳这里. 1 概述 使用spring boot作为后端框架与Android端配合mysql进行基本的交互,包含了最基本的增 ...