消息队列
文章平均质量分 92
消息队列
_Rye_
左手代码右手诗
一行代码一行诗
展开
-
结束语 | 程序员如何构建知识体系?
在专栏即将结束的时候,我们不聊技术本身,我想坐下来,跟你聊聊怎么来构建个人的技术知识体系。现在做技术的人普遍都有一种焦虑,相信你也或多或少有一点,焦虑什么呢?总是感觉,自己不懂的技术太多了。虽然你不停地去学习,拼命地扩充自己的技术栈,但是面对不断出现的新技术,学习的速度永远赶不上新技术发展的速度,就会感觉自己不会的东西越来越多,这其实就是一种技术焦虑。焦虑的来源是什么?焦虑,其实是对某些不好的事情过度担心而产生的一种烦躁情绪。这种担心更多来源于“看不清”或者说是“未知”,人的本能就是对未知的事物会有原创 2024-02-13 12:28:05 · 962 阅读 · 0 评论 -
35 | 答疑解惑(三):主流消息队列都是如何存储消息的?
以上就是我们这次热点问题答疑的全部内容了,同时我们这个系列课程的最后一篇:案例篇到这里也就结束了。这个案例篇模块不同于前两个模块,之前主要是讲解一些消息队列相关的实现原理、知识和方法技巧等等,案例篇的重点还是来通过实际的案例,来复习和练习前两篇中涉及到的一些知识。我们案例篇中每节课的作业,大多也都是需要写一些代码。希望在学习案例篇的时候,不要只是听和看,更重要的就是动手来写代码,通过练习把学到的东西真正的消化掉。原创 2024-02-13 12:00:14 · 935 阅读 · 0 评论 -
34 | 动手实现一个简单的RPC框架(四):服务端
上节我们一起学习了如何来构建这个 RPC 框架中最关键的部分,也就是:在客户端,如何根据用户注册的服务接口来动态生成桩的方法。在这里,除了和语言特性相关的一些动态编译小技巧之外,更应该掌握的是其中动态代理这种设计思想,它的使用场景以及实现方法。这节我们一起来实现这个框架的最后一部分:服务端。对于我们这个 RPC 框架来说,服务端可以分为两个部分:注册中心和 RPC 服务。原创 2024-02-13 10:00:54 · 892 阅读 · 0 评论 -
33 | 动手实现一个简单的RPC框架(三):客户端
上节我们已经一起实现了这个 RPC 框架中的两个基础组件:序列化和网络传输部分,这节我们继续来实现这个 RPC 框架的客户端部分。在《31 | 动手实现一个简单的 RPC 框架(一):原理和程序的结构》这节中我们提到过,在 RPC 框架中,最关键的就是理解“桩”的实现原理,桩是 RPC 框架在客户端的服务代理,它和远程服务具有相同的方法签名,或者说是实现了相同的接口,客户端在调用 RPC 框架提供的服务时,实际调用的就是“桩”提供的方法,在桩的实现方法中,它会发请求到服务端获取调用结果并返回给调用方。原创 2024-02-13 00:34:54 · 870 阅读 · 0 评论 -
32 | 动手实现一个简单的RPC框架(二):通信与序列化
继续上节的内容,这节我们一起来实现这个 RPC 框架的通信和序列化部分。如何实现高性能的异步通信、如何来将结构化的数据序列化成字节流,用于网络传输或者存储到文件中,这两部分内容,在进阶篇中都有在专门的课程分别讲解过。网络传输和序列化这两部分的功能相对来说是非常通用并且独立的,在设计的时候,只要能做到比较好的抽象,这两部的实现,它的通用性是非常强的。不仅可以用于我们这个例子中的 RPC 框架中,同样可以直接拿去用于实现消息队列,或者其他需要互相通信的分布式系统中。原创 2024-02-12 22:47:39 · 899 阅读 · 0 评论 -
31 | 动手实现一个简单的RPC框架(一):原理和程序的结构
接下来的四节,我们会一起实现一个 RPC 框架。你可能会问,为什么不实现一个消息队列,而要实现一个 RPC 框架呢?原因很简单,我们课程的目的是希望能够学以致用举一反三,而不只是照猫画虎。在之前的课程中,我们一直在讲解消息队列的原理和实现消息队列的各种技术,那我们在实践篇如果再实现一个消息队列,不过是把之前课程中的内容重复实现一遍,意义不大。消息队列和 RPC 框架是我们最常用的两种通信方式,虽然这两种中间系统的功能不一样,但是,原创 2024-02-12 17:29:00 · 1461 阅读 · 0 评论 -
30 | 流计算与消息(二):在流计算中使用Kafka链接计算任务
上节我们一起实现了一个流计算的例子,并通过这个例子学习了流计算的实现原理。我们知道,流计算框架本身是个分布式系统,一般由多个节点组成一个集群。我们的计算任务在计算集群中运行的时候,会被拆分成多个子任务,这些子任务也是分布在集群的多个计算节点上的。大部分流计算平台都会采用存储计算分离的设计,将计算任务的状态保存在 HDFS 等分布式存储系统中。每个子任务将状态分离出去之后,就变成了无状态的节点,如果某一个计算节点发生宕机,使用集群中任意一个节点都可以替代故障节点。原创 2024-02-12 15:10:43 · 827 阅读 · 0 评论 -
29 | 流计算与消息(一):通过Flink理解流计算的原理
接下来,我们用 Flink 来实现一个实时统计任务:接收 NGINX 的 access.log,每 5 秒钟按照 IP 地址统计 Web 请求的次数。这个统计任务它一个非常典型的,按照 Key 来进行分类汇总的统计任务,并且汇总是按照一定周期来实时进行的,我们日常工作中遇到的很多统计分析类的需求,都可以套用这个例子的模式来实现,所以我们就以它为例来做一个实现。原创 2024-02-12 14:31:26 · 1112 阅读 · 0 评论 -
28 | 答疑解惑(二):我的100元哪儿去了?
今天这节,是我们的“消息队列第二阶段进阶篇的最后一节课,照例,我们在每一阶段的最后,安排一节课进行热点问题的答疑,针对同学们遇到的一些共同的问题,统一来进行详细的解答。原创 2024-02-12 13:26:59 · 814 阅读 · 0 评论 -
27 | Pulsar的存储计算分离设计:全新的消息队列设计思路
之前的课程,我们大部分时间都在以 RocketMQ、Kafka 和 RabbitMQ 为例,通过分析源码的方式,来讲解消息队列的实现原理。原因是,这三种消息队列在国内的受众群体非常庞大,大家在工作中会经常用到。这节介绍一个不太一样的开源消息队列产品:Apache Pulsar。Pulsar 也是一个开源的分布式消息队列产品,最早是由 Yahoo 开发,现在是 Apache 基金会旗下的开源项目。你可能会觉得好奇,我们的课程中为什么要花一节来讲 Pulsar 这个产品呢?原创 2024-02-12 12:54:36 · 1370 阅读 · 0 评论 -
26 | MQTT协议:如何支持海量的在线IoT设备?
MQTT 是专门为物联网设备设计的一套标准的通信协议。这套协议在消息模型和功能上与普通的消息队列协议是差不多的,最大的区别在于应用场景不同。在物联网应用场景中,IoT 设备性能差,网络连接不稳定。服务端面临的挑战主要是,需要支撑海量的客户端和主题。已有的开源的 MQTT 产品,对于协议的支持都不错,在客户端数量小于十万级别的情况下,可以选择。对于海量客户端的场景,服务端必须使用集群来支撑,可以选择收费的云服务和企业版产品。也可以选择自行来构建 MQTT 集群。原创 2024-02-12 11:15:46 · 1421 阅读 · 0 评论 -
25 | RocketMQ与Kafka中如何实现事务?
在之前《04 | 如何利用事务消息实现分布式事务?》这节中,通过一个小例子来和大家讲解了如何来使用事务消息。很多同学都提出来,非常想了解一下事务消息到底是怎么实现的。不仅要会使用,还要掌握实现原理,这种学习态度,一直是我们非常提倡的,这节,我们就一起来学习一下,在 RocketMQ 和 Kafka 中,事务消息分别是如何来实现的?原创 2024-02-12 10:39:43 · 956 阅读 · 0 评论 -
24 | Kafka的协调服务ZooKeeper:实现分布式系统的“瑞士军刀”
上节一起学习了 RocketMQ NameServer 的源代码,RocketMQ 的 NameServer 虽然设计非常简洁,但很好地解决了路由寻址的问题。而 Kafka 却采用了完全不同的设计思路,它选择使用 ZooKeeper 这样一个分布式协调服务来实现和 RocketMQ 的 NameServer 差不多的功能。这节先简单了解一下 ZooKeeper,然后再来一起学习一下 Kafka 是如何借助 ZooKeeper 来构建集群,实现路由寻址的。原创 2024-02-12 10:07:22 · 1153 阅读 · 0 评论 -
23 | RocketMQ客户端如何在集群中找到正确的节点?
我们在《21 | RocketMQ Producer 源码分析:消息生产的实现过程》这节中,讲解 RocketMQ 的生产者启动流程时提到过,生产者只要配置一个接入地址,就可以访问整个集群,并不需要客户端配置每个 Broker 的地址。RocketMQ 会自动根据要访问的主题名称和队列序号,找到对应的 Broker 地址。如果 Broker 发生宕机,客户端还会自动切换到新的 Broker 节点上,这些对于用户代码来说都是透明的。原创 2024-02-11 13:36:24 · 913 阅读 · 0 评论 -
22 | Kafka和RocketMQ的消息复制实现的差异点在哪?
这节课我们主要来讲了一下,消息复制需要面临的问题以及 RocketMQ 和 Kafka 都是如何应对这些问题来实现复制的。RocketMQ 提供新、老两种复制方式:传统的主从模式和新的基于 Dledger 的复制方式。传统的主从模式性能更好,但灵活性和可用性稍差,而基于 Dledger 的复制方式,在 Broker 故障的时候可以自动选举出新节点,可用性更好,性能稍差,并且资源利用率更低一些。原创 2024-02-11 13:16:09 · 1075 阅读 · 0 评论 -
21 | Kafka Consumer源码分析:消息消费的实现过程
我们在上节中提到过,用于解决消息队列一些常见问题的知识和原理,最终落地到代码上,都包含在收、发消息这两个流程中。对于消息队列的生产和消费这两个核心流程,在大部分消息队列中,它实现的主要流程都是一样的,所以,通过这两节的学习之后,掌握了这两个流程的实现过程。无论你使用的是哪种消息队列,遇到收发消息的问题,都可以用同样的思路去分析和解决问题。原创 2024-02-11 11:50:24 · 1329 阅读 · 0 评论 -
20 | RocketMQ Producer源码分析:消息生产的实现过程
对于消息队列来说,它最核心的功能就是收发消息。也就是消息生产和消费这两个流程。我们在之前的课程中提到了消息队列一些常见问题,比如,“如何保证消息不会丢失?”“为什么会收到重复消息?”“消费时为什么要先执行消费业务逻辑再确认消费?”,针对这些问题,讲过它们的实现原理,这些最终落地到代码上,都包含在这一收一发两个流程中。在接下来的两节中,会一起通过分析源码的方式,详细学习一下这两个流程到底是如何实现的。原创 2024-02-11 10:53:24 · 873 阅读 · 0 评论 -
19 | 数据压缩:时间换空间的游戏
这节我们一起来聊一聊数据压缩。在前面文章中提到过,曾经在一台配置比较高的服务器上,对 Kafka 做过一个极限的性能压测,想验证一下 Kafka 到底有多快。使用的种子消息大小为 1KB,只要是并发数量足够多,不开启压缩时,可以打满万兆网卡的全部带宽,TPS 接近 100 万。开启压缩时,TPS 可以达到 2000 万左右,吞吐量提升了大约 20 倍!原创 2024-02-11 10:24:09 · 784 阅读 · 0 评论 -
18 | 如何用硬件同步原语(CAS)替代锁?
为什么硬件同步原语可以替代锁呢?要理解这个问题,要首先知道硬件同步原语是什么。硬件同步原语(Atomic Hardware Primitives)是由计算机硬件提供的一组原子操作,我们比较常用的原语主要是 CAS 和 FAA 这两种。CAS(Compare and Swap),它的字面意思是:先比较,再交换。*p ← new它的输入参数一共有三个,分别是:p: 要修改的变量的指针。old: 旧值。new: 新值。返回的是一个布尔值,标识是否赋值成功。原创 2024-02-11 10:10:53 · 905 阅读 · 0 评论 -
17 | 如何正确使用锁保护共享数据,协调异步线程?
在前面的文章中讲到,JMQ 为了提升整个流程的处理性能,使用了一个“近乎无锁”的设计,这里面其实隐含着两个信息点。第一个是,在消息队列中,“锁”是一个必须要使用的技术。第二个是,使用锁其实会降低系统的性能。那么,如何正确使用锁,又需要注意哪些事项呢?今天我们就来聊一聊这个问题。我们知道,使用异步和并发的设计可以大幅提升程序的性能,但我们为此付出的代价是,程序比原来更加复杂了,多线程在并行执行的时候,带来了很多不确定性。原创 2024-02-10 23:57:05 · 898 阅读 · 0 评论 -
16 | 缓存策略:如何使用缓存来减少磁盘IO?
这节,我们一起来聊一聊缓存策略。现代的消息队列,都使用磁盘文件来存储消息。因为磁盘是一个持久化的存储,即使服务器掉电也不会丢失数据。绝大多数用于生产系统的服务器,都会使用多块儿磁盘组成磁盘阵列,这样不仅服务器掉电不会丢失数据,即使其中的一块儿磁盘发生故障,也可以把数据从其他磁盘中恢复出来。使用磁盘的另外一个原因是,磁盘很便宜,这样我们就可以用比较低的成本,来存储海量的消息。所以,不仅仅是消息队列,几乎所有的存储系统的数据,都需要保存到磁盘上。但是,磁盘它有一个致命的问题,就是读写速度很慢。它有多慢呢。原创 2024-02-10 23:54:19 · 1059 阅读 · 1 评论 -
15 | Kafka如何实现高性能IO?
Apache Kafka 是一个高性能的消息队列,在众多消息队列产品中,Kafka 的性能绝对是处于第一梯队的。我曾经在一台配置比较好的服务器上,对 Kafka 做过极限的性能压测,Kafka 单个节点的极限处理能力接近每秒钟 2000 万条消息,吞吐量达到每秒钟 600MB。你可能会问,Kafka 是如何做到这么高的性能的?我们在专栏“进阶篇”的前几节课,讲的知识点一直围绕着同一个主题:怎么开发一个高性能的网络应用程序。原创 2024-02-10 23:53:37 · 994 阅读 · 0 评论 -
JMQ的Broker是如何异步处理消息的?
有一些同学不太理解,为什么在进阶篇中要讲这些“看起来和消息队列关系不大的”内容呢?在这里,分享一下这门课程的设计思路。希望在学习完之后,不仅仅只是成为一个使用消息队列的高手,而是消息队列的高手。所以我们在设计课程的时候,分了基础篇、进阶篇和案例篇三部分。基础篇中我们给大家讲解消息队列的原理和一些使用方法,重点是让大家学会使用消息队列。在进阶篇中,我们设计的重点是讲解实现消息队列必备的技术知识,通过分析源码讲解消息队列的实现原理。。原创 2024-02-10 23:46:21 · 1000 阅读 · 0 评论 -
14 | 内存管理:如何避免内存溢出和频繁的垃圾回收?
今天,我们来聊一聊内存管理的问题。不知道你有没有发现,在高并发、高吞吐量的极限情况下,简单的事情就会变得没有那么简单了。一个业务逻辑非常简单的微服务,日常情况下都能稳定运行,为什么一到大促就卡死甚至进程挂掉?再比如,一个做数据汇总的应用,按照小时、天这样的粒度进行数据汇总都没问题,到年底需要汇总全年数据的时候,没等数据汇总出来,程序就死掉了。之所以出现这些情况,大部分的原因是,程序在设计的时候,没有针对高并发高吞吐量的情况做好内存管理。要想解决这类问题,首先你要了解内存管理机制。原创 2024-02-10 23:40:31 · 947 阅读 · 0 评论 -
13 | 传输协议:应用程序之间对话的语言
经过前面几节的学习,我们已经可以实现高性能的结构化数据传输了。不过,应用程序之间要想互相通信,一起配合来实现业务功能,还需要有一套传输协议来支持。。设计传输协议,并没有太多规范和要求,只要是通信双方的应用程序都能正确处理这个协议,并且没有歧义就好了。这节,我们就来说一下设计高性能传输协议的一些方法和技巧。原创 2024-02-10 23:08:11 · 836 阅读 · 0 评论 -
12 | 序列化与反序列化:如何通过网络传输结构化的数据?
有一些同学说,感觉这几节课讲的内容和消息关系不大。这里解释一下,因为我们课程其中的一个目的,是让同学们不仅会使用消息队列,还可以通过对消息队列的学习,在代码能力上有一个提升,具备“造轮子”的能力。这样,对消息队列的理解才能足够的深入,而不只是浮于表面。如果细心可能也会发现,很多大厂在面试时,提到消息队列的问题,也不会仅仅局限在消息队列的使用上,他更多的会考察“你为什么这么实现”。所以在进阶篇的上半部分,会把开发一个消息队列需要用到的一些底层的关键技术给大家讲解清楚,然后我们再来一起分析消息队列的源代码。原创 2024-02-10 13:03:53 · 924 阅读 · 0 评论 -
11 | 如何实现高性能的异步网络传输?
上一节我们学习了异步的线程模型,异步与同步模型最大的区别是,同步模型会阻塞线程等待资源,而异步模型不会阻塞线程,它是等资源准备好后,再通知业务代码来完成后续的资源处理逻辑。这种异步设计的方法,可以很好地解决 IO 等待的问题。我们开发的绝大多数业务系统,都是 IO 密集型系统。跟 IO 密集型系统相对的另一种系统叫计算密集型系统。通过这两种系统的名字,估计你也能大概猜出来 IO 密集型系统是什么意思。原创 2024-02-10 12:46:54 · 1033 阅读 · 0 评论 -
10 | 如何使用异步设计提升系统性能?
对于开发者来说,异步是一种程序设计的思想,使用异步模式设计的程序可以显著减少线程等待,从而在高吞吐量的场景中,极大提升系统的整体性能,显著降低时延。因此,像消息队列这种需要超高吞吐量和超低时延的中间件系统,在其核心流程中,一定会大量采用异步的设计思想。接下来,我们一起来通过一个非常简单的例子学习一下,使用异步设计是如何提升系统性能的。原创 2024-02-10 11:42:10 · 1200 阅读 · 0 评论 -
09 | 学习开源代码该如何入手?
对于很多开源软件来说,如果我们把它作为我们业务系统的重要组成部分之一,真正地用于生产,仅仅知道如何使用是远远不够的,你必须掌握它的实现原理和很多细节,这样才能找到最佳的使用姿势,当你的系统出现问题时,你才有可能基于它的实现原理,再根据一些现象来排查问题原因。掌握这些开源软件的最佳方式就是去学习它的源代码。很多同学跟我说:“我也很想去看一些开源软件的代码,也尝试去看过,但是面对上千个源码文件,几十万行代码,完全不知道从哪儿入手啊。这节我们就针对这个情况来聊一聊,学习开源软件的代码该如何入手。原创 2024-02-10 11:15:02 · 1020 阅读 · 0 评论 -
08 | 答疑解惑(一) : 网关如何接收服务端的秒杀结果?
很多同学留言提出来,能不能讲一讲某个消息队列的某个功能具体如何配置。我的建议是,先不要太关注功能、API 和配置这些细节,在学习如何使用消息队列的过程中,要保持一定的高度来学习。因为使用消息队列,大部分的难点在宏观架构层面,要解决这些难点,需要掌握消息队列宏观层面上的实现原理和最佳实践,这样,无论使用什么消息队列,都可以做到游刃有余。在选定了合适的消息队列产品,准备写代码之前,再去文档中查看这些细节都来得及。所以,我们专栏的“基础篇”讲消息队列的使用,更多讲的是一些通用的原理。原创 2024-02-10 10:57:52 · 897 阅读 · 0 评论 -
07 | 消息积压了该如何处理?
这节课我们来聊一聊关于消息积压的问题。据我了解,在使用消息队列遇到的问题中,消息积压这个问题,应该是最常遇到的问题了,并且,这个问题还不太好解决。我们都知道,消息积压的直接原因,一定是系统中的某个部分出现了性能问题,来不及处理上游发送的消息,才会导致消息积压。所以,我们先来分析下,在使用消息队列时,如何来优化代码的性能,避免出现消息积压。然后再来看看,如果你的线上系统出现了消息积压,该如何进行紧急处理,最大程度地避免消息积压对业务的影响。原创 2024-02-09 20:24:04 · 875 阅读 · 0 评论 -
06 | 如何处理消费过程中的重复消息?
上节我们讲了如何确保消息不会丢失,留了一个思考题,如果消息重复了怎么办?这节,我们就来聊一聊如何处理重复消息的问题。在消息传递过程中,如果出现传递失败的情况,发送方会执行重试,重试的过程中就有可能会产生重复的消息。对使用消息队列的业务系统来说,如果没有对重复消息进行处理,就有可能会导致系统的数据出现错误。比如说,一个消费订单消息,统计下单金额的微服务,如果没有正确处理重复消息,那就会出现重复统计,导致统计结果错误。你可能会问,如果消息队列本身能保证消息不重复,那应用程序的实现不就简单了?原创 2024-02-09 20:16:54 · 759 阅读 · 0 评论 -
05 | 如何确保消息不会丢失?
对于刚刚接触消息队列的同学,最常遇到的问题,也是最头痛的问题就是丢消息了。对于大部分业务系统来说,丢消息意味着数据丢失,是完全无法接受的。其实,现在主流的消息队列产品都提供了非常完善的消息可靠性保证机制,完全可以做到在消息传递过程中,即使发生网络中断或者硬件故障,也能确保消息的可靠传递,不丢消息。绝大部分丢消息的原因都是由于开发者不熟悉消息队列,没有正确使用和配置消息队列导致的。虽然不同的消息队列提供的 API 不一样,相关的配置项也不同,但是在保证消息可靠传递这块儿,它们的实现原理是一样的。原创 2024-02-09 20:09:34 · 894 阅读 · 0 评论 -
04 | 如何利用事务消息实现分布式事务?
那什么是事务呢?如果我们需要对若干数据进行更新操作,为了保证这些数据的完整性和一致性,我们希望这些更新操作要么都成功,要么都失败。至于更新的数据,不只局限于数据库中的数据,可以是磁盘上的一个文件,也可以是远端的一个服务,或者以其他形式存储的数据。这就是通常我们理解的事务。其实这段对事务的描述不是太准确也不完整,但是,它更易于理解,大体上也是正确的。所以我还是倾向于这样来讲“事务”这个比较抽象的概念。一个严格意义的事务实现,应该具有 4 个属性:原子性、一致性、隔离性、持久性。原创 2024-02-09 19:47:12 · 1068 阅读 · 0 评论 -
03 | 消息模型:主题和队列有什么区别?
这节我们来学习消息队列中像队列、主题、分区等基础概念。这些基础的概念,就像我们学习一门编程语言中的基础语法一样,只有搞清楚它们,才能进行后续的学习。如果你研究过超过一种消息队列产品,你可能已经发现,每种消息队列都有自己的一套消息模型,像队列(Queue)、主题(Topic)或是分区(Partition)这些名词概念,在每个消息队列模型中都会涉及一些,含义还不太一样。为什么出现这种情况呢?因为没有标准。曾经,也是有一些国际组织尝试制定过消息相关的标准,比如早期的 JMS 和 AMQP。原创 2024-02-09 13:42:38 · 961 阅读 · 0 评论 -
02 | 该如何选择消息队列?
在了解了上面这些开源消息队列各自的特点和优劣势后,相信你对于消息队列的选择已经可以做到心中有数了。也总结了几条选择的建议供你参考。如果说,消息队列并不是你将要构建系统的主角之一,你对消息队列功能和性能都没有很高的要求,只需要一个开箱即用易于维护的产品,建议使用 RabbitMQ。如果你的系统使用消息队列主要场景是处理在线业务,比如在交易系统中用消息队列传递订单,那 RocketMQ 的低延迟和金融级的稳定性是你需要的。原创 2024-02-09 12:24:09 · 846 阅读 · 0 评论 -
01 | 为什么需要消息队列?
今天我们来讲讲为什么需要消息队列,消息队列主要解决的是什么问题。消息队列是最古老的中间件之一,从系统之间有通信需求开始,就自然产生了消息队列。但是给消息队列下一个准确的定义却不太容易。我们知道,消息队列的主要功能就是收发消息,但是它的作用不仅仅只是解决应用之间的通信问题这么简单。我们举个例子说明一下消息队列的作用。话说小袁是一家巧克力作坊的老板,生产出美味的巧克力需要三道工序:首先将可可豆磨成可可粉,然后将可可粉加热并加入糖变成巧克力浆,最后将巧克力浆灌入模具,撒上坚果碎,冷却后就是成品巧克力了。原创 2024-02-09 12:08:45 · 826 阅读 · 0 评论 -
预习 | 怎样更好地学习这门课?
从系统之间有通信需求开始呢,就产生了消息队列,它也是最古老的中间件之一。它的应用场景非常广泛,分布式系统中的很多进程间通信问题,都可以用消息队列来解决。可以说消息队列是所有后端程序员的必备技能。但是,想要系统、深入地学习消息队列,却并不容易。市面上消息队列的论坛社区不少,但是信息错综混杂,你想要了解消息队列的完整知识体系,想深度进阶为消息队列达人,却没有清晰的学习路径可寻。为此,开通这个系列课程,希望能帮助你完善知识体系,从理论到实践,从基础到进阶,从深度到广度,全方位吃透消息队列,进阶为消息队列小达人。原创 2024-02-09 11:37:55 · 935 阅读 · 0 评论 -
开篇词 | 优秀的程序员,技术栈中不能只有“增删改查”
虽然说这是一门有点儿技术难度的课程,但只要坚持学习,完整跟下来我们的课程,课后多思考,多练习(所有的知识点最终还是要落实到代码上),相信你对消息队列的掌握情况、代码能力和架构能力都将会有一个质的飞跃。最后,希望立个 Flag,写下学习计划或目标,有人一起互相监督,互相鼓励,好的学习方法和心得也可以互相借鉴。当完整学完所有内容之后,再来回顾当初的目标和计划,相信你会为自己的这段学习旅程感到骄傲。原创 2024-02-09 11:37:14 · 358 阅读 · 0 评论
分享