00 开篇词 优秀的程序员,你的技术栈中不能只有“增删改查”

你好,我是李玥,目前在京东技术架构部任职架构师。最近几年,我一直从事 PaaS 层基础中间件产品的设计和开发相关工作,通俗地说就是在“造轮子”。

2018 年,作为首席架构师,我和我的团队一起重构了京东自研的消息队列产品:JMQ(即将开源)。我们在京东实现了超过 2000 个节点的超大规模集群部署,经过 2018 年“11.11”和 2019 年“618”两次大促的实战考验,JMQ 很好地承载了大促期间超过万亿的流量洪峰。

在设计开发 JMQ 和其他中间件系统的过程中,我读了很多优秀开源软件的文档和源代码,从中学习和借鉴了很多优秀的设计思想与编码技巧,当然也融入了很多自己的思考和创新。这段经历对我而言弥足珍贵,我也希望能通过这一系列课程,把我学到和悟到的这些底层、通用、有深度的技术分享给你。

底层技术知识,给你深入解决业务问题的能力

你可能会问,我是普通程序员, 工作中只会使用消息队列等“轮子”来实现业务,并没有机会参与到“轮子”的开发,那么学习这些底层的技术知识对我有用吗?当然有用。

消息队列几乎是每个后端程序员都会用到的中间件,它在你的技术栈中重要程度不言而喻。消息队列的功能很简单,就是收发消息,你肯定可以看一下文档,几分钟就写出一个用消息队列收发消息的 Demo。但是,把消息队列真正应用到生产系统中,就没那么简单了。

在使用消息队列的过程中,你会遇到很多问题,比如选择哪款消息队列更适合你的业务系统?如何保证系统的高可靠、高可用和高性能?如何保证消息不重复、不丢失?如何做到水平扩展?诸如此类的问题,每一个问题想要解决好,都不太容易。

比如说面对消息丢失这个问题,你会怎么解决呢?如果你对消息队列不熟悉,常规的做法可能是去搜索引擎上查看一下错误信息,然后照着别人的解决方案尝试下,能不能解决取决于运气。

如果你有一些消息队列使用经验,对于常见的问题,可以根据经验来判断问题所在,而对于一些没见过的问题,那就无能为力了。但如果你掌握了消息队列的实现原理,无论你使用任何一种消息队列,遇到任何问题,都可以从原理层面来分析它的原因,再简单看一下它的 API 和相关配置项,就能很快知道该如何配置消息队列,写出高性能并且可靠的程序。

当然**,从职业发展,保持市场竞争力的角度来看,掌握一些底层技术,深耕个人技术栈的深度,实现从“用轮子”到“造轮子”的技术提升,也是一个非常明智的选择。**为什么这么说呢?

可以看到,技术圈的风向一直在变,大数据、云的热度已经在慢慢消退,现在当红的是 AI 和 IoT。这些火热的概念,它最终要从论文和 PPT 落地,变成真正能解决问题的系统,否则就是一个空中楼阁。那不变的是什么?

无论 AI 还是 IoT,都是一个分布式系统,都要处理海量的数据,都要应对海量并发,它们需要解决的底层问题是一样的。所以,不管技术圈的风向如何变化,那些掌握这些底层技术的程序员,永远都是最受欢迎的人。这也是我开设这个课程的目的之一。

消息队列也确实是非常适合拿来展开做源码分析的技术。不难发现,消息队列作为使用最广泛、生命力最旺盛的中间件,无论技术如何发展,都离不开分布式系统的最基本需求:通信。它涉及的底层技术是非常全面的,比如:高性能通信、海量数据存储、高并发等。并且,消息队列具有功能简洁、结构清晰的特点,入门简单但具有足够的深度,适合用来进行深入地分析和学习。

从“上古”的 ActiveMQ,如今被广泛使用的 RocketMQ、Kafka,直到最近推出的 Pulsar,伴随着技术的持续发展,一代又一代的消息队列不断推陈出新,性能越来越强大,功能也日臻丰富完善。

