Kafka专题 第一篇:背景知识

Kafka专题 第一篇:背景知识

Tags
kafka
CreatedAt
Jul 25, 2022 03:11 AM
这是关于Kafka系列文章的第一篇,写作的目的是为了:
  • 通过输出的方式来验证知识掌握程度,这也是「费曼学习法」中「以教为学」一种实践方式;
  • 由于人类大脑有着类似进化论中「用尽废退」的特征,也就是不经常使用的知识会变得模糊甚至遗忘,大体遵循艾宾浩斯遗忘曲线。所以,此系列文章会变成后续记忆回顾的索引或手册,帮助自己快速巩固记忆;
  • 一个人的认知可能存在偏差,分享出来可以适当收获知识盲区,甚至修正一些错误知识点;
  • 相反地,如果能顺便帮助到其他人,那也是好事一桩。同样为了尽量不误导他人,会逼迫自己更加严谨;
  • 最后一点:广而告之。通过技术分享进行能力辐射(秀肌肉),或许还能结识一些志同道合之人。

本篇文章先介绍下Kafka的一点背景知识,首先希望大家记住一点:「罗马不是一天建成的」。所有大的技术成果都是经过多次迭代演进过来的,如果我们能在最开始跟随这个技术一起成长,那我们也能清楚它的脉络,帮忙我们更好地理解这个技术背后的设计逻辑。
Kafka最开始是由LinkedIn开发的一个内部使用的基础设施,开发的原因是当时市面上没有适合的方案能帮助处理持续的数据流。这其实是很多大企业孵化项目的方式,就是解决企业所面临的问题,毕竟构建一个创新的解决方案,需要投入人力和成本。
幸运的是,Kafka并没有仅仅作为LinkedIn内部使用,它在2011年开源了,并于2012年10月从Apache孵化器成功毕业,正式成为Apache软件基金会的一员。Kafka这个名字则是由Jay Kreps(主要创作者之一)取自他喜欢的作家「Franz Kafka」而来。

使用场景

那为什么需要了解Kafka,它到底能用来做什么?
先看下目前Kafka官网给出的一个定义:
Apache Kafka is an open-source distributed event streaming platform used by thousands of companies for high-performance data pipelines, streaming analytics, data integration, and mission-critical applications. Apache Kafka 是一个开源分布式事件流平台,被成千上万的公司用于高性能数据管道、流分析、数据集成和任务关键型应用程序。
其中几个关键字说明了Kafka用途:
高性能数据管道、流分析、数据集成、任务关键型应用
但,这些词看起来都太专业了。我们来展开说说这些词的定义:
  • 数据管道:是一套工具集及处理流程,用于在源系统和目标存储库之间自动移动和转换数据。
    • 如下图所画的,它类似生活中自来水管道,我们从河流、湖泊或者大海等渠道提取的水,没办法直接使用,需要经过自来水公司一整套自动化设备处理过,之后输出到不同用途。
      notion image
      来一张更复杂的说明图:
  • 流分析:指对数据记录进行连续不断地处理和分析,而不是分批进行。它的前提是建立实时的数据流,然后才是数据分析。
  • 数据集成:指将来自整个组织的多个来源的数据整合在一起,为商业智能平台(BI)、数据分析和其他应用程序和业务流程提供完整、准确的数据集的过程。
  • 任务关键型应用:指对组织或业务运营至关重要的任务系统或应用,任何任务的中断或失败都会造成严重影响。所以保持连续稳定的运行非常关键。
