消息中间件系列第1讲:为什么要用消息队列?

消息队列中间件可以说是Java开发中最常使用的一块技术了,基本上上了规模的系统都会使用消息队列来优化系统架构。那么为什么要使用消息队列?我们使用消息队列来解决什么问题呢?

消息队列的优点

对于大多数系统来说,我们使用消息队列来做下面三件事情:解耦、削峰、异步。[1]

第一个作用:解耦。

在多个系统中,如果使用传统模式来做,那么使用传统模式将是这样的:

传统模式的缺点:系统间耦合性太强,如上图所示,系统A在代码中直接调用系统B和系统C的代码。如果将来D系统接入,系统A还需要修改代码,过于麻烦!

但是如果我们中间件改造一下,那么架构图如下:

使用消息中间件后,我们将消息写入消息队列,需要消息的系统自己从消息队列中订阅,从而系统A不需要做任何修改。

第二个作用:异步。

传统模式下我们出息消息使用串行的方式,一些非必要的业务逻辑以同步的方式运行,太耗费时间。

如果我们使用消息中间件方式,将消息写入消息队列,非必要的业务逻辑以异步的方式运行,加快响应速度。

第三个作用:削峰。

在传统架构中,遇到并发量大的时候,所有的请求直接怼到数据库,造成数据库连接异常中间件模

但如果使用了消息中间件,系统A慢慢的按照数据库能处理的并发量,从消息队列中慢慢拉取消息。在生产中,这个短暂的高峰期积压是允许的。

除了上面说到的三大作用,其实消息队列还有其它作用,例如:可以持久化数据,保证消息之间的顺序等等。如果想了解更多消息队列的作用,可以参考文末资料[2]。

消息队列的缺点

说了这么多使用消息队列的好处,但其实消息队列也不是万能的,它也有一些缺点。

  • 系统复杂性增加。 一个系统如果直接将业务串行处理,那么只需要在一个系统中把代码写写写就好了。但如果引入消息队列,则要多考虑很多方面的问题,比如一致性问题、如何保证消息不被重复消费,如何保证保证消息可靠传输。因此,需要考虑的东西更多,系统复杂性增大。
  • 系统可用性降低。 你想啊,本来其他系统只要运行好好的,那你的系统就是正常的。现在你非要加个消息队列进去,那消息队列挂了,你的系统不是呵呵了。因此,系统可用性降低。

其实上面两个缺点导致的最终结果就是:系统研发成本增加。 引入消息队列后,你就必须要对大多数消息队列有个深入的理解,否则如何做技术选型呢?而消息队列本身也比较复杂,在短时间内无法完全理解。所以是否使用消息队列需要根据具体场景判断,而不是为了使用技术而用技术。

总结

本文讲了下面几个要点:

  • 消息队列的优点
  • 消息队列的缺点

看完之后,你应该能解答下面几个问题:

  • 我的系统到底要不要使用消息队列?

下篇,我们聊聊使用消息队列需要考虑的几个问题。

参考资料

原文地址:https://www.cnblogs.com/chanshuyi/p/message_queue_serial_01_why_use_message_queue.html

时间: 2024-10-09 18:35:24

消息中间件系列第1讲:为什么要用消息队列?的相关文章

消息中间件系列第2讲:如何进行消息队列选型?

要做技术选型,那么必须对现今的各个消息中间件有个深入的理解才能做技术选型.否则别人问你,你为什么要用这个消息中间件,你说不出个所以然来,怎么做架构师呢? 截止到目前为止,现在业界流行的消息队列中间件有:Redis.ActiveMQ.RabbitMQ.RocketMQ.Kafka.下面我们将逐个对他们进行分析介绍. Redis 在我们印象中,Redis 是一个 key-value 缓存中间件,而不是一个消息队列中间件.但事实上它本身支持 MQ 功能,所以完全可以当做一个轻量级的队列服务来使用.对于

JVM系列第4讲:从源代码到机器码,发生了什么?

在上篇文章我们聊到,无论什么语言写的代码,其到最后都是通过机器码运行的,无一例外.那么对于 Java 语言来说,其从源代码到机器码,这中间到底发生了什么呢?这就是今天我们要聊的. 如下图所示,编译器可以分为:前端编译器.JIT 编译器和AOT编译器.下面我们逐个讲解. 前端编译器:源代码到字节码 之前我们说到:对于 Java 虚拟机来说,其实际输入的是字节码文件,而不是 Java 文件.那么对于 Java 语言而言,其实怎么将 Java 代码转化成字节码文件的呢?我们知道在 JDK 的安装目录里

玩转算法系列--图论精讲 面试升职必备(Java版)

