<audio id="audio" title="开篇词 | 优秀的程序员，你的技术栈中不能只有“增删改查”" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/35/35/35fa3da4b19242ac3b75755879bf1c35.mp3"></audio>

你好，我是李玥，目前在京东技术架构部任职架构师。最近几年，我一直从事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，写下你的学习计划或目标，**我们所有人一起互相监督，互相鼓励，好的学习方法和心得也可以互相借鉴。当你完整学完所有内容之后，再来这里回顾当初的目标和计划，相信你会为自己的这段学习旅程感到骄傲。

<img src="https://static001.geekbang.org/resource/image/de/23/de0a489e6b4fa9a49450bf9197593423.jpg" alt="">