如果仔细观察上面的描述,会发现这些用途是有一些联系的。比如,建立「数据管道」的最终目的其实是为了「数据集成」,同时「流分析」需要建立数据流,那也是「数据管道」实现方式中的一种。
不过上面的说明还是过于精炼,我们还是来看看目前比较流行的具体使用场景:
  • 传递消息
    • 传递消息可以说是最普遍的一个使用场景了,使用方式类似其他消息队列如ActiveMQ和RabbitMQ,目的大多是为了消息缓冲或者是解耦消息生产者和处理者。在此场景下,Kafka的优势在于更好的吞吐量及更好的容错机制。
  • 用户活动跟踪
    • 根据用户在前端的交互行为生成一组静态数据,以此发布特定主题,供后端应用读取后处理。这也是Kafka最早的使用场景。
  • 收集度量指标及日志记录
    • 多个不同应用程序或系统收集指标及日志,并定期向Kafka主题发布指标及日志,指标可以被系统用于监控和警报,日志则可以路由到Elasticsearch或安全分析应用程序等专用日志搜索系统。使用Kafka的好处在于如果需要替换目标系统,应用前端及聚合方式都无需改动。
  • 数据流处理
    • 结合使用Kafka Streams或其他流处理工具,从Kafka消费特定主题的消息后进行聚合或转换后发布到新的主题中,供后续处理。比如,计算每天最低和最高的股票交易价格并计算移动平均数。
  • 事件溯源
    • Kafka支持非常大的日志存储及分区有序性,可以把应用程序的状态变更作为一系列事件存储到Kafka,帮助后续需要追溯状态点变更过程的时候查看,甚至可以用来事件重放。
  • 日志提交
    • Kafka本身就是基于日志为中心来设计的,同时支持压缩,用来作为外部提交日志也是顺理成章的事情。比如把数据库的更新发布到Kafka,可用于数据库复制或者监控等。
虽然Kafka可以应用于以上的场景,但其实以上都有替代的解决方案,那为什么要使用它?
有几个原因:
  1. 高性能
  1. 支持多消费者和多生产者
  1. 基于磁盘的数据存储
  1. 灵活的伸缩性
  1. 平台优势:比如Kafka Connect和Kafka Streams
同时,如果需要多个以上提及的使用场景,那一开始选择一个解决方案总比组合多个来得简单。
图引用自「kafka权威指南」第一版
图引用自「kafka权威指南」第一版
图引用自「kafka权威指南」第一版
图引用自「kafka权威指南」第一版
notion image

架构设计简介

我们现在知道它能用来干什么,也知道了它有哪些优势。那现在我们会想:它是怎么做到这么「优秀」的?
要回答这个问题着实不易,因为它拥有现在所具备的优势,也是经过了不断优化迭代进化而来的。但,「大道至简」。Kafka有一个非常重要的核心设计理念:以日志为中心。
想想日志是用来做什么的。
它记录什么时间发生什么事情。
所以日志有两个重要特点:1. 完全按时间排序;2. 只能追加;
使用日志来作为事件的记录是非常贴切的,Kafka就是基于这个简单直接的概念来构建,但它并不是第一个这么做的。实际上日志在计算机科学上的使用已经十分广泛,只是它可能过于普遍以至于被大家忽视。比如MySQL数据库中使用的「两阶段提交」就是利用了Redo Log和Bin Log来实现数据一致性,其中Bin Log记录了数据状态变更过程,可用来故障恢复时重放,还可以用来作为复制同步。
另外我们这里所提及的日志并不是平时开发时使用的debug打印日志,它们俩有一个重要的区别:debug日志是结构化后打印出来供人阅读的,而这里所说的日志,是给编程或机器访问的。
显然如果只是以日志的形式记录数据,并不能促成Kafka的成功。技术的目的最终是为了解决现实中的实际问题,而在商业中除了能解决问题,还需要考虑最佳的「投入产出比」,也就是投入尽可能少的成本获取最佳的效益。所以作为一个分布式基础设施,「快」和「稳」都是重要的关注点。「快」是指高性能,当然性能是比较出来的,如果在这个问题领域只有这一个解决方案,那性能就很难估算了。「稳」则对应高可靠、高可用及高容错。
在Kafka 中使用了一些技巧来支持这些特性:
  • 对日志进行分区
  • 通过批处理读取和写入来优化吞吐量
  • 避免不必要的数据复制
除了以上几点,Kafka还有很多内部实现都做了优化。我们会在后面几篇系列文章中慢慢细说。在此之前,看下Kafka的基本架构图:
notion image
里面涉及几个「角色」,分别是生产者(Producer)、消费者(Consumer)、代理(Broker)以及ZooKeeper。