在这门课程中,我将拿着“显微镜”和你一起分析这些开源消息队列的源码,学习其优秀的设计思路、高超的优化技巧,以及巧妙的代码结构。

希望通过这次系统学习,你的收获不仅仅是学会并精通消息队列的使用和原理,而且通过和我一起分析这些优秀开源软件的源代码,透过代码领会到其中最本质的、精髓的东西,将你的技术深度和代码能力再提升一个层次,这也是我希望交付给你的终极收获。

总结起来,通过这次系列课程的学习,你可以达成三个成就:

  • 成为消息队列领域的“技术高手”;
  • 掌握从源码分析、解决问题的方法;
  • 将你的综合技术能力提升到一个新的高度,具备成为开源软件项目开发者的能力。

如果你愿意的话,强烈建议你参与某个开源软件项目,成为它的贡献者。

课程设置

我将这个课程设置为三部分:基础篇、进阶篇和案例篇。

基础篇,以讲解消息队列的使用方法和最佳实践为主,包括消息队列基础知识、技术选型、高级功能等,给出消息队列应用过程中常见问题的解决策略。通过基础篇的学习,希望你能对消息队列和相关生态系统有比较深入的认识,成为消息队列“小达人”。

进阶篇,是这个课程的核心内容,我们会深入到源码中去,探讨消息队列的实现原理,帮助你拓展知识深度。

在这个模块的前半部分,每篇会围绕一个知识点来深入探讨,比如像异步模型、高性能的底层网络通信等,**其中每一个知识点不仅是中间件开发人员必须掌握的,而且是各大厂面试题中的常考内容,**希望你每个知识点都不要放过。

后半部分我会带你分析一些开源消息队列的源代码,每篇选择一个开源的消息队列,针对一个功能特性,来一起分析它的源码是如何实现的,理解这个功能特性的实现原理,同时带你学习源代码中优秀的设计思想和一些好的编程技巧。

希望通过进阶篇的学习,能够帮助你理解消息队列的设计思想,学会从源码分析、解决问题的方法,掌握这些可复用到其他领域的底层技术。

案例篇,我会和你一起做两个微型的项目,带你体验实际的代码开发。这两个微项目会用到我们在基础篇和进阶篇中学习的知识。

  • 第一个微项目,一起用消息队列和流计算框架来实现一个流计算任务;
  • 第二个微项目,一起来实现一个最简单的 RPC 框架,因为开发中间件用到的很多技术都是互通的,开发消息队列的技术同样可以用于开发 RPC 框架。

希望你通过这两个微项目的实际编码,做到学以致用,同时也检验一下自己的学习效果。

写在最后

虽然说这是一门有点儿技术难度的课程,但只要你坚持学习,完整跟下来我们的课程,课后多思考,多练习(所有的知识点最终还是要落实到代码上),我相信你对消息队列的掌握情况、代码能力和架构能力都将会有一个质的飞跃。

最后,**我希望你在留言区立个 Flag,写下你的学习计划或目标,**我们所有人一起互相监督,互相鼓励,好的学习方法和心得也可以互相借鉴。当你完整学完所有内容之后,再来这里回顾当初的目标和计划,相信你会为自己的这段学习旅程感到骄傲。

00 预习 怎样更好地学习这门课?

你好,我是李玥。在对专栏内容正式学习之前,我想先和你来聊聊如何学习消息队列,以及如何学习这门课。

从系统之间有通信需求开始呢,就产生了消息队列,它也是最古老的中间件之一。它的应用场景非常广泛,分布式系统中的很多进程间通信问题,都可以用消息队列来解决。可以说消息队列是所有后端程序员的必备技能。但是,想要系统、深入地学习消息队列,却并不容易。

市面上消息队列的论坛社区不少,但是信息错综混杂,你想要了解消息队列的完整知识体系,想深度进阶为消息队列达人,却没有清晰的学习路径可寻。为此,我开通这个系列课程,希望能帮助你完善知识体系,从理论到实践,从基础到进阶,从深度到广度,全方位吃透消息队列,进阶为消息队列小达人。

