You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

71 lines
7.8 KiB
Markdown

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 开篇词 | 优秀的程序员,你的技术栈中不能只有“增删改查”
你好我是李玥目前在京东技术架构部任职架构师。最近几年我一直从事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写下你的学习计划或目标**我们所有人一起互相监督,互相鼓励,好的学习方法和心得也可以互相借鉴。当你完整学完所有内容之后,再来这里回顾当初的目标和计划,相信你会为自己的这段学习旅程感到骄傲。
![](https://static001.geekbang.org/resource/image/de/23/de0a489e6b4fa9a49450bf9197593423.jpg)