当前位置: 首页 > news >正文

Kafka入门

前言

笔者使用过kafka处理通知,但是未系统学习kafka,因此认真学习一遍《Kafka核心技术与实战》这门课程。课程作者也是《Apache Kafka实战》这本书的作者。

00 开篇词 为什么要学习Kafka?

专栏的知识体系

在这里插入图片描述

  • 专栏的第一部分我会介绍消息引擎这类系统大致的原理和用途,以及作为优秀消息引擎代表的Kafka在这方面的表现。
  • 第二部分则重点探讨Kafka如何用于生产环境,特别是线上环境方案的制定。
  • 在第三部分中我会陪你一起学习Kafka客户端的方方面面,既有生产者的实操讲解也有消费者的原理剖析,你一定不要错过。
  • 第四部分会着重介绍Kafka最核心的设计原理,包括Controller的设计机制、请求处理全流程解析等。
  • 第五部分则涵盖Kafka运维与监控的内容,想获得高效运维Kafka集群以及有效监控Kafka的实战经验?我必当倾囊相助!
  • 最后一个部分我会简单介绍一下Kafka流处理组件Kafka Streams的实战应用,希望能让你认识一个不太一样的Kafka。

01 消息引擎系统ABC

聪明人也要下死功夫。

在2015年那会儿,我花了将近1年的时间阅读Kafka源代码,期间多次想要放弃。你要知道阅读将近50万行源码是多么痛的领悟。我还记得当初为了手写源代码注释,自己写满了一个厚厚的笔记本。不过幸运的是我坚持了下来,之前的所有努力也没有白费,以至于后面写书、写极客时间专栏就变成了一件件水到渠成的事情。

Apache Kafka是一款开源的消息引擎系统。。通俗来讲,就是系统A发送消息给消息引擎系统,系统B从消息引擎系统中读取A发送的消息。
消息引擎系统要设定具体的传输协议,即我用什么方法把消息传输出去,常见的方法有2种:点对点模型;发布/订阅模型。Kafka同时支持这两种消息引擎模型。
系统A不能直接发送消息给系统B,中间还要隔一个消息引擎呢,是为了“削峰填谷”。

02 一篇文章带你快速搞定Kafka术语

kafka实现高可用的手段:broker分布式部署、备份机制、重平衡。

Kafka定义了两类副本:领导者副本(Leader Replica)和追随者副本(Follower Replica)。前者对外提供服务,这里的对外指的是与客户端程序进行交互;而后者只是被动地追随领导者副本而已,不能与外界进行交互。当然了,你可能知道在很多其他系统中追随者副本是可以对外提供服务的,比如MySQL的从库是可以处理读操作的,但是在Kafka中追随者副本不会对外提供服务。

副本的工作机制也很简单:生产者总是向领导者副本写消息;而消费者总是从领导者副本读消息。至于追随者副本,它只做一件事:向领导者副本发送请求,请求领导者把最新生产的消息发给它,这样它能保持与领导者的同步。

什么是伸缩性呢?我们拿副本来说,虽然现在有了领导者副本和追随者副本,但倘若领导者副本积累了太多的数据以至于单台Broker机器都无法容纳了,此时应该怎么办呢?一个很自然的想法就是,能否把数据分割成多份保存在不同的Broker上?如果你就是这么想的,那么恭喜你,Kafka就是这么设计的。
Kafka中的分区机制指的是将每个主题划分成多个分区(Partition),每个分区是一组有序的消息日志。生产者生产的每条消息只会被发送到一个分区中,也就是说如果向一个双分区的主题发送一条消息,这条消息要么在分区0中,要么在分区1中。如你所见,Kafka的分区编号是从0开始的,如果Topic有100个分区,那么它们的分区号就是从0到99。

刚才提到的副本如何与这里的分区联系在一起呢?实际上,副本是在分区这个层级定义的。每个分区下可以配置若干个副本,其中只能有1个领导者副本和N-1个追随者副本。生产者向分区写入消息,每条消息在分区中的位置信息由一个叫位移(Offset)的数据来表征。分区位移总是从0开始,假设一个生产者向一个空分区写入了10条消息,那么这10条消息的位移依次是0、1、2、……、9。

至此我们能够完整地串联起kafka的三层消息架构:

  • 第一层是主题层(Topic),每个主题可以配置M个分区,而每个分区又可以配置N个副本。
  • 第二层是分区层(Partition),每个分区的N个副本中只能有一个充当领导者角色,对外提供服务;其他N - 1个副本是追随者副本,只能提供数据冗余之用。
  • 第三层是消息层(Record),分区中包含若干条消息,每条消息的位移从0开始,一次递增。

Kafka Broker是如何持久化数据的?总的来说,Kafka使用消息日志(Log)来保存数据,一个日志就是磁盘上一个只能追加写(Append-only)消息的物理文件。因为只能追加写入,故避免了缓慢的随机I/O操作,改为性能较好的顺序I/O写操作,这也是实现Kafka高吞吐量特性的一个重要手段。
为避免耗尽所有的磁盘空间,Kafka必然要定期地删除消息以回收磁盘。怎么删除呢?简单来说就是通过日志段(Log Segment)机制。在Kafka底层,一个日志有进一步细分成多个日志段,消息被追加写到当前最新的日志段中,当写满了一个日志段后,Kafka会自动切分出一个新的日志段,并将老的日志段封存起来。Kafka在后台还有定时任务会定期地检查老的日志段是否能够被删除,从而实现回收磁盘空间的目的。

