本书详细介绍了Kafka与Pulsar的使用方式,并深入分析了它们的实现机制。通过阅读本书,读者可以快速入门和使用Kafka与Pulsar,并深入理解它们的实现原理。
本书通过大量实践示例介绍了Kafka与Pulsar的使用方式,包括管理脚本与客户端(生产者、消费者)的使用方式、关键的配置项、ACK提交方式等基础应用,以及安全机制、跨地域复制机制、连接器/流计算引擎、常用监控管理平台等高级应用。这些内容可以帮助读者深入掌握Kafka与Pulsar的使用方式,并完成日常管理工作。另外,本书深入分析了Kafka与Pulsar的实现原理,包括客户端(生产者、消费者)的设计与实现、Broker网络模型、主题(分区)分配与负载均衡机制,以及磁盘存储与性能优化方案、数据同步机制、扩容与故障转移机制。最后,本书介绍了Kafka与Pulsar的事务机制,并深入分析了Kafka事务的实现及Kafka最新的分布式协作组件KRaft模块。这部分内容可以帮助读者轻松理解Kafka与Pulsar的架构设计与实现原理。
1.基于Kafka和Pulsar最新版本2.对比分析了两个框架的架构设计与实现原理,此类图书目前是市场上的空白3.提供了众多的应用示例,既可以帮助读者由浅入深,理论与实践相结合,也可以帮忙读者全面掌握Kafka、Pulsar的操作,解决实际工作和学习中的问题
后端高级开发,源码爱好者,对Netty、Spring、Redis、Kafka、Pulsar等中间件有深入研究,技术公众号binecy作者。
前言
本书将向读者介绍两个优秀的分布式消息流平台:Kafka与Pulsar。Kafka使用Scala和Java编写,由LinkedIn公司开源,当下已成为最流行的分布式消息流平台之一。Kafka基于发布/订阅模式,具有高吞吐、可持久化、可水平扩展、支持流数据处理等特性。Pulsar是雅虎开源的“下一代云原生分布式消息流平台”,目前在快速发展中。Pulsar集消息、存储、轻量化函数式计算为一体,采用计算与存储分离架构设计,支持多租户、持久化存储、跨地域数据复制,具有强一致性、高吞吐、低延时及高可扩展性等流数据存储特性。
写作目的
在了解Kafka与Pulsar的特性与设计后,笔者被Kafka和Pulsar优秀的架构设计所吸引。实现一个分布式消息流平台,必须考虑数据分区(分片)、数据同步、数据自动均衡、分布式协作等问题。而针对这些问题,Kafka与Pulsar提供了非常优秀的设计方案,非常值得我们深入学习,所以笔者深入分析了Kafka与Pulsar这两个消息流平台,并编写了本书。
本书结构
本书从Kafka与Pulsar的基础概念切入,通过大量实践示例向读者展示Kafka与Pulsar的使用方式,以帮助读者日常使用、管理Kafka与Pulsar。另外,本书通过提取Kafka与Pulsar的核心代码(本书会尽量避免堆积代码),并配以适量图文,对Kafka与Pulsar的源码及实现逻辑进行了详细说明,从而带领读者阅读源码,帮助读者理解Kafka与Pulsar的设计思路和实现原理,还可以帮助读者在学习或设计其他分布式系统、存储系统时对这些设计思路融会贯通、触类旁通。
本书共5部分,由浅到深、循序渐进地分析了Kafka与Pulsar,如果读者对其中某个内容已经掌握,那么可以选择跳过这部分章节而阅读后面的内容。
第1部分对Kafka与Pulsar进行了基本介绍。第1章介绍了它们的特性与基础概念。第2章和第3章介绍了Kafka的部署、调试方式及基本应用。第4章和第5章介绍了Pulsar的部署、调试方式及基本应用。这部分内容可以帮助读者轻松入门和使用Kafka与Pulsar。
第2部分深入分析了Kafka与Pulsar的客户端和Broker计算层。第6章介绍了Kafka和Pulsar的架构设计,这一章是第2、第3部分的前提及概要。第7章分析了Kafka主题的创建流程、分区副本列表分配方案。第8章分析了Kafka客户端的实现,包括生产者消息批次机制,发送消息流程、消费者分区分配机制、读取消息流程。第9章分析了Broker处理读写请求流程,ACK偏移量管理机制、时间轮算法等内容,这些内容可以帮助读者理解Kafka如何设计主题、分区、客户端,并对消息进行管理。第10章介绍了Pulsar主题的实现,包括绑定主题流程、Broker负载均衡机制等。第11章和第12章分析了Pulsar客户端与Broker的实现,包括生产者发送消息流程、消费者订阅消息流程、Broker读写消息流程等内容,这些内容可以帮助读者理解Pulsar中计算层的设计和实现。
第3部分深入分析了Kafka与Pulsar存储层的设计和实现。第13章和第14章介绍了Kafka的数据存储机制,包括Broker本地的数据存储机制、磁盘存储设计与优化方案,以及leader、follow副本数据同步机制,帮助读者理解Kafka如何安全地存储一条消息。第15章介绍了Kafka的分布式协作机制,主要对KafkaController节点进行了分析,包括KafkaController选举机制、Broker故障转移流程,帮助读者理解Kafka如何实现可靠的分布式集群。第16章和第17章介绍了BookKeeper(Pulsar的存储组件)的实现原理,包括客户端的读写流程、故障转移机制,以及服务端WAL机制、数据读写流程、数据清理、恢复机制等内容,帮助读者理解BookKeeper如何实现一个可靠的、数据自动均匀分布的、高性能的分布式存储系统。
第4部分深入分析了Kafka的两个高级功能:事务与KRaft模块。第18章介绍了Kafka与Pulsar提供的事务机制。第19章深入分析了Kafka事务的实现原理。第20章介绍了Kafka最新提供的KRaft模块,KRaft模块使用Raft算法,安全地存储Kafka元数据,并管理Kafka集群。它可以简化Kafka运维工作,也是Kafka发展的重要方向。
第5部分介绍了Kafka与Pulsar的高级应用,包括利用TLS协议/认证鉴权机制保证数据安全、利用跨地域复制机制实现数据备份与容灾、Kafka与Pulsar常用的监控/管理平台、利用连接器实现流数据管道、利用流计算引擎构建轻量级的流计算应用等内容。这部分内容可以帮助读者更深入地掌握Kafka与Pulsar的使用方式,并完成日常管理工作。
表达约定
本书会按顺序在源码函数(或代码块)中添加标识,并在源码展示结束后,按标识对源码进行说明。例如:
void runOnce() {
...
long currentTimeMs = time.milliseconds();
// 【1】
long pollTimeout = sendProducerData(currentTimeMs);
// 【2】
client.poll(pollTimeout, currentTimeMs);
}
【1】调用Sender#sendProducerData方法发送消息,该方法会返回下一个快到期的批次的延迟时间。
【2】调用KafkaClient#poll方法阻塞当前线程,直到指定时间到期或者新的网络事件就绪。
源码中使用“...”代表此处省略了代码(有些地方省略了日志等辅助代码,但可能没添加“...”),这样可以保证源码展示的整洁,也方便读者阅读源码后,再结合书中说明深入理解相关内容。
另外,建议读者在阅读本书源码分析章节时,结合完整的Kafka与Pulsar源码进行理解。
注意,本书使用的源码版本是Kafka 3.0.0与Pulsar 2.8.0。如无特殊说明,本书提供的实践示例也是基于这两个版本的Kafka与Pulsar完成的。
勘误和支持
若读者在阅读本书的过程中有任何问题或者建议,可以关注笔者的公众号(binecy)与笔者交流。我们十分感谢并重视读者的反馈,会对读者提出的问题、建议进行梳理与反馈,并在本书后续版本中及时做出勘误与更新。
致谢
感谢Kafka与Pulsar的开源作者们,优秀的开源项目都离不开默默奉献力量的开源作者们。感谢电子工业出版社博文视点的陈晓猛编辑,陈编辑专业的写作指导和出版组织工作,使得本书得以顺利出版。感谢写作过程中身边朋友的支持,他们给予笔者很多的支持与力量。
梁国斌
有电子版吗