系统学习消息队列分享(一) 怎样系统学习消息队列?

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

要了解消息队列的完整知识体系,想深度进阶为消息队列达人,从理论到实践,从基础到进阶,从深度到广度,全方位吃透消息队列。

哪些人适合学消息队列?

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

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

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

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

  • 熟练使用各种常用集合,比如:数组、链表、字典等;
  • 掌握 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/

原文地址:https://www.cnblogs.com/wt645631686/p/11408390.html

时间: 2024-08-29 08:56:51

系统学习消息队列分享(一) 怎样系统学习消息队列?的相关文章

系统学习消息队列分享(六) 如何确保消息不会丢失?

对于刚刚接触消息队列的同学,最常遇到的问题,也是最头痛的问题就是丢消息了.对于大部分业务系统来说,丢消息意味着数据丢失,是完全无法接受的. 其实,现在主流的消息队列产品都提供了非常完善的消息可靠性保证机制,完全可以做到在消息传递过程中,即使发生网络中断或者硬件故障,也能确保消息的可靠传递,不丢消息. 绝大部分丢消息的原因都是由于开发者不熟悉消息队列,没有正确使用和配置消息队列导致的.虽然不同的消息队列提供的 API 不一样,相关的配置项也不同,但是在保证消息可靠传递这块儿,它们的实现原理是一样的

系统学习消息队列分享(二) 为什么需要消息队列?

消息队列是最古老的中间件之一,从系统之间有通信需求开始,就自然产生了消息队列.但是给消息队列下一个准确的定义却不太容易.我们知道,消息队列的主要功能就是收发消息,但是它的作用不仅仅只是解决应用之间的通信问题这么简单. 我们举个例子说明一下消息队列的作用.话说小袁是一家巧克力作坊的老板,生产出美味的巧克力需要三道工序:首先将可可豆磨成可可粉,然后将可可粉加热并加入糖变成巧克力浆,最后将巧克力浆灌入模具,撒上坚果碎,冷却后就是成品巧克力了. 最开始的时候,每次研磨出一桶可可粉后,工人就会把这桶可可粉

系统学习消息队列分享(十) 如何实现高性能的异步网络传输?

异步与同步模型最大的区别是,同步模型会阻塞线程等待资源,而异步模型不会阻塞线程,它是等资源准备好后,再通知业务代码来完成后续的资源处理逻 辑.这种异步设计的方法,可以很好地解决IO等待的问题. 我们开发的绝大多数业务系统,它都是IO密集型系统.跟IO密集型系统相对的另一种系统叫计算密集型系 统.通过这两种系统的名字,估计你也能大概猜出来IO密集型系统是什么意思. IO密集型系统大部分时间都在执行IO操作,这个IO操作主要包括网络IO和磁盘IO,以及与计算机连接的一 些外围设备的访问.与之相对的计

android 消息系统Handler、MessageQueue、Looper源码学习

android消息系统 整体框架如图所示 在安卓的消息系统中,每个线程有一个Looper,Looper中有一个MessageQueue,Handler向这个队列中投递Message,Looper循环拿出Message再交由Handler处理.整体是一个生产者消费者模式,这四部分也就构成了android的消息系统. 先来看一个最简单的例子 //这段代码在某个Activity的onCreate中 Handler handler = new Handler(Looper.getMainLooper()

C语言学习之用队列实现银行排队系统

队列操作的接口:http://blog.csdn.net/qlx846852708/article/details/43666927 数据结构C语言实现:http://blog.csdn.net/qlx846852708?viewmode=contents 本文件是用队列实现银行排队系统,上面的连接是我实现的队列的接口实现. #include <stdio.h> #include <stdlib.h> #include <string.h> #include "

最新2019学习路线,零基础怎么系统学习大数据?

大数据技术是指从各种各样类型的巨量数据中,快速获得有价值信息的技术.解决大数据问题的核心是大数据技术.零基础怎么系统学习大数据?首先我们先了解一下什么是大数据. 最新2019学习路线,零基础怎么系统学习大数据?"大数据"是一个体量特别大,数据类别特别大的数据集,并且这样的数据集无法用传统数据库工具对其内容进行抓取.管理和处理.大数据工程师需要学习哪些知识?创一个小群,供大家学习交流聊天如果有对学大数据方面有什么疑惑问题的,或者有什么想说的想聊的大家可以一起交流学习一起进步呀.也希望大家

Android系统源码阅读(13):Input消息的分发过程

Android系统源码阅读(13):Input消息的分发过程 请对照AOSP版本:6.0.1_r50.学校电脑好渣,看源码时卡半天 先回顾一下前两篇文章.在设备没有事件输入的时候,InputReader和InputDispatcher都处于睡眠状态.当输入事件发生,InputReader首先被激活,然后发送读取消息,激活Dispatcher.Dispatcher被激活以后,将消息发送给当前激活窗口的主线程,然后睡眠等待主线程处理完这个事件.主线程被激活后,会处理相应的消息,处理完毕后反馈给Dis

Linux学习笔记——例说makefile 增加系统共享库

0.前言 从学习C语言开始就慢慢开始接触makefile,查阅了很多的makefile的资料但总感觉没有真正掌握makefile,如果自己动手写一个makefile总觉得非常吃力.所以特意借助博客总结makefile的相关知识,通过例子说明makefile的具体用法. 例说makefile大致分为4个部分 1.只有单个C文件 2.含有多个C文件 3.需要包括头文件路径 4.增加宏定义 5.增加系统共享库 6.增加自定义共享库 7.一个实际的例子 [代码仓库]--makefile-example

ios程序如何实现系统自带的分享

ios系统自带的分享,支持的平台非常有限, 国内的只有 新浪微博和 腾讯微博,但是程序要求不多的话,也可以直接使用系统自带的分享,也比较简单. 首先,需要导入系统自带的框架  #import <Social/Social.h> // 1.判断平台是否可用(就是手机设置里 的新浪微博 和腾讯微博 有没有账号登录) if (![SLComposeViewController isAvailableForServiceType:SLServiceTypeSinaWeibo]) { UIAlertVi