哪些人适合学消息队列?

后端开发者:消息队列几乎是每个后端程序员都会用到的中间件,无论你是开发微服务,实时计算,还是机器学习程序,都需要解决进程间通信的问题。

渴望技术提升的开发者:消息队列所涉及的高性能通信、海量数据存储、高并发这些底层的技术比较全面,并且功能简洁、结构清晰,容易入门但又同时具有足够的深度,非常适合用来深入分析和学习底层技术,帮助你实现从用“轮子”到造“轮子”的技术提升。

学习消息队列,有哪些门槛?

至少熟练掌握一门编程语言,掌握所有程序员都需要具备的一些基础技术知识和能力,例如:

  • 熟练使用各种常用集合,比如:数组、链表、字典等;
  • 掌握 Linux 系统的基础知识,会使用常用的命令;
  • 具备多线程、并发控制编程能力;
  • 编写过读写文件、通过网络收发数据的程序;
  • 能看懂最基本的 UML 图,包括类图、时序图等;
  • 了解最常用的几种设计模式和算法。

以下内容是一些“加分项”,当然这些“加分项”你不一定非要具备,但会让你的学习过程更加惬意。

1. 英文的阅读能力

因为整个技术圈大部分的技术类资料、开源软件的文档、代码的注释和论文都是用英文撰写的,如果你不满足于平时只看过时的二手资料,一定要努力提升自己,达到能独立、快速看懂英文技术文档的水平。

这对于技术人,其实并不是非常难的事儿。大多数英文技术文档涉及的专业词汇不超过一百个,使用的语法和句式都比较简单,理解起来绝对不会比中学英语考试题中的阅读理解更难。所以,最重要的是不要对英语过于恐惧,并且不要怕麻烦,多读多练习,平时多进行英文搜索,你会发现自己快速阅读能力的提升。

2. 掌握 Java 语言和其生态系统

大部分服务端的开源软件,包括我们这个课程涉及的 RocketMQ、Kafka、Pulsar 等,都是使用 Java 语言开发的。虽然 Java 本身有很多让人诟病的地方,比如僵化的泛型系统,不确定的 GC 机制等,也不断有 Go、Scala 等这些新兴语言来挑战 Java 的江湖地位,但是 Java 强大的生态系统在短时间内还是难以替代的。所以,无论你现在使用的是什么编程语言,学一点 Java 总是一个不错的选择。

3. 积极的学习态度

最后,也是最重要的一点是,对待写代码这件事儿的,你的真实态度是什么?

你是不是会认真地思考每一个细节是否已经做到最优?有没有为使用到的每个集合,仔细考虑到底是用数组,还是链表,还是其他哪种数据结构更合适?你有多少次迫于项目进度的压力而交出“算了,虽然我知道这么做不好,但也能凑合用”的代码?你有没有过为自己的某个(哪怕是自认为)绝妙设计,而成就感满满,幸福好几天的时刻?你会不会因为沟通时别人提到了一个你不知道的技术名词感到焦虑和羞愧,然后赶紧偷偷学习补齐这个技术短板?

针对这些问题,你可以做一个自我评估,了解自己到底对技术有多热爱?因为只有发自内心的对技术的热爱,才是保证持续学习并且不断提升自己的唯一动力。

由浅入深学习消息队列

在我看来,要想学好消息队列,不应该仅仅停留在使用层面上,还需要深入了解它的设计思路、实现原理和使用的底层技术。但是要注意循序渐进,由浅入深地去学习。

第一步就是去了解消息的基本概念,比如主题、订阅、分区等。这些基础的概念,就像我们学习一门编程语言中的基础语法一样,你只有搞清楚它们,才能进行后续的学习。然后,你需要去掌握使用消息队列的技能,能够处理一些常见的问题。

有了这些基础知识的储备以后,你就可以深入到源码中去,进而加深你对消息队列的理解,提升你的技术深度了。这时候你要了解其中必备的底层技术,比如高性能的网络传输、内存管理和锁的使用;同时也要深入学习消息队列一些高级特性的实现原理,比如如何实现事务消息、消息队列如何支撑海量 IoT 设备同时在线。

