Skip to content

![[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