术语总结

  • 消息:Record。Kafka是消息引擎嘛,这里的消息就是指Kafka处理的主要对象。
  • 主题:Topic。主题是承载消息的逻辑容器,在实际使用中多用来区分具体的业务。
  • 分区:Partition。一个有序不变的消息序列。每个主题下可以有多个分区。
  • 消息位移:Offset。表示分区中每条消息的位置信息,是一个单调递增且不变的值。
  • 副本:Replica。Kafka中同一条消息能够被拷贝到多个地方以提供数据冗余,这些地方就是所谓的副本。副本还分为领导者副本和追随者副本,各自有不同的角色划分。副本是在分区层级下的,即每个分区可配置多个副本实现高可用。
  • 生产者:Producer。向主题发布新消息的应用程序。
  • 消费者:Consumer。从主题订阅新消息的应用程序。
  • 消费者位移:Consumer Offset。表征消费者消费进度,每个消费者都有自己的消费者位移。
  • 消费者组:Consumer Group。多个消费者实例共同组成的一个组,同时消费多个分区以实现高吞吐。
  • 重平衡:Rebalance。消费者组内某个消费者实例挂掉后,其他消费者实例自动重新分配订阅主题分区的过程。Rebalance是Kafka消费者端实现高可用的重要手段。

在这里插入图片描述

03 Kafka只是消息引擎系统吗?

Kafka在设计之初就旨在提供三个方面的特性:

  • 提供一套API实现生产者和消费者;
  • 降低网络传输和磁盘存储开销;
  • 实现高伸缩性架构。

Kafka流处理框架地位。Kafka与其他主流大数据流式计算框架相比,优势有两点:更容易实现端到端的正确性;它自己对于流式计算的定位。
Apache Kafka是消息引擎系统,也是一个分布式流处理平台。除此之外,Kafka还能够被用作分布式存储系统(了解即可,无实际运用)。

04 我应该选择哪种Kafka?

  • Apache Kafka,是开发人数最多、版本迭代速度最快的Kafka。如果你仅仅需要一个消息引擎系统抑或是简单的流处理应用场景,同时需要对系统有较大把控度,那么我推荐你使用Apache Kafka。
  • Confluent Kafka,目前分为免费版和企业版两种。企业版提供了很多功能,最有用的当属跨数据中心备份和集群监控了。如果你需要用到Kafka的一些高级特性,那么推荐你使用Confluent Kafka。
  • CDH/HDP Kafka,如果你需要快速地搭建消息引擎系统,或者你需要搭建的是多框架构成的数据平台且Kafka只是其中一个组件,那么我推荐你使用这些大数据云公司提供的Kafka。

05 聊聊Kafka的版本号

  • 0.7版本:只提供了最基础的消息队列功能。
  • 0.8版本:引入了副本机制,至此Kafka成为了一个真正意义上完备的分布式高可靠消息队列解决方案。
  • 0.9.0.0版本:增加了基础的安全认证/权限功能;使用Java重写了新版本消费者API;引入了Kafka Connect组件。
  • 0.10.0.0版本:引入了Kafka Streams,正式升级成分布式流处理平台。
  • 0.11.0.0版本:提供了幂等性ProducerAPI以及事务API;对Kafka消息格式做了重构。
  • 1.0和2.0版本:主要还是KafkaStreams的各种改进。
http://www.xdnf.cn/news/1399159.html

相关文章:

  • 开源 C++ QT Widget 开发(八)网络--Http文件下载
  • 《微服务架构从故障频发到自愈可控的实战突围方案》
  • CSDN博客语法(不常用但有用)
  • 谷歌 “Nano Banana“ 深度解析:AI 图像的未来是精准编辑,而非从零生成
  • ⚡ Linux find 命令参数详解
  • MySQL基础理解入门
  • 嵌入式硬件电路分析---AD采集电路
  • Spring Boot 自动配置原理深度解析:从启动流程到监听机制
  • 【Java EE进阶 --- SpringBoot】Spring Web MVC(Spring MVC)(二)
  • 设计模式之代理模式!
  • 深度学习基础:前馈网络、反向传播与梯度问题
  • 基于IEC61499开放自动化PLC数据储存方案
  • 在 WSL2-NVIDIA-Workbench 中安装Anaconda、CUDA 13.0、cuDNN 9.12 及 PyTorch(含完整环境验证)
  • 第 8 篇:量化交易之tradeUI和webserverUI 区别?
  • 系统分析师考试大纲新旧版本深度分析与备考策略
  • 捡捡java——2、基础07
  • 开发指南136-设置零值不显示
  • vue中的与,或,非
  • Ansible 核心运维场景落地:YUM 仓库、SSH 公钥、固定 IP 配置技巧
  • [Windows] 剪映国际版CapCut 6.7.0 视频编辑处理,免费使用素材和滤镜
  • 拼团小程序源码分享拼团余额提现小程序定制教程开发源码二开
  • LeetCode 136. 只出现一次的数字
  • [论文阅读] 人工智能 + 软件工程 | 从“法律条文”到“Gherkin脚本”:Claude与Llama谁更懂合规开发?
  • 普蓝自研AutoTrack-4X导航套件平台适配高校机器人实操应用
  • k8s(自写)
  • docker安装Prometheus和Grafana 监控界面
  • 为多种业态注入智能化发展新活力的智慧地产开源了
  • 从Java全栈开发视角看企业级应用架构设计与实践
  • C++转置正方形矩阵
  • 掌握表单:React中的受控组件与表单处理