【消息中间件】为什么要用消息中间件?解决了什么问题?

news2024/11/25 13:25:11

文章目录

  • 前言
  • 一、什么是消息中间件?
  • 二、为什么使用?
  • 二、使用消息中间件前后对比
  • 三、当前几种中间件:
  • 四、使用消息中间件场景:

前言

一般认为,采用消息传送机制/消息队列 的中间件技术,进行数据交流,用在分布式系统的集成。

一、什么是消息中间件?

中间件被描述为为应用程序提供操作系统所提供的服务之外的服务,简化应用程序的通信、输入输出的开发,使他们专注于自己的业务逻辑。

消息中间件适用于需要可靠的数据传送的分布式环境。采用消息中间件机制的系统中,不同的对象之间通过传递消息来激活对方的事件,完成相应的操作。发送者将消息发送给消息服务器,消息服务器将消息存放在若干队列中,在合适的时候再将消息转发给接收者。消息中间件能在不同平台之间通信,它常被用来屏蔽掉各种平台及协议之间的特性,实现应用程序之间的协同,其优点在于能够在客户和服务器之间提供同步和异步的连接,并且在任何时刻都可以将消息进行传送或者存储转发,这也是它比远程过程调用RPC更进一步的原因。

二、为什么使用?

  1. 业务解耦,代码解耦:例如,订单业务需要发送短信、推送app通知信息、扣除会员积分、发送email等,如果把这些全部写在订单业务代码中,订单代码将会变得十分臃肿,不利于修改维护,事物管理十分麻烦,使用中间件就不会有上述问题。
  2. 同步变异步,加快业务响应时间,相对于RPC来说,异步通信使得生产者和消费者得以充分执行自己的逻辑而无需等待。
  3. 流量消峰,消息存储堆积也是消息中间件的核心,可堆积大量的消息,当上游系统的吞吐能力远高于下游系统,在流量洪峰时可能会冲垮下游系统,消息中间件可以在峰值时堆积消息,而在峰值过去后下游系统慢慢消费消息解决流量洪峰的问题,典型的场景就是秒杀系统的设计。
  4. 消息的顺序性,消息中间件采用的是队列技术,消息队列可以保证消息的先进先出,能保证消息顺序执行。
  5. 消息的可靠性,消息中间件有消费确认机制(ACK),在收到成功被消费的确认消息之后才会把消息从队列中删除,并且消息中间件有本地刷盘存储功能。
  6. 解决分布式事物复杂性。

二、使用消息中间件前后对比

在这里插入图片描述

上述未使用消息中间件,所有跟订单相关的业务全部放在订单服务中处理,订单服务臃肿繁琐。

在这里插入图片描述

使用消息中间件后,订单服务只需处理订单业务,其他相关的业务异步推送到消息中间件即可。

用户下单之后调用积分系统扣除用户积分,然后需要调用物流系统进行发货,如果交易、库存、积分是属于一个系统的,那么就是接口调用。但是随着系统的发展,各个模块越来越庞大、业务逻辑越来越复杂,必然是要做服务化和业务拆分的。这个时候就需要考虑这些系统之间如何交互,第一反应就是远程过程调用RPC。系统继续发展,可能一笔交易后续需要调用几十个接口来执行业务,比如还有风控系统、短信服务等,代码维护事物控制问题会随着业务的复杂难以控制,引入消息中间件就得以解决。

三、当前几种中间件:

阿里的经过双十一的rocketmq:吞吐量在11.6w/s

使用Erlang语言开发的rabbitmq:吞吐量5.95w/s

Apache出品的activemq:吞吐相对低

消息中间件可以说成和rpc有异曲同工之妙,rpc是即时调用即时响应,消息中间件有个缓冲步骤,不同场景不同选择。

在这里插入图片描述

四、使用消息中间件场景:

  1. 处理主线业务,分支业务可延时处理,例如下订单时,会附带其他很多分支业务。
    流量消峰,秒杀。
  2. 消息推送,推送通知至app。
  3. 异步任务,需要消耗一定时长的任务,例如文件处理,视频解码,替代多线程。
  4. 解决分布式事物

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/552089.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[CISCN 2019华东南]Web4 day5

