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

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

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

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

哪些人适合学消息队列?

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

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

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

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

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

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

1. 英文的阅读能力

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

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

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

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

3. 积极的学习态度

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

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

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

由浅入深学习消息队列

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

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

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

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

一份知识图谱

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

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

目前,市面上有的消息队列产品很多,像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/

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

精选留言

  • 风云

    2019-07-22 18:41:20

    哇,终于等到了MQ专栏,立个Flag:

    1.完成跟下来整个专栏内容;
    2.对当天学到的内容进行总结思考,与老师留言讨论;
    3.将学到的内容落到代码上,实践来巩固知识。

    Go,Go,Go!
  • 小伟

    2019-07-24 14:27:44

    李老师的开们两篇让我想起了耗子叔专栏的签名:洞悉技术的本质,享受科技的乐趣。
    技术的本质才是程序猿的目标,CRUD、项目、管理都是手段,名望、地位、金钱都是副产品。而能享受科技的乐趣则是精神层次的追求,如无剑胜有剑之境,可遇不可求。
    先脚踏实地的磨练有剑之境再说。
  • 0xFFFFFFFF

    2019-07-22 19:24:07

    rocketmq.cloud这个网址也推荐一下,对国内用户比较友好
    作者回复

    感谢你的推荐!

    2019-07-22 21:27:53

  • 张学磊

    2019-07-22 22:35:02

    老师京东的JMQ是基于哪个消息队列进行二次开发的?
    作者回复

    是完全自研的,近期就会开源。

    2019-07-23 09:36:12

  • 爱科幻爱魔法细节控

    2019-07-22 22:56:37

    第一个目标:尽快跨过学习消息队列的门槛
    作者回复

    这个门槛并不高,坚持学完这个课程就可以了啊

    2019-07-23 09:36:48

  • pengshao

    2021-08-24 16:05:11

    http://rocketmq.cloud/zh-cn/ 这个网站打不开了?
  • 小明

    2020-03-17 21:46:51

    如果我的日常工作对于消息队列用的不多,怎么能让学习更有效,学了不用就容易遗忘
    作者回复

    最重要的是理解原理,原理这个东西一旦你理解了,就不容易忘。

    至于一些如何操作和配置这些操作层面的东西,忘了也没关系,需要的时候再去查一下就可以了。

    2020-03-18 10:59:25

  • grey927

    2019-08-26 09:59:12

    李老师,我是Java后端,刚接触消息队列,之前完全没有接触过这块,请问在学这门课程的时候,需要事先熟悉一种消息队列的使用么?大概要熟悉到什么程度,PS:目前就用ActiveMQ写了一个收/发的小Demo
    作者回复

    最好是在日常的开发中使用过MQ,这样你会对MQ有一个感性的认识。

    2019-08-27 09:10:31

  • grey927

    2019-08-23 09:10:13

    由于历史原因,现在要开始在我们的微服务下用消息队列,但是公司的消息队列采用的是ActiveMQ(我们的业务不复杂,负载也并不太高,应该ActiveMQ足够满足需求),请问李老师,关于ActiveMQ集成微服务有什么好的实践么?
    作者回复

    如果你用的是spring全家桶的话,spring messaging对ActiveMQ有非常好的集成和封装,建议使用。

    2019-08-23 09:23:57

  • 2019-08-18 21:09:55

    这节好,感觉老师的课程安排非常的恰当,由浅入深循序渐进。
    也在学习kafka的专栏,正好可以对比着学。
    这节容易理解但不易做到,如果非常清楚,高性能的网络通信怎么实现?高性能的数据存储怎么实现?分布式数据一致性怎么实现?对于多线程高并发编程又了然于胸,我感觉什么样的中间件都能实现。
  • miniluo

    2019-07-26 13:32:10

    老师好,想请教下老师;消息队列的重试机制一般是怎么做的?我们现在用的是RabbitMQ。
    作者回复

    后面我们会专门来讲,怎么做到不丢消息。

    2019-07-26 16:52:08

  • 业余草

    2019-07-24 17:35:12

    MQ太多了,技术选型也讲一下吧
    作者回复

    你需要的课程已更新:“02 常见的消息队列有哪些,该如何选择?”

    2019-07-25 09:35:57

  • ikel

    2019-07-24 11:13:25

    ZeroMQ现在都没人用了么?
    作者回复

    有啊,不过ZeroMQ它是Brokerless的设计,和其它MQ的使用场景不太一样。

    2019-07-25 09:26:58

  • 风云

    2019-07-22 18:43:40

    希望可以紧跟老师的步伐,稳扎稳打,逐步掌握这门课的内容。今天学到这门课,开心!
    作者回复

    我记住你了,每节课都点名哦。

    2019-07-22 21:16:02

  • Nike

    2019-07-24 17:45:27

    逼一哈自己
    作者回复

    必须得这样!

    2019-07-25 09:36:15

  • Hurt

    2019-07-24 07:39:37

    打卡2
  • 业余爱好者

    2020-01-15 22:18:50

    如何学习mq?

    mq适合后端程序员和希望了解底层技术的人员学习。
    学习mq,要有英文文档阅读能力,java编程经验,积极的学习态度。
    学习mq不应该单单停留在使用层面,还要了解它的设计思路,实现原理和使用的底层技术。首先要弄懂一些基本的概念,队列主题分区等。之后可以深入源码,学习底层技术在代码中是如何实现的。
    课程分为mq产品,协议,应用场景,编程语言和底层技术5个部分。产品较多,没有统一的规范。

    学习的重点是mq中涉及的关键技术的实现,如网络通信,序列化与反序列化,分布式事务,内存管理等。
  • 一记妙蛙直拳

    2019-07-23 19:33:33

    消息队列全景图清晰明确了学习消息队列需要关注的点,不光有实现功能的编程语言,还有其实现技术(必然要吃透其中每一种技术,相信认真学习下来自己的技术实力会有很大的进步),还有了解消息队列使用到的标准协议,知道热门的消息队列产品(优缺点),满足不同的应用场景,加油继续跟进
    作者回复

    加油!

    2019-07-24 10:15:53

  • 不能扮演天使

    2019-07-22 22:57:01

    终于上线了喜欢的课题,MQ必须跟啊
    作者回复

    感谢支持,一定要坚持学完哦。

    2019-07-23 09:37:10

  • ifelse

    2022-12-21 18:05:35

    谢谢老师