第1章 和bobo老师一起,玩转图论算法欢迎大家来到我的新课程:<玩转图论算法>.在这个课程中,我们将一起完整学习图论领域的经典算法,培养大家的图论建模能力.通过这个课程的学习,你将能够真正地,玩转图论算法:) 第2章 图的基本表示千里之行,驶于足下.解决任何有一个图论算法问题,首先需要用基本的数据结构来表示图.在这一章,我们就将探索图的基本表示问题,学习邻接矩阵和邻接表,进而,也让同学们熟悉这个课程的整体代码风格. 第3章 图的深度优先遍历任何一种数据结构,都需要进行遍历.图也不例外.通过深

消息中间件系列一:入门、JMS规范、ActiveMQ使用

一.入门 1. 消息中间件的定义 没有标准定义,一般认为,采用消息传送机制/消息队列 的中间件技术,进行数据交流,用在分布式系统的集成 2. 为什么要用消息中间件 解决分布式系统之间消息的传递.电商场景: 用户下单减库存,调用物流系统.随着业务量的增大,需要对系统进行拆分(服务化和业务拆分),拆分后的系统之间的交互一般用RPC(远程过程调用).如果系统扩充到有几十个接口,就需要用消息中间件来解决问题. 3. 消息中间件和RPC有什么区别 3.1 功能特点: 在架构上,RPC和Message的差异

消息中间件系列二:RabbitMQ入门(基本概念、RabbitMQ的安装和运行)

一.基本概念 1. AMQP AMQP,即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议.支持不同语言和不同的产品 2. 生产者 消息的创建者,发送到AMQP的消息中间件 3. 消费者 连接到AMQP的消息中间件,订阅到队列上,进行消息的消费.分为持续订阅(basicConsumer)和单条订阅(basicGet) 说明: 持续订阅:只要有消息就不断消费 单条订阅:消费过一条消息以后就不再消费了,要想继续消费消息,就得重新订阅

大型网站架构系列:消息队列(二)

本文是大型网站架构系列:消息队列(二),主要分享JMS消息服务,常用消息中间件(Active MQ,Rabbit MQ,Zero MQ,Kafka).[第二篇的内容大部分为网络资源的整理和汇总,供大家学习总结使用,最后有文章来源] 本次分享大纲 消息队列概述(见第一篇:大型网站架构系列:分布式消息队列(一)) 消息队列应用场景(见第一篇:大型网站架构系列:分布式消息队列(一)) 消息中间件示例(见第一篇:大型网站架构系列:分布式消息队列(一)) JMS消息服务 常用消息队列 参考(推荐)资料 本

大型网站架构系列:消息队列(二) (转)

本文是大型网站架构系列:消息队列(二),主要分享JMS消息服务,常用消息中间件(Active MQ,Rabbit MQ,Zero MQ,Kafka).[第二篇的内容大部分为网络资源的整理和汇总,供大家学习总结使用,最后有文章来源] 本次分享大纲 消息队列概述(见第一篇:大型网站架构系列:分布式消息队列(一)) 消息队列应用场景(见第一篇:大型网站架构系列:分布式消息队列(一)) 消息中间件示例(见第一篇:大型网站架构系列:分布式消息队列(一)) JMS消息服务 常用消息队列 参考(推荐)资料 本

大型网站架构系列:分布式消息队列(二)

本文是大型网站架构系列:消息队列(二),主要分享JMS消息服务,常用消息中间件(Active MQ,Rabbit MQ,Zero MQ,Kafka).[第二篇的内容大部分为网络资源的整理和汇总,供大家学习总结使用,最后有文章来源] 本次分享大纲 消息队列概述(见第一篇:大型网站架构系列:分布式消息队列(一)) 消息队列应用场景(见第一篇:大型网站架构系列:分布式消息队列(一)) 消息中间件示例(见第一篇:大型网站架构系列:分布式消息队列(一)) JMS消息服务 常用消息队列 参考(推荐)资料 本

大型网站架构系列:消息队列(二)(转)

大型网站架构系列:消息队列(二) 本文是大型网站架构系列:消息队列(二),主要分享JMS消息服务,常用消息中间件(Active MQ,Rabbit MQ,Zero MQ,Kafka).[第二篇的内容大部分为网络资源的整理和汇总,供大家学习总结使用,最后有文章来源] 本次分享大纲 消息队列概述(见第一篇:大型网站架构系列:分布式消息队列(一)) 消息队列应用场景(见第一篇:大型网站架构系列:分布式消息队列(一)) 消息中间件示例(见第一篇:大型网站架构系列:分布式消息队列(一)) JMS消息服务