前言

Apache Kafka(简称Kafka)最早是由LinkedIn开源出来的分布式消息系统,现在是Apache旗下的一个子项目,并且已经成为开源领域应用最广泛的消息系统之一。Kafka社区也非常活跃,从0.9版本开始,Kafka的标语已经从“一个高吞吐量、分布式的消息系统”改为“一个分布式的流平台”。

如何阅读本书

本书主要以0.10版本的Kafka源码为基础,并通过图文详解的方式分析Kafka内部组件的实现细节。对于Kafka流处理的一些新特性,本书也会分析0.11版本的相关源码。本书各章的主要内容如下。

第1章首先介绍了Kafka作为流式数据平台的3个组成,包括消息系统、存储系统和流处理系统,接着从分区模型、消费模型和分布式模型这三个模型介绍了Kafka的几个基本概念,然后介绍了Kafka几个比较重要的设计思路,最后讨论了如何在一台机器上模拟单机模式与分布式模式,以及如何搭建开发环境。

第2章从一个生产者的示例开始,引出了新版本生产者的两种消息发送方式。生产者客户端通过记录收集器和发送线程,对消息集进行分组和缓存,并为目标节点创建生产请求,发送到不同的代理节点。接着介绍了与网络相关的Kafka通道、选择器、轮询等NIO操作。另外,还介绍了Scala版本的旧生产者,它使用阻塞通道的方式发送请求。最后,介绍了服务端采用Reactor模式处理客户端的请求。

第3章首先介绍了消费者相关的基础概念,然后从一个消费者的示例开始,引出了基于ZooKeeper(后面简称ZK)的高级消费者API。要理解高级API,主要是要理解消费线程的模型以及变量的传递方式。接着介绍了消费者提交分区偏移量的两种方式。最后,我们举了一个低级API的示例。开发者需要自己实现一些比较复杂的逻辑处理,才能保证消费程序的健壮性和稳定性。

第4章介绍了新版本的消费者。不同于旧版本的消费者,新版本去除了ZK的依赖,统一了旧版本的高级API和低级API,并提供了两种消费方式:订阅和分配。新版本引入订阅状态来管理消费者的订阅信息,并使用拉取器拉取消息。新版本的消费者没有使用拉取线程,而是采用轮询的方式拉取消息,它的性能比旧版本的消费者更好。另外,还介绍了消费者采用回调器、处理器、监听器、适配器、组合模式和链式调用等实现不同类型的异步请求。最后,我们介绍了新消费者的心跳任务、消费者提交偏移量以及3种消息处理语义的使用方式。

第5章介绍了新版本消费者相关的协调者实现,主要包括“加入组”与“同步组”。每个消费者都有一个客户端的协调者,服务端也有一个消费组级别的协调者负责处理所有消费者客户端的请求。当消费组触发再平衡操作时,服务端的协调者会记录消费组元数据的变化,并通过状态机保证消费组状态的正常转换。本章会通过很多不同的示例场景来帮助读者理解消费组相关的实现。

第6章介绍了Kafka的存储层实现,包括读写、管理、压缩等一些常用的日志操作。服务端通过副本管理器处理客户端的生产请求和拉取请求。接着介绍了副本机制相关的分区、副本、最高水位、复制点等一些概念。最后,介绍了延迟操作接口与延迟缓存。服务端如果不能立即返回响应结果给客户端,会先将延迟操作缓存起来,直到请求处理完成或超时。

第7章介绍了作为服务端核心的Kafka控制器,它主要负责管理分区状态机和副本状态机,以及多种类型的监听器,比如代理节点上线和下线、删除主题、重新分配分区等。控制器的一个重要职责是选举分区的主副本。不同代理节点根据控制器下发的请求,决定成为分区的主副本还是备份副本。另外,我们还分析了本地副本与远程副本的区别,以及元数据缓存的作用。

第8章首先介绍了两种集群的同步工具:Kafka内置的MirrorMaker和Uber开源的uReplicator。接着,介绍了新版本Kafka提供的连接器框架,以及如何开发一个自定义的连接器。最后,介绍了连接器的架构模型的具体实现,主要包括数据模型、Connector模型和Worker模型。

第9章介绍了Kafka流处理的两种API:低级Processor API和高级DSL。这一章重点介绍了流处理的线程模型,主要包括流实例、流线程和流任务。我们还介绍了流处理的本地状态存储,它主要用来作为备份任务的数据恢复。高级DSL包括两个组件——KStream与KTable,它们都定义了一些常用的流处理算子操作,比如无状态的操作(过滤和映射等)、有状态的操作(连接和窗口等)。

第10章介绍了Kafka的一些高级特性,比如客户端的配额、新的消息格式和事务特性。本书相关的示例代码在笔者的GitHub主页https://github.com/zqhxuyuan/kafka-book上。另外,限于篇幅,本书的附录部分会放在个人博客上。此外,本书的源代码和附录部分也可以去图灵社区本书主页(http://www.ituring.com.cn/book/1927)免费下载。由于个人能力有限,文中的错误在所难免,如果读者在阅读的过程中,发现不妥之处,可以私信我的微博:http://weibo.com/xuyuantree,我会定期将勘误更新到个人博客上。

致谢

感谢图灵的编辑王军花老师,是您的辛勤工作让本书的出版成为可能。同时还要感谢许多我不知道名字的幕后工作人员为本书付出的努力。

感谢冯嘉、时金魁、吴阳平在百忙之中抽出时间给本书写推荐。

目录

  • 前言
  • 第1章 Kafka入门
  • 第2章 生产者
  • 第3章 消费者:高级API和低级API
  • 第4章 新消费者
  • 第5章 协调者
  • 第6章 存储层
  • 第7章 控制器
  • 第8章 基于Kafka构建数据流管道
  • 第9章 Kafka流处理 
  • 第10章 高级特性介绍