考察:任意文件读取 获取网卡地址 伪随机 打开界面,点击read somethings直接进行了跳转 直接修改url,发现没显示,但是访问错误的路由就会有no response 读取flag也无果,那就读一下/app/app.py,为什么读这个&…

postgresql|数据库|插件学习(二)---postgresql-12的外置插件pg_profile的启用和使用

前言: postgresql数据库有非常多的插件,那么,pg_profile算是监控类的插件,该插件会通过内置的pg_stat_statements插件和dblink插件这两个插件监控查询postgresql的状态,并可以通过打快照的方式得到awr报告。 ###注&a…

攻防世界 wife_wife

查看提示:不需要爆破 进入到靶场中,发现需要注册用户 到达注册页面,is admin需要打勾,并输入同样 burpsuite抓包 原来payload:{"username":"1","password":"1","isAdmin…

MySQL数据库---笔记2

MySQL数据库---笔记2 一、函数1.1、字符串函数1.2、数值函数1.3、日期函数1.4、流程函数 二、约束2.1、概述2.2、演示2.3、外键约束 一、函数 函数 是指一段可以直接被另一段程序调用的程序或代码。 1.1、字符串函数 函数功能CONCAT(S1,S2,…Sn)字符串拼接,将S1&…

分布式医疗云平台【基础功能搭建、数据表定义、ERP业务表、系统表、其它配置表 】(三)-全面详解(学习总结---从入门到深化)

基础功能搭建 创建数据库 数据表定义 ERP业务表 系统表 其它配置表 基础功能搭建 创建数据库 执行脚本,创建基础数据 数据表定义 业务表 his_care_order: 药用处方表,涉及的业务模块:处方收费、处方发药、新开检查 his_care_history…

jetson填坑-单独安装cuda,cudnn,tensorrt任意适用版本

前言 jetson无法单独安装cuda,cudnn,tensorrt的解决方法,比下载SDK manager刷机安装简单好多倍 这个方法是直接下载deb包安装,deb包安装网站 https://repo.download.nvidia.com/jetson/ 单独安装cuda 1 sudo apt-get install …

ArcMap:第一届全国大学生GIS应用技能大赛(滁州学院)详解

目录 01 上午题 1.1 题目 1.2 数据 1.2.1 如何添加比赛数据? 1.2.2 比赛数据展示 1.3 思路 1.3.1 坐标系问题 1.4 实操 1.4.1 建立空间数据库和比赛数据导入 1.4.2 坐标系问题解决 1.4.3 要素的订正 1.4.4 数据入库和符号化管理; 1.4.5 其…

C++ thread编程(Linux系统为例)—thread成员函数

c 11 之后有了标准的线程库&#xff1a;std::thread。 参考thread库的使用 构造函数 thread的构造函数有下面四个重载 默认构造函数 thread() noexcept初始化构造函数 template <class Fn, class... Args> explicit thread (Fn&& fn, Args&&... arg…

HP-800G4-DM 电脑 Hackintosh 黑苹果efi引导文件

原文来源于黑果魏叔官网&#xff0c;转载需注明出处。&#xff08;下载请直接百度黑果魏叔&#xff09; 硬件型号驱动情况 主板HP 800G4 DM 35W 处理器intel i5-9600T已驱动 内存Samsung DDR4 2666 32G*2已驱动 硬盘WD SN750 500G已驱动 显卡intel UHD 630已驱动 声卡瑞昱…

SpringBoot项目中Controller层、Service层、Dao层、entity层、Configuration层、Utils层作用

SpringBoot项目中各层的作用 1、Controller层2、Service层3、Dao层&#xff08;Mapper层&#xff09;4、entity层&#xff08;model层&#xff09;5、Configuration层6、Utils层各层作用架构图 1、Controller层 Controller层为控制层&#xff0c;一般使用 RestController 或 C…

【Linux入门】Linux指令(2)

【Linux入门】Linux指令(2) 目录 【Linux入门】Linux指令(2)时间相关的指令cal指令find指令&#xff08;重要&#xff0c;选项很多&#xff09;-namegrep指令zip/unzip指令tar指令&#xff08;重要&#xff09;bc指令uname -r指令重要的几个热键[Tab],[ctrl]-c, [ctrl]-d关机&a…

车载软件架构——闲聊几句AUTOSAR OS(一)

我是穿拖鞋的汉子,魔都中坚持长期主义的工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 人们会在生活中不断攻击你。他们的主要武器是向你灌输对自己的怀疑:你的价值、你的能力、你的潜力。他们往往会将此伪装成客观意见,但无一例外的是,他们想…

transformers两个入门示例

根据《attention is all you need》论文而形成的transformers框架在chat-gpt应用中大放异彩&#xff0c;目前transformers框架已经成了炙手可热的框架。它不仅在nlp方面很作用很大&#xff0c;根据官网的介绍&#xff0c;它还可以做很多事情&#xff0c;比如图片分类&#xff0…

【SpringCloud】二、服务注册与发现 Eureka与Nacos

文章目录 一、Eureka1、服务提供者与消费者2、Eureka原理分析3、搭建Eureka4、服务注册5、模拟多服务实例启动6、服务的发现 二、Ribbon1、负载均衡的原理2、源码分析3、负载均衡策略 三、Nacos三、网关gateway1、网关的作用2、搭建网关服务 一、Eureka 1、服务提供者与消费者…

多源传感器GNSS INS 视觉 LiDAR 组合导航与SLAM开源项目总结

多源传感器GNSS INS 视觉 LiDAR 组合导航与SLAM开源项目总结 本文基于 吴桐wutong 微信公众号文章完善而来。 开源代码总览 名称传感器类型组合类型滤波方法备注RTKLIBG-KFGAMP、rtklibexplorerhttps://www.rtklib.com/GPSTKG-KFhttps://github.com/SGL-UT/GPSTkBNCG-KFppp_…

[MRCTF2020]Ez_bypass1

一打开就是一坨看起来像乱码的东西 查看源码才看的舒服点&#xff0c;原来是一串PHP代码 这么长一段&#xff0c;翻译起来还有点麻烦 首先第一个if语句 检测GET传参gg和id是否存在 如果不存在就输出’Please input first‘&#xff08;请先输入&#xff09;并利用die函数退出脚…

java boot项目基础配置之banner与日志配置演示 并教会你如何使用文档查看配置

上文 我们简单讲了一下 springboot 项目的配置 都是写在resources下的application.properties中 springboot 项目中 配置都写在这一个文件 可以说非常方便 不像之前 写个项目配置这里一个哪里一个 看到是非常费力 我们启动项目 这里有个图案 其实 这叫 banner 我们就用配置来…

从零开始:Java中如何定义和访问静态字段和方法

&#x1f9d1;‍&#x1f4bb;CSDN主页&#xff1a;夏志121的主页 &#x1f4cb;专栏地址&#xff1a;Java基础进阶核心技术专栏 目录 &#x1f377; 一、静态字段 &#x1f378; 二、静态常量 &#x1f379; 三、静态方法 &#x1f37a; 四、工厂方法 &#x1f964; 五、…

使用Vue完成一个户籍管理系统

js <template> <div> <h2>学籍管理系统</h2> <div> 姓名&#xff1a; <input v-model"user.name" /> </div> <div> 年龄&#xff1a; <input v-model"user.age" /> </div> <div> 性别…

python + windQuant:挑选公司

给定一些k线选股指标&#xff0c;如何挑选符合条件的公司&#xff0c;以python windquant为例&#xff1f; 【申明&#xff1a;本例只用来作为python学习交流之用&#xff0c;切勿以此作为投资的选股条件】 0、用以下条件挑选公司&#xff1a; 仅作示例用&#xff1a; 【1】…