Kafka与Pulsar:消息流平台设计与实现
  • 推荐0
  • 收藏0
  • 浏览90

Kafka与Pulsar:消息流平台设计与实现

梁国斌 (作者) 

  • 书  号:978-7-121-44001-4
  • 出版日期:2022-07-01
  • 页  数:460
  • 开  本:16(185*235)
  • 出版状态:上市销售
纸质版 ¥138.00
本书详细介绍了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的开源作者们,优秀的开源项目都离不开默默奉献力量的开源作者们。感谢电子工业出版社博文视点的陈晓猛编辑,陈编辑专业的写作指导和出版组织工作,使得本书得以顺利出版。感谢写作过程中身边朋友的支持,他们给予笔者很多的支持与力量。

梁国斌

目录


目录



第1部分 基础应用
第1章 Kafka与Pulsar概述 2
1.1 简介 2
1.2 特性 2
1.3 概念 4
1.3.1 Kafka基础概念 4
1.3.2 Pulsar基础概念 6
1.4 本章总结 8
第2章 Kafka的部署与调试 9
2.1 安装Kafka集群 9
2.1.1 部署ZooKeeper集群 9
2.1.2 部署Kafka集群 11
2.2 调试Kafka 12
2.3 本章总结 14
第3章 Kafka的应用 15
3.1 脚本 15
3.1.1 主题管理 15
3.1.2 生产者与消费者 16
3.1.3 动态配置 18
3.2 客户端 19
3.2.1 生产者 19
3.2.2 消费者 24
3.3 消息序列化 28
3.4 配额 30
3.5 本章总结 31
第4章 Pulsar的部署与调试 32
4.1 本地部署 32
4.2 集群部署 33
4.2.1 ZooKeeper集群部署 33
4.2.2 初始化集群元数据 34
4.2.3 部署BookKeeper集群 35
4.2.4 部署Pulsar Broker 36
4.3 调试Pulsar 37
4.3.1 调试Pulsar Broker源码 37
4.3.2 调试BookKeeper 39
4.4 本章总结 40
第5章 Pulsar的应用 41
5.1 租户 41
5.2 命名空间 41
5.2.1 消息保留和过期 42
5.2.2 持久化策略 43
5.2.3 消息投递速率 44
5.3 主题 45
5.3.1 创建主题 45
5.3.2 发送、消费消息 46
5.3.3 管理主题 47
5.4 客户端 48
5.4.1 生产者 49
5.4.2 消费者 54
5.5 Schema 63
5.5.1 Schema的类型与使用示例 63
5.5.2 Schema演化与兼容 67
5.5.3 管理Schema 68
5.6 资源隔离 71
5.6.1 Broker隔离 72
5.6.2 Bookie隔离 72
5.7 兼容Kafka客户端 73
5.8 BookKeeper使用示例 74
5.9 本章总结 75
第2部分 客户端与Broker计算层
第6章 Kafka和Pulsar的架构 78
6.1 ZooKeeper的作用 78
6.2 Kafka的架构设计 81
6.2.1 元数据管理 81
6.2.2 发布/订阅模式 81
6.2.3 磁盘存储的设计与优化 82
6.2.4 数据副本 86
6.2.5 系统伸缩 87
6.2.6 故障转移 87
6.3 Pulsar的架构设计 88
6.3.1 Pulsar的计算层 89
6.3.2 Pulsar的存储层 91
6.3.3 系统伸缩 94
6.3.4 故障转移 95
6.4 源码架构 96
6.4.1 Kafka 96
6.4.2 Pulsar 103
6.4.3 BookKeeper 105
6.5 本章总结 106
第7章 Kafka的主题 107
7.1 CreateTopics请求的处理流程 108
7.1.1 创建主题 108
7.1.2 分区副本分配规则 110
7.1.3 存储主题元数据 112
7.2 KafkaController处理新主题 113
7.3 本章总结 114
第8章 Kafka的生产者与消息发布 115
8.1 生产者发送消息 115
8.1.1 消息发送流程 115
8.1.2 消息累积器与消息批次 118
8.1.3 Sender线程 119
8.1.4 TCP通信协议 121
8.1.5 元数据刷新机制 122
8.2 Broker接收消息 124
8.2.1 Broker处理消息流程 124
8.2.2 延迟操作与时间轮 126
8.3 本章总结 132
第9章 Kafka的消费者与消息订阅 133
9.1 消费组协作机制 133
9.1.1 分区分配器 134
9.1.2 重平衡的设计 137
9.1.3 实战:使用CooperativeStickyAssignor分区分配器 141
9.1.4 重平衡的实现 142
9.2 心跳与元数据更新 152
9.3 ACK管理 152
9.3.1 消费者初始化偏移量 153
9.3.2 ACK偏移量的提交与存储 153
9.4 读取消息 154
9.4.1 消费者发送Fetch请求 154
9.4.2 Broker处理Fetch请求 155
9.5 本章总结 156
第10章 Pulsar的主题 157
10.1 租户与命名空间 157
10.2 主题 158
10.2.1 创建主题 158
10.2.2 初始化主题 160
10.2.3 绑定主题 161
10.3 Broker负载均衡 166
10.3.1 负载报告上传 166
10.3.2 为bundle选择Broker节点 167
10.4 bundle管理 171
10.4.1 选举leader节点 171
10.4.2 bundle卸载机制 172
10.4.3 bundle切分机制 173
10.5 本章总结 175
第11章 Pulsar的生产者与消息发布 176
11.1 生产者发送消息 176
11.1.1 初始化生产者 176
11.1.2 生产者发送消息流程 178
11.2 Broker处理消息 182
11.2.1 写入消息 182
11.2.2 切换Ledger 185
11.3 本章总结 187
第12章 Pulsar的消费者与消息订阅 188
12.1 消费者订阅消息 189
12.1.1 消费者的初始化 189
12.1.2 接收消息 191
12.1.3 确认超时与取消确认 192
12.2 Broker读取与推送消息 193
12.2.1 处理Subscribe请求 193
12.2.2 推送消息 194
12.3 ACK机制 201
12.3.1 ACK机制的设计 201
12.3.2 ACK机制的实现 202
12.4 消息清除 207
12.4.1 历史消息清除 207
12.4.2 清除backlog消息 208
12.4.3 清除过期数据 208
12.5 本章总结 209
第3部分 分布式数据存储
第13章 Kafka存储机制与读写流程 212
13.1 数据存储机制的设计 212
13.2 消息写入流程 214
13.3 消息读取流程 220
13.4 日志管理 224
13.4.1 日志加载 225
13.4.2 日志刷盘 226
13.4.3 数据清理 226
13.4.4 数据去重 227
13.5 本章总结 228
第14章 Kafka主从同步 229
14.1 成为leader/follow副本 230
14.2 follow副本同步流程 233
14.2.1 同步流程与数据一致性 233
14.2.2 LeaderEpoch机制 236
14.2.3 follow副本拉取消息 238
14.3 leader副本更新 242
14.3.1 更新ISR集合 243
14.3.2 更新高水位 245
14.4 本章总结 247
第15章 Kafka分布式协同 248
15.1 KafkaController选举 249
15.1.1 KafkaController元数据 249
15.1.2 ControllerEpoch机制 250
15.1.3 选举流程 250
15.2 ZooKeeper监控机制 253
15.3 故障转移 255
15.3.1 分区、副本状态机 255
15.3.2 分区状态切换流程 257
15.3.3 副本状态切换流程 260
15.4 实战:Preferred Replica重平衡 262
15.5 实战:增加分区数量 263
15.6 实战:Kafka集群扩容 264
15.7 本章总结 266
第16章 BookKeeper客户端 267
16.1 客户端设计 267
16.2 客户端写入 269
16.2.1 Ledger创建流程 269
16.2.2 数据写入流程 271
16.2.3 处理写入结果 272
16.2.4 故障转移 272
16.2.5 LAC上报 275
16.2.6 限制生产者数量 275
16.3 客户端读取 275
16.3.1 消费者读取数据 275
16.3.2 客户端Recover 277
16.4 本章总结 279
第17章 BookKeeper服务端 280
17.1 Bookie设计 280
17.2 Bookie写入流程 281
17.2.1 Bookie初始化 281
17.2.2 Journal写入流程 282
17.2.3 Ledger写入流程 286
17.2.4 Ledger的数据存储格式 291
17.3 Bookie读取数据 291
17.4 Bookie数据清除 294
17.5 Bookie Recovery 296
17.5.1 Auditor 296
17.5.2 ReplicationWorker 297
17.6 本章总结 298
第4部分 事务与KRaft模块
第18章 Kafka与Pulsar事务概述 300
18.1 为什么需要事务 300
18.1.1 幂等发送 301
18.1.2 事务保证 302
18.2 Kafka事务应用示例 302
18.3 Pulsar事务应用示例 306
18.4 本章总结 308
第19章 Kafka事务的设计与实现 309
19.1 Kafka的事务设计 309
19.2 事务初始化流程 313
19.2.1 事务定义 313
19.2.2 生产者初始化事务 315
19.2.3 生产者启动事务 318
19.3 事务消息发送与处理流程 318
19.3.1 事务分区发送与处理流程 318
19.3.2 生产者发送事务消息 319
19.3.3 Broker处理事务消息 320
19.3.4 ACK偏移量发送与处理流程 325
19.4 事务提交流程 325
19.4.1 生产者提交事务 326
19.4.2 协调者完成事务 326
19.5 本章总结 331
第20章 KRaft模块概述 332
20.1 为什么要移除ZooKeeper 332
20.2 部署与调试KRaft模块 333
20.3 Raft算法 335
20.3.1 leader选举 336
20.3.2 日志复制 339
20.3.3 安全性 342
20.4 本章总结 344
第21章 KRaft模块的设计与实现原理 345
21.1 KRaft请求处理流程 346
21.1.1 Raft状态 347
21.1.2 Raft请求类型 347
21.1.3 处理Raft请求 348
21.2 KRaft leader选举机制 350
21.2.1 初始化Raft状态 350
21.2.2 发送投票请求 351
21.2.3 投票流程 352
21.2.4 当选leader节点 354
21.3 KRaft生成Record数据 356
21.4 KRaft数据存储机制 358
21.5 KRaft数据同步机制 360
21.6 KRaft提交Record数据 366
21.6.1 监听器机制 366
21.6.2 BrokerMetadataListener 367
21.6.3 QuorumMetaLogListener 368
21.7 KRaft节点监控与故障转移机制 369
21.7.1 节点注册 370
21.7.2 心跳请求 371
21.7.3 故障转移 372
21.8 KRaft数据清理机制 373
21.8.1 快照管理 374
21.8.2 历史数据清理 374
21.9 本章总结 376
第5部分 高级应用
第22章 安全 378
22.1 TLS加密 378
22.1.1 准备TLS证书和密钥 379
22.1.2 Kafka配置 381
22.1.3 Pulsar配置 383
22.2 认证与授权 384
22.2.1 Kafka SCRAM认证与授权 385
22.2.2 Pulsar JWT认证与授权 389
22.3 本章总结 392
第23章 跨地域复制与分层存储 393
23.1 跨地域复制 393
23.1.1 MirrorMaker 393
23.1.2 Pulsar跨地域复制机制 397
23.2 分层存储 399
23.3 本章总结 402
第24章 监控与管理 403
24.1 Kafka监控与管理平台 403
24.1.1 Kafka监控 403
24.1.2 Kafka管理平台 408
24.2 Pulsar监控与管理平台 410
24.2.1 Pulsar监控 410
24.2.2 Pulsar管理平台 413
24.3 本章总结 414
第25章 连接器 415
25.1 Kafka Connect 416
25.1.1 应用示例 416
25.1.2 开发实践 418
25.2 Pulsar IO 423
25.2.1 应用示例 423
25.2.2 开发实践 425
25.3 本章总结 429
第26章 流计算引擎 430
26.1 Kafka Stream 431
26.1.1 应用示例 431
26.1.2 时间窗口 434
26.1.3 语义保证和线程模型 435
26.2 Pulsar Function 435
26.2.1 应用示例 436
26.2.2 部署 437
26.2.3 时间窗口 441
26.2.4 Function运行模式和消息语义保证 442
26.3 本章总结 443


读者评论

  • 有电子版吗

    bunker_boy发表于 2022/12/21 17:46:55