<audio id="audio" title="预习 | 怎样更好地学习这门课？" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/fb/20/fb6f4d038120b450837117bbaf135020.mp3"></audio>

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

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

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

## 哪些人适合学消息队列？

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

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

## 学习消息队列，有哪些门槛？

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

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

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

**1. 英文的阅读能力**

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

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

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

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

**3. 积极的学习态度**

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

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

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

## 由浅入深学习消息队列

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

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

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

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

## 一份知识图谱

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

<img src="https://static001.geekbang.org/resource/image/8c/01/8c13b2d68dda85d2b47b52064905f001.png" alt="">

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

目前，市面上有的消息队列产品很多，像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/](https://rocketmq.apache.org/docs/quick-start/)


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


> 
Kafka 官方文档： [http://kafka.apache.org/documentation/](http://kafka.apache.org/documentation/)


> 
RabbitMQ 官方文档： [https://www.rabbitmq.com/documentation.html](https://www.rabbitmq.com/documentation.html)


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

> 
Stack Overflow：[https://stackoverflow.com/](https://stackoverflow.com/)


感谢阅读，如果你觉得这篇文章对你有一些启发，也欢迎把它分享给你的朋友。


