科技>计算机>网络与互联网
深入理解Kafka与Pulsar:消息流平台的实践与剖析  

深入理解Kafka与Pulsar:消息流平台的实践与剖析  "

作者:梁国斌
ISBN:9787121440014
定价:¥138.0
字数:644千字
页数:460
出版时间:2022-08
开本:16开
版次:01-01
装帧:
出版社:电子工业出版社
简介

本书详细介绍了Kafka与Pulsar的使用方式,并深入分析了它们的实现机制。通过阅读本书,读者可以快速入门使用Kafka与Pulsar,并深入理解它们的实现原理。 本书通过大量实践示例介绍了Kafka与Pulsar的使用方式,包括管理脚本与客户端(生产者、消费者)的使用方式、关键的配置项、ACK提交方式等基础应用,以及安全机制、跨地域复制机制、连接器/流计算引擎、常用监控管理平台等高级应用。这些内容可以帮助读者深入掌握Kafka与Pulsar的使用方式,并完成日常管理工作。另外,本书深入分析了Kafka与Pulsar的实现原理,包括客户端(生产者、消费者)的设计与实现、Broker网络模型、主题(分区)分配与负载均衡机制,以及磁盘存储与性能优化方案、数据同步机制、扩容与故障转移机制。最后,本书介绍了Kafka与Pulsar的事务机制,并深入分析了Kafka事务的实现及Kafka最新的分布式协作组件KRaft模块。这部分内容可以帮助读者轻松理解Kafka与Pulsar的架构设计与实现原理。

前言

前言 本书将向读者介绍两个优秀的分布式消息流平台: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的开源作者们,优秀的开源项目都离不开默默奉献力量的开源作者们。感谢电子工业出版社博文视点的陈晓猛编辑,陈编辑专业的写作指导和出版组织工作,使得本书得以顺利出版。感谢写作过程中身边朋友的支持,他们给予笔者很多的支持与力量。 梁国斌

目录

