内容介绍
本书由RocketMQ社区早期的布道者和技术专家撰写,Apache RocketMQ创始人/Linux OpenMessaging创始人兼主席/Alibaba Messaging开源技术负责人冯嘉对其高度评价并作序推荐。
源码角度:本书对RocketMQ的核心技术架构,以及消息发送、消息存储、消息消费、消息过滤、顺序消息、主从同步(HA)、事务消息等主要功能模块的实现原理进行了深入分析,同时展示了源码阅读的相关技巧;应用层面:本书总结了大量RocketMQ的使用技巧。通过阅读本书,读者将深入理解消息中间件和底层网络通信机制的核心知识点。
全书共10章,分三个部分:
第一部分 准备篇(第1章)
首先介绍了RocketMQ源代码的获取、结构和调试,然后介绍了RocketMQ的设计理念和目标。
第二部分 实现篇(第2~8章)
这是本书的核心部分,从源代码的角度详细分析了消息发送、消息存储、消息消费、消息过滤、顺序消息、主从同步(HA)、事务消息等主要功能模块的架构设计和实现原理。
第三部分 实例篇(第9~10章)
通过示例展示RocketMQ的使用技巧,并着重讲解了RocketMQ的监控命令与监控管理界面。
作者简介
丁威
Java、分布式服务架构、中间件等多个领域的技术专家,擅长高并发编程、Netty网络编程、RocketMQ等技术,国内知名开源数据库中间件Mycat的志愿者和技术顾问。目前担任上海优速物流的技术专家和经营支撑部门的架构师。对RocketMQ有非常深入的研究,是RocketMQ社区的布道师,不仅实践经验丰富,而且对其源代码有深入且系统的研究。
周继锋
拥有10余年大型项目架构设计及实战经验,曾主导过众多分布式系统、微服务及大数据项目。在高并发、高可用、高可扩展性、高可维护性等领域有丰富经验,对Hadoop、Spark源码进行过深度分析并具有丰富的实战经验。曾在ERP、医学、互联网行业担任资深工程师、资深架构师、技术总监等职务,炼数成金高级讲师及国内知名的开源分布式数据库中间件Mycat负责人,也是《分布式数据库架构及企业实践:基于Mycat中间件》书籍的作者
前言
为什么要写这本书
随着互联网技术蓬勃发展、微服务架构思想的兴起,系统架构追求小型化、轻量化,原有的大型集中式的IT系统通常需要进行垂直拆分,孵化出颗粒度更小的众多小型系统,因此对系统间松耦合的要求越来越高,目前RPC、服务治理、消息中间件几乎成为互联网架构的标配。
引入消息中间件,服务之间可以通过可靠的异步调用,从而降低系统之间的耦合度,提高系统的可用性。消息中间件另一个重要的应用场景是解决系统之间数据的一致性(最终一致性)
RocketMQ作为阿里开源的一款高性能、高吞吐量的消息中间件。承载了阿里双十一大部分业务,可以说是一名久经战场的“精英”、值得信任的“伙伴”。同时开发语言为JAVA,自然而然的得到了广大互联网架构师们的青昧,成为互联网行业首选消息中间件。
初次接触RocketMQ是在听到阿里巴巴正式将RocketMQ捐献给Apache基金会,成为Apache的顶级开源项目,意味着承载阿里双十一巨大流量的消息中间件完全走向开源,对广大JAVA开发者来说无疑是一个巨大的利好,让我们有机会一睹高性能消息中间件RocketMQ的“真容”,作为一名阿里技术崇拜者的我,内心更是异常激动,于是不假思索,并决定CSDN上开通了专栏《源码研究RocketMQ》,受到广大技术朋友的支持。
RocketMQ作为一款高性能消息中间件,其核心使命可靠的消息存储、消息发送的高性能与低延迟、强大的消息堆积能力与消息处理能力,严格的顺序消息模式等。RocketMQ的另一个核心思想是懂得取舍,软件设计不可能做到面面俱到,消息中间件的理想状态时一条消息有且只能被消费一次,但要做到这一点,必然牺牲巨大的性能,RocketMQ的设计者在解决这一难题的办法是不去解决,而是在保证消息至少被消费一次,但不承偌消息不会被消费者多次消费,其消费的幂等由消费者实现,从而极大的简化了其实现内核,提高了RocketMQ的整体性能。
当然RocketMQ自从捐献给Apache基金会后版本在快速发展,RocketMQ的设计者们正在制定消息中间件的新的规范,其模块为openmessaging,故本书主要是抛砖引玉,与各位读者朋友们探讨RocketMQ的实现原理,更好的在实际项目中应用RocketMQ。
读者对象
这里可以根据软件需求划分出一些能阅读本书的用户团体:
RocketMQ用户和爱好者
RocketMQ代码开发自愿者
Java中高级开发工程师
Java架构师
有志于从事Java开源的相关技术从业者
本书特色
本书从源码的角度对RocketMQ的实现原理进行详细的剖析,从中阐述了作者学习阅读源码的方法。本文作为一本源码阅读类书籍,其讲解切入点并不是以组成RocketMQ一个个源码包进行展开,而是基于功能模块(如Topic路由中心、消息发送、消息存储、消息消费、事务消息)来展开,更加贴近实战需求。
如何阅读本书
本书分为三大部分:
第一部分为准备篇,简单地介绍RocketMQ的设计理念与目标,并介绍在开发工具中如何对RocketMQ进行代码调试。
第二部分为实现篇,重点讲解了RocketMQ各个功能模块的实现原理,包括NameServer、消息发送、消息存储、消息消费、消息过滤、顺序消息、事务消息等。
第三部分为实例篇,通过示例展示RocketMQ的使用技巧,并着重讲解了RocketMQ的监控命令与监控管理界面。
附录A为RocketMQ主要参数的列表及其含义。
本书的行文思路主要根据消息发送的全流程进行展开,从路由管理到消息发送、消息存储、消息消费,再到顺序消息、事务消息,从而实现消息链路的闭环。建议读者朋友按照该思路,带着问题来阅读本书,或许会事半功倍。
勘误和支持
除封面署名外,参加本书编写工作的还有:陈鹏飞。由于作者的水平有限,编写时间仓促,书中难免会出现一些错误或者不准确的地方,恳请读者批评指正。为此,大家可以通过CSDN博客专栏:https://blog.csdn.net/column/details/20603.html 向作者留言反馈。书中的全部源文件除可以从华章网站下载外,还可以从这个网站下载,我也会将相应的功能更新及时更正出来。如果你有更多的宝贵意见,也欢迎发送邮件至邮箱 [email protected],期待能够得到你们的真挚反馈。
致谢
首先要感谢MyCAT开源社区负责人冰风影对我的提携与指导,为我的职业方向指明前进的方向。
感谢RocketMQ联盟中每一位充满创意和活力的朋友——奔腾、zenk、共产国际史派克、水动力皮划艇、张登、张凤凰、曾文、季永超,以及名单之外的更多朋友,感谢你们对我的支持与帮助。感谢杨福川老师的引荐,在你的努力下才促成了这本书的合作与出版。
感谢机械工业出版社华章公司的编辑张锡鹏老师,在这一年多的时间中始终支持我的写作,你的鼓励和帮助引导我能顺利完成全部书稿。
最后感谢我的爸爸、妈妈、爷爷、奶奶,感谢你们将我培养成人,并时时刻刻为我灌输着信心和力量!感谢我的老婆、女儿,你们是我持续努力的最大动力。
谨以此书献给我最亲爱的家人,以及众多热爱RocketMQ的朋友们!
感谢RocketMQ团队,是你们的付出才有这么好的产品,同时感谢杨福川编辑对本书出版工作的支持。
谨以此书献给我最亲爱的家人和同事,以及帮助过、关注过我的人,以及使用、学习过RocketMQ的朋友们!
推荐序
前言
第1章 阅读源代码前的准备 1
1.1 获取和调试RocketMQ的源代码 1
1.1.1 Eclipse获取RocketMQ源码 2
1.1.2 Eclipse调试RocketMQ源码 9
1.1.3 IntelliJ IDEA获取RocketMQ源码 15
1.1.4 IntelliJ IDEA调试RocketMQ源码 20
1.2 RocketMQ源代码的目录结构 27
1.3 RocketMQ的设计理念和目标 28
1.3.1 设计理念 28
1.3.2 设计目标 28
第2章 RocketMQ路由中心NameServer 31
2.1 NameServer架构设计 31
2.2 NameServer启动流程 32
2.3 NameServer路由注册、故障剔除 36
2.3.1 路由元信息 36
2.3.2 路由注册 38
2.3.3 路由删除 43
2.3.4 路由发现 46
2.4 本章小结 47
第3章 RocketMQ消息发送 49
3.1 漫谈RocketMQ消息发送 49
3.2 认识RocketMQ消息 50
3.3 生产者启动流程 51
3.3.1 初识DefaultMQProducer消息发送者 51
3.3.2 消息生产者启动流程 54
3.4 消息发送基本流程 56
3.4.1 消息长度验证 56
3.4.2 查找主题路由信息 56
3.4.3 选择消息队列 60
3.4.4 消息发送 65
3.5 批量消息发送 71
3.6 本章小结 74
第4章 RocketMQ消息存储 75
4.1 存储概要设计 75
4.2 初识消息存储 76
4.3 消息发送存储流程 78
4.4 存储文件组织与内存映射 83
4.4.1 MappedFileQueue映射文件队列 84
4.4.2 MappedFile内存映射文件 87
4.4.3 TransientStorePool 93
4.5 RocketMQ存储文件 94
4.5.1 Commitlog文件 95
4.5.2 ConsumeQueue文件 97
4.5.3 Index索引文件 100
4.5.4 checkpoint文件 104
4.6 实时更新消息消费队列与索引文件 105
4.6.1 根据消息更新ConumeQueue 107
4.6.2 根据消息更新Index索引文件 108
4.7 消息队列与索引文件恢复 109
4.7.1 Broker正常停止文件恢复 112
4.7.2 Broker异常停止文件恢复 114
4.8 文件刷盘机制 115
4.8.1 Broker同步刷盘 116
4.8.2 Broker异步刷盘 119
4.9 过期文件删除机制 122
4.10 本章小结 126
第5章 RocketMQ消息消费 127
5.1 RocketMQ消息消费概述 127
5.2 消息消费者初探 128
5.3 消费者启动流程 130
5.4 消息拉取 133
5.4.1 PullMessageService实现机制 133
5.4.2 ProcessQueue实现机制 136
5.4.3 消息拉取基本流程 138
5.5 消息队列负载与重新分布机制 154
5.6 消息消费过程 162
5.6.1 消息消费 163
5.6.2 消息确认(ACK) 167
5.6.3 消费进度管理 171
5.7 定时消息机制 176
5.7.1 load方法 177
5.7.2 start方法 178
5.7.3 定时调度逻辑 179
5.8 消息过滤机制 181
5.9 顺序消息 186
5.9.1 消息队列负载 187
5.9.2 消息拉取 187
5.9.3 消息消费 188
5.9.4 消息队列锁实现 195
5.10 本章小结 196
第6章 消息过滤FilterServer 198
6.1 ClassFilter运行机制 198
6.2 FilterServer注册剖析 199
6.3 类过滤模式订阅机制 202
6.4 消息拉取 205
6.5 本章小结 206
第7章 RocketMQ主从同步(HA)机制 207
7.1 RocketMQ主从复制原理 207
7.1.1 HAService整体工作机制 208
7.1.2 AcceptSocketService实现原理 208
7.1.3 GroupTransferService实现原理 210
7.1.4 HAClient实现原理 211
7.1.5 HAConnection实现原理 214
7.2 RocketMQ读写分离机制 220
7.3 本章小结 223
第8章 RocketMQ事务消息 225
8.1 事务消息实现思想 225
8.2 事务消息发送流程 226
8.3 提交或回滚事务 232
8.4 事务消息回查事务状态 233
8.5 本章小结 240
第9章 RocketMQ实战 242
9.1 消息批量发送 242
9.2 消息发送队列自选择 243
9.3 消息过滤 243
9.3.1 TAG模式过滤 244
9.3.2 SQL表达模式过滤 244
9.3.3 类过滤模式 245
9.4 事务消息 247
9.5 Spring整合RocketMQ 250
9.6 Spring Cloud整合RocketMQ 251
9.7 RocketMQ监控与运维命令 258
9.7.1 RocktetMQ监控平台搭建 258
9.7.2 RocketMQ管理命令 261
9.8 应用场景分析 280
9.9 本章小结 281
附录A 参数说明 282