![[Pasted image 20230214101629.png]]
Kafka 入门
- 消息引擎基础
- Kafka 基本术语
- Kafka 角色定位
- Kafka 版本选择
Kafka 客户端
- 生产者
- 分区机制
- 压缩算法
- 无消息丢失配置
- 高级功能
- TCP 连接管理
- 幂等性生产者与事务
- 消费者
- 消费者组
- 位移主题 consumer_offsets
- 重平衡 Rebalance
- 位移提交
- 异常处理
- 多线程开发实例
- TCP 连接管理
- group 监控
Kafka 原理
- 备份机制
- 请求处理
- rebalacne 全流程解析
- Controller
- 高水位
Kafka 运维与监控
- 主题管理
- 动态配置
- 消费者组位移管理
- KafkaAdminClient
- 认证机制
- MirrorMarker
- 监控框架
- 授权管理
- Kafka 调优
- 流处理应用搭建实例
高级 Kafka 应用
- Kafka Streams
- Kafka DSL 开发
- 应用实例
当下(2019)互联网行业最火的技术当属 ABC 了:
- AI 人工智能
- BigData 大数据
- Cloud 云计算云平台
学习路径
① 掌握 Kafka 的第一步,就是要根据你掌握的编程语言去寻找对应的 Kafka 客户端。当前 Kafka 最重要的两大客户端是 Java 客户端和 libkafka 客户端,它们更新和维护的速度很快,非常适合你持续花时间投入。
② 去官网上学习一下代码示例,如果能够正确编译和运行这些样例,你就能轻松地驾驭客户端了。
③ 尝试修改样例代码尝试去理解并使用其他的 API,之后观测你修改的结果。如果这些都没有难倒你,你可以自己编写一个小型项目来验证下学习成果。
④ 改善和提升客户端的可靠性和性能了。
⑥ 熟读一遍 Kafka 官网文档,确保你理解了那些可能影响可靠性和性能的参数。
⑦ 学习 Kafka 的高级功能,比如流处理应用开发。流处理 API 不仅能够生产和消费消息,还能执行高级的流式处理操作,比如时间窗口聚合、流处理连接等。
Record
Kafka 消息编码格式:它使用的是 纯二进制的字节序列
消息引擎系统还要设定具体的传输协议(即我用什么方法把消息传输出去)
常见的有两种方法:
- 点对点模型:也叫消息队列模型。
- 发布 / 订阅模型:与上面不同的是,它有一个主题(Topic)的概念,你可以理解成逻辑语义相近的消息容器。该模型也有发送方和接收方,只不过提法不同。发送方也称为发布者(Publisher),接收方称为订阅者(Subscriber)。和点对点模型不同的是,这个模型可能存在多个发布者向相同的主题发送消息,而订阅者也可能存在多个,它们都能接收到相同主题的消息。生活中的报纸订阅就是一种典型的发布 / 订阅模型。
两大核心功能
- 削峰填谷
- 松耦合
持久化机制,追加写,顺序 I/O
磁盘回收,日志段 LogSegment
“重平衡”(Rebalance)
术语,关键词
消息:Record。Kafka 是消息引擎嘛,这里的消息就是指 Kafka 处理的主要对象。
主题:Topic。主题是承载消息的逻辑容器,在实际使用中多用来区分具体的业务。
分区:Partition。一个有序不变的消息序列。每个主题下可以有多个分区。
消息位移:Offset。表示分区中每条消息的位置信息,是一个单调递增且不变的值。
副本:Replica。Kafka 中同一条消息能够被拷贝到多个地方以提供数据冗余,这些地方就是所谓的副本。
副本还分为领导者副本和追随者副本,各自有不同的角色划分。
副本是在分区层级下的,即每个分区可配置多个副本实现高可用。
生产者:Producer。向主题发布新消息的应用程序。
消费者:Consumer。从主题订阅新消息的应用程序。
消费者位移:Consumer Offset。表征消费者消费进度,每个消费者都有自己的消费者位移。
消费者组:Consumer Group。多个消费者实例共同组成的一个组,同时消费多个分区以实现高吞吐。
重平衡:Rebalance。消费者组内某个消费者实例挂掉后,其他消费者实例自动重新分配订阅主题分区的过程。Rebalance 是 Kafka 消费者端实现高可用的重要手段。
![[Pasted image 20230214101958.png]]
特性
Kafka 在设计之初就旨在提供三个方面的特性:
- 提供一套 API 实现生产者和消费者
- 降低网络传输和磁盘存储开销
- 实现高伸缩性架构
流处理平台对比
作为 流处理 平台,kafka 与其他主流大数据流式计算框架相比
- 更容易实现端到端的正确性
- 更轻量,缺少类似集群调度、弹性部署等运维特性
Logi-KafkaManager
滴滴开源 https://github.com/didi/Logi-KafkaManager,是目前市面上最好用的一站式 Kafka 集群指标监控与运维管控平台,欢迎体验交流
Version of Kafka
2022-4-11:3.1.0 is the latest release. The current stable version is 3.1.0.
Kafka 的版本号:
![[Pasted image 20230214100928.png]]
前面的版本号是编译 Kafka 源代码的 Scala 编译器版本。
Kafka 服务器端的代码完全由 Scala 语言编写,Scala 同时支持面向对象编程和函数式编程,用 Scala 写成的源代码编译之后也是普通的“.class”文件,因此我们说 Scala 是 JVM 系的语言,它的很多设计思想都是为人称道的。
官网 download 页面可以看到全部的各个版本 release 信息:https://kafka.apache.org/downloads
Kafka 的版本号
- 0.7版本:只提供了最基础的消息队列功能。
- 0.8版本:引入了副本机制,至此Kafka成为了一个真正意义上完备的分布式高可靠消息队列解决方案。
- 0.9.0.0版本:增加了基础的安全认证/权限功能;使用ava重写了新版本消费者API;引入了Kafka Connect组件。
- 0.10.0.0版本:引入了Kafka Strcams,正式升级成分布式流处理平台。
- 0.11.0.0版木:提供了幂等性Producer API以及事务API;对Kafka消息格式做了重构。
- 1.0 和 2.0 版本:主要还是 Kafka Streams 的各种改进。
Config of Kafka
规划磁盘容量时你需要考虑下面这几个元素:
- 新增消息数
- 消息留存时间
- 平均消息大小
- 备份数
- 是否启用压缩
| 因素 | 考量点 | 建议 |
|---|---|---|
| 操作系统 | 操作系统I/O模型 | 将 Kafka 部署在 Linux 系统上 |
| 磁盘 | 磁盘 I/O 性能 | 普通环境使用机械磁盘,不需要搭建 RAID |
| 磁盘容量 | 根据消息数、留存时间预估磁盘容量 | 实际使用中建议预留 20% ~ 30% 的磁盘空间 |
| 带宽 | 根据实际带宽资源和业务 SLA 预估服务器数量 | 对于千兆网络,建议每台服务器按照 700Mbps来计算,避免大流量下的丢包 |
Kafka 集群配置 参数:
生产者消息分区机制原理剖析
- Kafka 的消息组织方式实际上是三级结构:主题-分区-消息。主题下的每条消息智慧保存在某一个分区中,而不会在多个分区中被保存多份。
- 分区是实现负载均衡以及高吞吐量的关键。
- 所谓分区策略,也就是决定生产者将消息发送到哪个分区的算法。Kafka 为我们提供了默认分区策略,同时也支持自定义分区策略。
- 比较常见的分区策略包括轮询策略、随机策略和按消息键保序策略。还有一种是基于地理位置的分区策略,但这种策略一般只针对那些大规模的 Kafka 集群,特别是跨城市、跨国家甚至是跨大洲的集群。
生产者压缩算法面面观
在 Kafka 中,压缩可能发生在两个地方:生产者端和 Broker 端。
让 Broker 重新压缩消息的两种例外情况:Broker 端指定了和 Producer 端不同的压缩算法;Broker 端发生了消息格式转换。
如果用一句话总结一下压缩和解压缩,Producer 端压缩,Broker 端保持、Consumer 端解压缩
对 Kafka 而言,这 4 中压缩算法的性能测试结果很一致:在吞吐量方面,LZ4 > Snappy > zstd 和 GZIP,在压缩比方面,zstd > LZ4 > GZIP > Snappy