系列文章目录

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. dk.exe自动填报程序的反编译

    dk.exe自动填报程序的反编译 dk.exe用于学校每日健康报的自动填写.

  2. Hibernate Validator异常HV000221解决办法

    自建博客地址:https://www.bytelife.net,欢迎访问! 本文为博客同步发表文章,为了更好的阅读体验,建议您移步至我的博客 本文作者: Jeffrey 本文链接: https://w ...

  3. Pandas文件读取——Pandas.read_sql() 详解

    目录 一.函数原型 二.常用参数说明 三.连接数据库方式--MySQL ①用sqlalchemy包构建数据库链接 ②用DBAPI构建数据库链接 ③将数据库敏感信息保存在文件中 一.函数原型 panda ...

  4. 在linux系统中登录mysql时出现Enter password: ERROR 1045 (28000): Access denied for user 'debian-sys-maint'@'localhost' (using password: YES)的解决办法

    在一次使用mysql数据库是出现了这种错误,于是乎去百度看了很多博文踩了很多坑,最终解决了问题,分享给大家. 转载与:https://blog.csdn.net/css33/article/detai ...

  5. .NET初探源代码生成(Source Generators)

    前言 Source Generators顾名思义代码生成器,可进行创建编译时代码,也就是所谓的编译时元编程,这可让一些运行时映射的代码改为编译时,同样也加快了速度,我们可避免那种昂贵的开销,这是有价值 ...

  6. P1423_小玉在游泳(JAVA语言)

    题目描述 小玉开心的在游泳,可是她很快难过的发现,自己的力气不够,游泳好累哦. 已知小玉第一步能游2米,可是随着越来越累,力气越来越小, 她接下来的每一步都只能游出上一步距离的98%. 现在小玉想知道 ...

  7. js 日期加减

    加: console.log(moment().format("YYYY-MM-DD HH:mm:ss")); //当前时间 console.log(moment().add(10 ...

  8. 基于注解的springboot+mybatis的多数据源组件的实现

    通常业务开发中,我们会使用到多个数据源,比如,部分数据存在mysql实例中,部分数据是在oracle数据库中,那这时候,项目基于springboot和mybatis,其实只需要配置两个数据源即可,只需 ...

  9. 1.设置和验证MySQL数据库的隔离级别

    登录数据库 mysql -u root - p 新建用户,各启动一个事物,用于同时操作数据库表中数据 create user tom identified by 'tom'; 然后同时再用该用户启动M ...

  10. Spring Cloud & Alibaba 实战 | 第十二篇: 微服务整合Sentinel的流控、熔断降级,赋能拥有降级功能的Feign新技能熔断,实现熔断降级双剑合璧(JMeter模拟测试)

    目录 一. Sentinel概念 1. 什么是Sentinel? 2. Sentinel功能特性 3. Sentinel VS Hystrix 二. Docker部署Sentinel Dashboar ...