这是一本指导读者如何在实践中让RocketMQ实现高性能、高可用、高吞吐量和低延迟的著作。
作者是RocketMQ官方认定的优 秀布道师和技术专家,持续在RocketMQ领域深耕。本书从源码的角度分析了RocketMQ的技术架构和实现原理,第1版获得了良好的口碑,是RocketMQ领域的标志性作品,第2版做了较大幅度的更新。
Apache RocketMQ创始人/Linux OpenMessaging创始人兼主席/Alibaba Messaging开放技术负责人冯嘉高度评价并作序推荐。
全书一共11章,分为3个部分:
第1部分(第1章):
简单介绍了RocketMQ的设计理念与目标,以及阅读RocketMQ源码的方法与技巧;
第二部分(第2~9章):
从源码角度对RocketMQ的技术架构以及消息发送、消息存储、消息消费、消息过滤、顺序消息、主从同步、事务消息等主要功能模块的实现原理进行了深入分析。
第三部分(第10~11章):
首先从实战的角度讲了RocketMQ监控的原理、实现和应用,然后通过各种类型的大量示例展示了RocketMQ的使用技巧。
(1)作者经验丰富:
作者是RocketMQ社区的早期布道师和RocketMQ官方评选的优秀布道师,有大量实战经验的中通和圆通的资深架构专家。
(2)RocketMQ官方推荐:
RocketMQ创始人/Alibaba Messaging开源技术负责人/Linux OpenMessaging创始人高度评价并作序推荐。
(3)畅销书全新升级:
第1版广获好评,成为RocketMQ领域标志性作品,第2版在源码分析的基础上增加了丰富的图文总结,同时在核心功能解读及使用技巧方面做了重大更新。
(4)全方位剖析源码:
从源码角度分析RocketMQ的技术架构以及消息发送、消息存储、消息消费、消息过滤、顺序消息、主从同步、事务消息等的实现原理。
(5)以用好RocketMQ为导向:
揭示RocketMQ高性能、高可用、高吞吐量、低延迟的秘密。
【为什么要写这本书】
随着互联网技术的蓬勃发展和微服务架构的普遍应用,加上大数据分析及高并发流量场景的复杂度越来越高,系统架构开始追求小型化、轻量化,为此我们也需要拥有高性能、高可用、低延迟、支持顺序、支持容错、支持事务等功能的消息中间件来支撑互联网高速发展。目前,RPC、服务治理、分布式、消息中间件已经成为互联网架构的标配。
引入消息中间件后,服务之间就可以通过可靠的异步调用来降低系统之间的耦合度,提高系统的可用性。消息中间件具有高效的消息处理能力,可以让系统承接大数据量的并发及流量脉冲而不被击垮,在保证性能的同时改善了用户体验。此外,消息中间件还可以解决系统之间数据的一致性(终一致性)问题。
RocketMQ作为阿里开源的一款高性能、高吞吐量的消息中间件,承载了阿里双11的大部分业务,可以说是一名久经战场的精英、值得信任的伙伴。它采用 Java作为开发语言,自然而然得到了广大互联网架构师的青睐,并成为互联网行业的消息中间件。
初次接触RocketMQ是在听到它被阿里巴巴正式捐献给Apache基金会,成为Apache的开源项目时。这意味着承载阿里双11巨大流量的消息中间件完全开源,对广大Java开发者来说无疑是一个巨大的利好,让我们有机会一睹高性能消息中间件RocketMQ的真容。作为一名阿里技术崇拜者,我内心异常激动,于是不假思索地在CSDN上开通了专栏源码研究RocketMQ,并受到了广大技术爱好者的支持。
RocketMQ作为一款高性能消息中间件,其核心优势是可靠的消息存储、高性能且低延迟的消息发送、强大的消息堆积能力与消息处理能力、严格的顺序消息模式等。RocketMQ的另一个核心优势是懂得取舍。软件设计不可能做到面面俱到,消息中间件的理想状态是一条消息能且只能被消费一次,要做到这一点,必然需要牺牲性能。RocketMQ的设计者解决这一难题的办法是不去解决,即保证消息至少被消费一次,但不承诺消息不会被消费者多次消费,其消费的幂等由消费者实现,从而极大地简化了实现内核,提高了RocketMQ的整体性能。
RocketMQ被捐献给Apache基金会后一直在快速发展,相关OpenMessaging 的标准也已经发布。本书的写作目的是与各位读者探讨RocketMQ的实现原理,帮助读者更好地在实际项目中应用 RocketMQ。
读者对象
本书的读者对象如下:
RocketMQ的用户和爱好者;
RocketMQ代码开发志愿者;
Java中高级开发工程师;
Java架构师;
Java开源相关技术人员。
【本书特色 】
本书从源码的角度对RocketMQ的实现原理进行详细剖析。作为一本源码阅读类图书,本书的讲解切入点并不是组成RocketMQ的一个个源码包,而是功能模块(如topic路由中心、消息发送、消息存储、消息消费、事务消息),这样更加贴近实战需求。
【如何阅读本书】
本书从逻辑上分为三部分。
部分为准备篇(第1章),简单介绍了RocketMQ的设计理念与目标,并介绍了在开发工具中如何对RocketMQ进行代码调试。
第二部分为实现篇(第2~9章),重点讲解了RocketMQ各个功能模块的实现原理,包括NameServer、消息发送、消息存储、消息消费、ACL功能、主从同步、消息轨迹、主从切换等。
第三部分为实例篇(第10~11章),先介绍了RocketMQ监控,然后通过示例展示了RocketMQ的使用技巧。
本书在后的附录中给出了RocketMQ的主要参数列表及含义,增加了各版本概述和升级建议,供读者参考。
本书的行文思路主要是根据消息发送的全流程进行展开,从路由管理到消息发送、消息存储、消息消费,再到顺序消息、事务消息,从而实现消息链路的闭环。建议读者按照该思路带着问题来阅读,这样或许会事半功倍。
勘误和支持
由于作者水平有限,编写时间仓促,书中难免会出现一些错误或者不准确的地方,恳请读者批评指正。大家可以在CSDN博客专栏(https://blog.csdn.net/prestigeding/article/details/85233529)中留言反馈。书中的全部源文件可以从GitHub RocketMQ官方仓库中下载,我们也会将相应的功能及时进行更新。如果你有更多的宝贵意见,请通过如下渠道向我们反馈:(1)发送邮件至dw19871218pmz@126.com;(2)添加作者微信号dingwpmz进行交流;(3)关注微信公众号中间件兴趣圈并给作者留言。我们在公众号中分享了本书的学习指南,回复学习指南即可获取。期待能够得到你的真挚反馈。
丁威
中间件技术专家,资深RocketMQ技术专家,曾获RocketMQ官方颁发的优秀布道师称号。
现担任中通快递技术平台部资深架构师,主要负责全链路压测、消息中间件、数据同步等产品的研发与落地,拥有千亿级消息集群的运维经验,不仅实践经验丰富,而且对RocketMQ的源码有深入、系统的研究。
热衷于中间件领域的技术分享,荣获CSDN 2020博客之星等荣誉称号,中间件兴趣圈公众号维护者。
张登
专家级架构师,资深RocketMQ技术专家,在分布式系统架构领域有丰富的实战经验,擅长高并发系统的架构设计与调优,主导过多家快递公司EA规划。
曾就职于德邦等公司,现任圆通科技公司技术平台部架构负责人,负责开发框架的搭建、中间件及混合云相关技术的平台化建设。主导设计过消息分发、API网关、全链路监控、分布式文件存储等多个涉及百亿级规模的基础服务平台。ITWorld1公众号维护者,RocketMQ上海社区联合创始人。
周继锋
资深RocketMQ技术专家,知名开源分布式数据库中间件Mycat负责人。
拥有10余年大型项目架构设计及实战经验,曾主导过大量分布式、微服务、大数据相关的项目。在高并发、高可用、高可扩展性、高可维护性等领域有丰富经验,对Hadoop、Spark的源码进行过深度分析并具有丰富的实战经验。
曾在医学、互联网,SAAS行业担任资深架构师、技术总监等职务。现任炼数成金高级讲师,广州鼎牛网络、金石数字创始人。
第1章 阅读源码前的准备1
1.1 获取和调试RocketMQ的源码1
1.1.1 Eclipse获取RocketMQ源码1
1.1.2 Eclipse调试RocketMQ源码8
1.1.3 IntelliJ IDEA获取RocketMQ源码14
1.1.4 IntelliJ IDEA调试RocketMQ源码16
1.2 RocketMQ源码的目录结构23
1.3 RocketMQ的设计理念和设计目标23
1.3.1 设计理念23
1.3.2 设计目标24
1.4 本章小结26
第2章 RocketMQ路由中心NameServer27
2.1 NameServer架构设计27
2.2 NameServer启动流程29
2.3 NameServer路由注册、故障剔除32
2.3.1 路由元信息32
2.3.2 路由注册35
2.3.3 路由删除40
2.3.4 路由发现43
2.4 本章小结44
第3章 RocketMQ消息发送46
3.1 漫谈RocketMQ消息发送46
3.1.1 topic路由机制47
3.1.2 消息发送高可用设计48
3.2 认识RocketMQ消息50
3.3 生产者启动流程51
3.3.1 初识DefaultMQProducer51
3.3.2 消息生产者启动流程54
3.4 消息发送基本流程55
3.4.1 消息长度验证56
3.4.2 查找主题路由信息57
3.4.3 选择消息队列60
3.4.4 消息发送65
3.5 批量消息发送72
3.6 本章小结74
第4章 RocketMQ消息存储75
4.1 存储概要设计75
4.1.1 RocketMQ存储文件的组织方式76
4.1.2 内存映射80
4.1.3 灵活多变的刷盘策略81
4.1.4 transientStorePoolEnable机制82
4.1.5 文件恢复机制82
4.2 初识消息存储83
4.3 消息发送存储流程84
4.4 存储文件组织与内存映射90
4.4.1 MappedFileQueue映射文件队列 90
4.4.2 MappedFile内存映射文件92
4.4.3 TransientStorePool99
4.5 RocketMQ存储文件100
4.5.1 CommitLog文件101
4.5.2 ConsumeQueue文件102
4.5.3 Index文件106
4.5.4 checkpoint文件110
4.6 实时更新ConsumeQueue与Index文件111
4.6.1 根据消息更新ConsumeQueue文件113
4.6.2 根据消息更新Index文件114
4.7 ConsumeQueue与Index文件恢复115
4.7.1 Broker正常停止文件恢复118
4.7.2 Broker异常停止文件恢复120
4.8 文件刷盘机制121
4.8.1 Broker同步刷盘122
4.8.2 Broker异步刷盘125
4.9 过期文件删除机制128
4.10 同步双写132
4.11 本章小结136
第5章 RocketMQ消息消费137
5.1 RocketMQ消息消费概述137
5.1.1 消费队列负载机制与重平衡138
5.1.2 并发消费模型139
5.1.3 消息消费进度反馈机制139
5.2 消息消费者初探141
5.3 消费者启动流程143
5.4 消息拉取146
5.4.1 PullMessageService实现机制147
5.4.2 ProcessQueue实现机制149
5.4.3 消息拉取基本流程150
5.5 消息队列负载与重新分布机制167
5.6 消息消费过程175
5.6.1 消息消费176
5.6.2 消息确认180
5.6.3 消费进度管理184
5.7 定时消息机制189
5.7.1 load()方法190
5.7.2 start()方法190
5.7.3 定时调度逻辑192
5.8 消息过滤机制194
5.9 顺序消息199
5.9.1 消息队列负载199
5.9.2 消息拉取200
5.9.3 消息消费201
5.9.4 消息队列锁实现208
5.10 本章小结209
第6章 RocketMQ的ACL210
6.1 什么是ACL210
6.2 如何使用ACL211
6.2.1 Broker端开启ACL211
6.2.2 客户端使用ACL212
6.3 ACL实现原理214
6.3.1 Broker端ACL核心入口214
6.3.2 PlainAccessValidator详解216
6.3.3 PlainPermissionManager详解220
6.3.4 AclClientRPCHook详解228
6.4 本章小结231
第7章 RocketMQ主从同步机制232
7.1 RocketMQ主从同步原理232
7.1.1 HAService整体工作机制233
7.1.2 AcceptSocketService实现原理233
7.1.3 GroupTransferService实现原理235
7.1.4 HAClient实现原理236
7.1.5 HAConnection实现原理239
7.2 RocketMQ读写分离机制245
7.3 RocketMQ元数据同步248
7.3.1 从节点主动同步元数据249
7.3.2 主节点消息拉取主动同步消费进度250
7.4 本章小结251
第8章 RocketMQ消息轨迹252
8.1 消息轨迹的引入目的和使用方法252
8.2 消息轨迹设计原理255
8.2.1 消息轨迹数据格式255
8.2.2 如何采集轨迹数据256
8.2.3 如何存储消息轨迹数据257
8.3 消息轨迹实现原理257
8.3.1 寻找消息轨迹入口257
8.3.2 消息发送轨迹数据259
8.3.3 消息轨迹异步转发实现机制261
8.4 本章小结265
第9章 RocketMQ主从切换266
9.1 主从切换引入目的266
9.2 Raft协议简介267
9.2.1 Leader选举267
9.2.2 日志复制268
9.3 RocketMQ DLedger主从切换之Leader选主269
9.3.1 DLedgerLeaderElector核心类及核心属性270
9.3.2 选举状态管理器初始化271
9.3.3 选举状态机状态流转273
9.3.4 发送投票请求与处理投票请求280
9.3.5 发送心跳包与处理心跳包283
9.4 RocketMQ DLedger主从切换之存储实现288
9.4.1 RocketMQ DLedger核心类及核心属性288
9.4.2 RocketMQ DLedger数据存储协议290
9.4.3 RocketMQ DLedger索引存储协议291
9.5 RocketMQ DLedger主从切换之日志追加291
9.5.1 日志追加流程概述291
9.5.2 判断Push队列是否已满293
9.5.3 Leader节点日志存储293
9.5.4 Leader节点等待从节点日志复制响应ACK298
9.6 RocketMQ DLedger主从切换之日志复制299
9.6.1 日志复制设计理念300
9.6.2 日志复制类设计体系301
9.6.3 日志转发303
9.7 RocketMQ整合DLedger设计技巧与实现原理326
9.7.1 数据存储兼容设计327
9.7.2 数据存储兼容实现原理328
9.7.3 主从切换元数据同步机制337
9.8 RocketMQ主从切换实战344
9.8.1 主从切换核心配置属性344
9.8.2 搭建主从同步环境344
9.8.3 主从同步集群升级到主从切换346
9.9 本章小结350
第10章 RocketMQ监控352
10.1 设计理念352
10.2 实现原理353
10.2.1 监控相关类图353
10.2.2 监控原始数据采集流程355
10.3 监控数据采样机制356
10.3.1 监控数据采样356
10.3.2 根据采样计算统计指标357
10.4 如何采集监控指标359
10.5 监控实战应用360
10.6 本章小结365
第11章 RocketMQ实战366
11.1 消息批量发送366
11.2 消息发送队列自选择367
11.3 消息过滤368
11.3.1 TAG过滤模式368
11.3.2 SQL过滤模式368
11.3.3 类过滤模式369
11.4 事务消息371
11.5 Spring整合RocketMQ375
11.6 Spring Cloud整合RocketMQ376
11.7 RocketMQ监控与运维命令384
11.7.1 搭建RocketMQ监控平台rocketmq-console384
11.7.2 RocketMQ管理命令387
11.8 应用场景分析423
11.9 实战案例424
11.9.1 RocketMQ集群线上故障缩容实战案例424
11.9.2 RocketMQ在线扩容实战427
11.10 本章小结430
附录 A 参数说明431
附录B RocketMQ各版本概述与升级建议436