第1部分 基础应用 第1章 Kafka与Pulsar概述 1.1 简介 1.2 特性 1.3 概念 1.3.1 Kafka基础概念 1.3.2 Pulsar基础概念 1.4 本章总结 第2章 Kafka的部署与调试 2.1 安装Kafka集群 2.1.1 部署ZooKeeper集群 2.1.2 部署Kafka集群 2.2 调试Kafka 2.3 本章总结 第3章 Kafka的应用 3.1 脚本 3.1.1 主题管理 3.1.2 生产者与消费者 3.1.3 动态配置 3.2 客户端 3.2.1 生产者 3.2.2 消费者 3.3 消息序列化 3.4 配额 3.5 本章总结 第4章 Pulsar的部署与调试 4.1 本地部署 4.2 集群部署 4.2.1 ZooKeeper集群部署 4.2.2 初始化集群元数据 4.2.3 部署BookKeeper集群 4.2.4 部署Pulsar Broker 4.3 调试Pulsar 4.3.1 调试Pulsar Broker源码 4.3.2 调试BookKeeper 4.4 本章总结 第5章 Pulsar的应用 5.1 租户 5.2 命名空间 5.2.1 消息保留和过期 5.2.2 持久化策略 5.2.3 消息投递速率 5.3 主题 5.3.1 创建主题 5.3.2 发送、消费消息 5.3.3 管理主题 5.4 客户端 5.4.1 生产者 5.4.2 消费者 5.5 Schema 5.5.1 Schema的类型与使用示例 5.5.2 Schema演化与兼容 5.5.3 管理Schema 5.6 资源隔离 5.6.1 Broker隔离 5.6.2 Bookie隔离 5.7 兼容Kafka客户端 5.8 BookKeeper使用示例 5.9 本章总结 第2部分 客户端与Broker计算层 第6章 Kafka和Pulsar的架构 6.1 ZooKeeper的作用 6.2 Kafka的架构设计 6.2.1 元数据管理 6.2.2 发布/订阅模式 6.2.3 磁盘存储的设计与优化 6.2.4 数据副本 6.2.5 系统伸缩 6.2.6 故障转移 6.3 Pulsar的架构设计 6.3.1 Pulsar的计算层 6.3.2 Pulsar的存储层 6.3.3 系统伸缩 6.3.4 故障转移 6.4 源码架构 6.4.1 Kafka 6.4.2 Pulsar 6.4.3 BookKeeper 6.5 本章总结 第7章 Kafka的主题 7.1 CreateTopics请求的处理流程 7.1.1 创建主题 7.1.2 分区副本分配规则 7.1.3 存储主题元数据 7.2 KafkaController处理新主题 7.3 本章总结 第8章 Kafka的生产者与消息发布 8.1 生产者发送消息 8.1.1 消息发送流程 8.1.2 消息累积器与消息批次 8.1.3 Sender线程 8.1.4 TCP通信协议 8.1.5 元数据刷新机制 8.2 Broker接收消息 8.2.1 Broker处理消息流程 8.2.2 延迟操作与时间轮 8.3 本章总结 第9章 Kafka的消费者与消息订阅 9.1 消费组协作机制 9.1.1 分区分配器 9.1.2 重平衡的设计 9.1.3 实战:使用CooperativeStickyAssignor分区分配器 9.1.4 重平衡的实现 9.2 心跳与元数据更新 9.3 ACK管理 9.3.1 消费者初始化偏移量 9.3.2 ACK偏移量的提交与存储 9.4 读取消息 9.4.1 消费者发送Fetch请求 9.4.2 Broker处理Fetch请求 9.5 本章总结 第10章 Pulsar的主题 10.1 租户与命名空间 10.2 主题 10.2.1 创建主题 10.2.2 初始化主题 10.2.3 绑定主题 10.3 Broker负载均衡 10.3.1 负载报告上传 10.3.2 为bundle选择Broker节点 10.4 bundle管理 10.4.1 选举leader节点 10.4.2 bundle卸载机制 10.4.3 bundle切分机制 10.5 本章总结 第11章 Pulsar的生产者与消息发布 11.1 生产者发送消息 11.1.1 初始化生产者 11.1.2 生产者发送消息流程 11.2 Broker处理消息 11.2.1 写入消息 11.2.2 切换Ledger 11.3 本章总结 第12章 Pulsar的消费者与消息订阅 12.1 消费者订阅消息 12.1.1 消费者的初始化 12.1.2 接收消息 12.1.3 确认超时与取消确认 12.2 Broker读取与推送消息 12.2.1 处理Subscribe请求 12.2.2 推送消息 12.3 ACK机制 12.3.1 ACK机制的设计 12.3.2 ACK机制的实现 12.4 消息清除 12.4.1 历史消息清除 12.4.2 清除backlog消息 12.4.3 清除过期数据 12.5 本章总结 第3部分 分布式数据存储 第13章 Kafka存储机制与读写流程 13.1 数据存储机制的设计 13.2 消息写入流程 13.3 消息读取流程 13.4 日志管理 13.4.1 日志加载 13.4.2 日志刷盘 13.4.3 数据清理 13.4.4 数据去重 13.5 本章总结 第14章 Kafka主从同步 14.1 成为leader/follow副本 14.2 follow副本同步流程 14.2.1 同步流程与数据一致性 14.2.2 LeaderEpoch机制 14.2.3 follow副本拉取消息 14.3 leader副本更新 14.3.1 更新ISR集合 14.3.2 更新高水位 14.4 本章总结 第15章 Kafka分布式协同 15.1 KafkaController选举 15.1.1 KafkaController元数据 15.1.2 ControllerEpoch机制 15.1.3 选举流程 15.2 ZooKeeper监控机制 15.3 故障转移 15.3.1 分区、副本状态机 15.3.2 分区状态切换流程 15.3.3 副本状态切换流程 15.4 实战:Preferred Replica重平衡 15.5 实战:增加分区数量 15.6 实战:Kafka集群扩容 15.7 本章总结 第16章 BookKeeper客户端 16.1 客户端设计 16.2 客户端写入 16.2.1 Ledger创建流程 16.2.2 数据写入流程 16.2.3 处理写入结果 16.2.4 故障转移 16.2.5 LAC上报 16.2.6 限制生产者数量 16.3 客户端读取 16.3.1 消费者读取数据 16.3.2 客户端Recover 16.4 本章总结 第17章 BookKeeper服务端 17.1 Bookie设计 17.2 Bookie写入流程 17.2.1 Bookie初始化 17.2.2 Journal写入流程 17.2.3 Ledger写入流程 17.2.4 Ledger的数据存储格式 17.3 Bookie读取数据 17.4 Bookie数据清除 17.5 Bookie Recovery 17.5.1 Auditor 17.5.2 ReplicationWorker 17.6 本章总结 第4部分 事务与KRaft模块 第18章 Kafka与Pulsar事务概述 18.1 为什么需要事务 18.1.1 幂等发送 18.1.2 事务保证 18.2 Kafka事务应用示例 18.3 Pulsar事务应用示例 18.4 本章总结 第19章 Kafka事务的设计与实现 19.1 Kafka的事务设计 19.2 事务初始化流程 19.2.1 事务定义 19.2.2 生产者初始化事务 19.2.3 生产者启动事务 19.3 事务消息发送与处理流程 19.3.1 事务分区发送与处理流程 19.3.2 生产者发送事务消息 19.3.3 Broker处理事务消息 19.3.4 ACK偏移量发送与处理流程 19.4 事务提交流程 19.4.1 生产者提交事务 19.4.2 协调者完成事务 19.5 本章总结 第20章 KRaft模块概述 20.1 为什么要移除ZooKeeper 20.2 部署与调试KRaft模块 20.3 Raft算法 20.3.1 leader选举 20.3.2 日志复制 20.3.3 安全性 20.4 本章总结 第21章 KRaft模块的设计与实现原理 21.1 KRaft请求处理流程 21.1.1 Raft状态 21.1.2 Raft请求类型 21.1.3 处理Raft请求 21.2 KRaft leader选举机制 21.2.1 初始化Raft状态 21.2.2 发送投票请求 21.2.3 投票流程 21.2.4 当选leader节点 21.3 KRaft生成Record数据 21.4 KRaft数据存储机制 21.5 KRaft数据同步机制 21.6 KRaft提交Record数据 21.6.1 监听器机制 21.6.2 BrokerMetadataListener 21.6.3 QuorumMetaLogListener 21.7 KRaft节点监控与故障转移机制 21.7.1 节点注册 21.7.2 心跳请求 21.7.3 故障转移 21.8 KRaft数据清理机制 21.8.1 快照管理 21.8.2 历史数据清理 21.9 本章总结 第5部分 高级应用 第22章 安全 22.1 TLS加密 22.1.1 准备TLS证书和密钥 22.1.2 Kafka配置 22.1.3 Pulsar配置 22.2 认证与授权 22.2.1 Kafka SCRAM认证与授权 22.2.2 Pulsar JWT认证与授权 22.3 本章总结 第23章 跨地域复制与分层存储 23.1 跨地域复制 23.1.1 MirrorMaker 23.1.2 Pulsar跨地域复制机制 23.2 分层存储 23.3 本章总结 第24章 监控与管理 24.1 Kafka监控与管理平台 24.1.1 Kafka监控 24.1.2 Kafka管理平台 24.2 Pulsar监控与管理平台 24.2.1 Pulsar监控 24.2.2 Pulsar管理平台 24.3 本章总结 第25章 连接器 25.1 Kafka Connect 25.1.1 应用示例 25.1.2 开发实践 25.2 Pulsar IO 25.2.1 应用示例 25.2.2 开发实践 25.3 本章总结 第26章 流计算引擎 26.1 Kafka Stream 26.1.1 应用示例 26.1.2 时间窗口 26.1.3 语义保证和线程模型 26.2 Pulsar Function 26.2.1 应用示例 26.2.2 部署 26.2.3 时间窗口 26.2.4 Function运行模式和消息语义保证 26.3 本章总结

作者简介

编辑推荐

作者寄语

电子资料

www.luweidong.cn

下一个