当然,学习消息队列的知识,最后一定要付诸实践,也就是落到代码层面上去操作执行。你可以选择用消息队列去实现你的业务系统,也可以使用实现消息队列的底层技术,去实现其他的中间件系统。

一份知识图谱

我整理了一张 **“消息队列生态全景图”,涵盖了消息队列产品、标准和协议、应用场景、编程语言以及实现技术,**希望可以帮助你对整个消息队列生态系统有宏观的了解和认知。

![

img](assets/8c13b2d68dda85d2b47b52064905f001.png)

我们一起来大概浏览一下图中涉及的内容,首先我们来看看消息队列的产品、标准和协议,以及应用场景的部分。

目前,市面上有的消息队列产品很多,像 Kafka、ActiveMQ、RocketMQ、Pulsar、RabbitMQ 等等,其中比较主流的开源消息队列为 Kafka、RocketMQ 和 RabbitMQ。当然你并不需要把每个消息队列都去学习一遍,因为这些消息队列中很多的原理和知识都共通的。

在接下来的课程中,我会以这些开源消息队列产品为例子对具体的知识点进行讲解,也会顺便讲解每个产品它的特点。掌握了这些通用的原理,即使你以后碰到一款全新的、我们没有讲过的消息队列,你也可以做到很快上手。

与消息队列相关的协议和标准有 JMS、AMQP、MQTT 和 OpenMessaging。不过,目前为止还没有哪个标准或者协议能“一统江湖”,你做一个大概的了解即可,如果需要用到的时候再深入学习也来得及。

消息队列的应用范围广泛,在一些典型且常用的消息队列应用场景中,比如像处理日志数据、监控、流计算等,你需要了解,对应不同场景,应该选用哪个消息队列产品?什么样的姿势才是最佳的使用方式?在课程中,我会穿插着介绍一些最佳实践,帮助你在遇到类似场景时少踩一些坑。

然后,我们来看看这些开源消息队列产品实现中,涉及的编程语言和技术要点。

消息队列涉及到的语言有 Java、Scala 和 Erlang。实际上对于编程语言本身,你并不需要特别的关注,无论你最熟悉的语言是不是 Java 或者 Scala 都没关系,鉴于语言的相通性,只要你有编程语言的基础,即使是一门从未接触过的语言,通过短时间的学习达到可以读懂代码的水平,一般来说都是不成问题的。

我们学习的大部分知识点也不是和某种语言强相关的,你更多需要关注的是其中的设计思想、实现原理和实践方法这些技术本身的东西。

对于实现消息队列中涉及的重要的实现技术,像网络通信、序列化反序列化、分布式事务、内存管理等,这部分内容是这门课程中的精粹,需要你重点学习。每一个技术要点我都会在进阶篇中对应一节课程来专题讲解。这些基础的技术要点不仅仅可以用于实现消息队列,在其他各种中间件的实现过程中都会涉及,也是各种高级研发职位面试题中经常会被问到的内容。

学习资源推荐

消息队列的最佳学习资料就是它们的官方文档,因为官方文档更加详细准确,并且随着版本迭代,很多第三方教程文档会过时,而官方文档总能保持与当前版本同步更新。以下是几个开源消息队列的官方文档:

RocketMQ 官方文档: https://rocketmq.apache.org/docs/quick-start/

RocketMQ 中国开发者中心:http://rocketmq.cloud/zh-cn/ (感谢专栏用户 @0xFFFFFFFF 同学推荐)

Kafka 官方文档: http://kafka.apache.org/documentation/

RabbitMQ 官方文档: https://www.rabbitmq.com/documentation.html

在使用消息队列的过程中,如果遇到问题,要善用搜索引擎,我推荐你首选 Google,次之是 Stack Overflow,相对而言,这些搜索引擎搜索到有价值信息的概率会更高一些。

Stack Overflow:https://stackoverflow.com/