分布式消息中间件介绍

news2024/11/27 6:23:58

f77d875506b2485e9135d8b0fa2c9e02.jpg什么是分布式消息中间件?

 

 

对于分布式消息中间件,首先要了解两个基础的概念,即什么是分布式系统,什么又是中间件。

 

 

 

分布式系统

 

“A distributed system is one in which components located at networked computers communicate and coordinate their actions only by passing messasges.”——《Distributed Systems Concepts and Design》

 

 

 

从上面这个解释可以得到分布式系统的两个特点:

 

组件分布在网络计算机上

 

组件之间通过消息来协调行动

 

中间件

 

Middleware is computer software that provides services to software applications beyond those available from the operating system. It can be described as "software glue". Middleware makes it easier for software developers to implement communication and input/output, so they can focus on the specific purpose of their application.——维基百科

 

 

 

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

 

 

 

从维基百科上对中间件的解释感觉有点绕,其实可以从“空间”的角度去理解中间件,即中间件是处于“中间层”的组件,是上层的应用程序和底层的服务之间的桥梁(比如DB中间件的上层是应用程序,底层是DB服务),也是应用与应用之间的桥梁(比如分布式服务组件)。

 

 

 

分布式消息中间件

 

“Message-oriented middleware (MOM) is software or hardware infrastructure supporting sending and receiving messages between distributed systems.”——维基百科

 

 

 

维基百科给出的消息中间件的定义是支持在分布式系统中发送和接受消息的硬件或软件基础设施(对我们这里讨论的范围来说肯定就是软件了)。

 

 

 

那么分布式消息中间件其实就是指消息中间件本身也是一个分布式系统。

 

 

 

消息中间件能做什么?

 

任何中间件必然都是要去解决特定领域的某个问题,消息中间件解决的就是分布式系统之间消息传递的问题。消息传递是分布式系统必然要面对的一个问题。

 

 

 

假设一个电商交易的场景,用户下单之后调用库存系统减库存,然后需要调用物流系统进行发货,如果交易、库存、物流是属于一个系统的,那么就是接口调用。但是随着系统的发展,各个模块越来越庞大、业务逻辑越来越复杂,必然是要做服务化和业务拆分的。这个时候就需要考虑这些系统之间如何交互,第一反应就是RPC(Remote Procedure Call)。系统继续发展,可能一笔交易后续需要调用几十个接口来执行业务,比如还有风控系统、短信服务等等。这个时候就需要消息中间件登场来解决问题了。

 

 

 

笔者认为,RPC和消息中间件的场景的差异很大程度上在于就是“依赖”和“量”。比如短信通知服务并不是事交易环节必须的,并不影响下单流程,不是强依赖,所以交易系统不应该依赖短信服务。比如一些数据分析程序可能需要在拿到一天的总销售量,这个就只需要销售中心提供接口在需要时调用即可。

 

 

 

消息中间件出现以后对于交易场景可能是调用库存中心等强依赖系统执行业务,之后发布一条消息(这条消息存储于消息中间件中)。像是短信通知服务、数据统计服务等等都是依赖于消息中间件去消费这条消息来完成自己的业务逻辑。

 

 

 

从以上的场景可以看出消息中间件其实就是对系统进行了解耦,同时带来了异步化等好处。

 

 

 

简单概括一下消息中间件的应用场景大致如下:

 

业务解耦:交易系统不需要知道短信通知服务的存在,只需要发布消息

 

削峰填谷:比如上游系统的吞吐能力高于下游系统,在流量洪峰时可能会冲垮下游系统,消息中间件可以在峰值时堆积消息,而在峰值过去后下游系统慢慢消费消息解决流量洪峰的问题

 

事件驱动:系统与系统之间可以通过消息传递的形式驱动业务,以流式的模型处理

 

 

 

分布式消息中间件长什么样?

 

 

 

一个抽象的对分布式消息中间件的认知大概是这样:

 

有一个SDK,提供给业务系统发送、消费消息的接口

 

有一批Server节点用于接受和存储消息,并在合适的时候发送给下游的系统进行消费

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

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

相关文章

Maven的Web项目创建

1.创建动态Web项目 2.把项目转为Maven项目 然后就可在pom.xml中加入自己的依赖

Lua gc 机制版本迭代过程简述

文章目录 内存自动化管理的概念Lua 中的 gc 对象Lua 中内存分配和释放的底层接口Lua 5.0 gc 算法Lua 5.1 gc 算法Lua 5.2 - Lua 5.4 gc 算法参考内容 内存自动化管理的概念 内存自动化管理是指在指定内存不再被需要时可以自动被释放。通常有两种方案来实现内存的自动化管理&am…

FFmpeg时间戳

1. I帧/P帧/B帧 I帧:I帧(Intra-coded picture, 帧内编码帧,常称为关键帧)包含一幅完整的图像信息,属于帧内编码图像,不含运动矢量,在解码时不需要参考其他帧图像。因此在I帧图像处可以切换频道,而不会导致…

康托展开逆康托展开详解(原理+Java实现)

康托展开&逆康托展开详解 康托展开康托展开公式康托展开代码 逆康托展开逆康托展开具体过程尼康托展开代码逆康托的应用 使用场景 康托展开 康托展开是一个全排列到一个自然数的双射,常用于构建哈希表时的空间压缩。 康托展开的实质是计算当前排列在所有由小到大…

【ADS】ADS复制原理图或版图到另一个工程

直接Ctrl CCtrl V无法粘贴 可以先导入要复制的工程 加入工程,复制完后在勾掉工程

RuoYi-VUE : make sure to provide the “name“ option

前言 略 错误 错误原因 theme-picker 组件未被注册。 解决 src/App.vue代码恢复成若依的代码即可。&#xff08;PS&#xff1a;不知道代码被谁修改了&#xff09; 缺少这一段&#xff1a; <script> import ThemePicker from "/components/ThemePicker";…

基础IO与文件系统

全文目录 C语言的文件操作函数系统调用接口openwritereadclose Linux中一切皆文件文件描述符重定向 缓冲区为什么fflush能直接找到缓冲区进行刷新 文件系统 C语言的文件操作函数 参考文章&#xff1a; C语言文件操作【基础知识 顺序读写 文件版通讯录】C语言文件操作收尾【…

FPGA工程中eclipse软件常见的错误

错误一&#xff1a; Unresolved inclusion: "altera_avalon_uart_regs.h" Unresolved inclusion: "system.h"Description Resource Path Location Type Type alt_u8 could not be resolved hello_world.c /UART line 37 Semantic Error描述&#xff1a;这个…

【计算机网络 02】物理层基本概念 传输媒体 传输方式 编码与调制 信道极限容量 章节小结

第二章 -- 物理层 2.1 物理层基本概念2.2 物理层下的传输媒体2.3 传输方式2.4 编码与调制2.5 信道极限容量2.6 章节小结 2.1 物理层基本概念 2.2 物理层下的传输媒体 传输媒体也称为传输介质或传输媒介&#xff0c;他就是数据传输系统中在发送器和接收器之间的物理通路 传输媒…

统信UOS安装nginx及其所需部件

/usr/local 为Linux默认软件安装路径&#xff0c;类似于C:\Program Files。 因此在local路径下新建nginx文件夹安装nginx。 下载并安装nginx &#xff08;1&#xff09;进入nginx文件夹下&#xff0c;使用 wget 命令下载nginx资源包 命令&#xff1a;wget http://nginx.org/…

微服务——http客户端Feign

目录 Restemplate方式调用存在的问题 Feign的介绍 基于Feign远程调用 Feign自定义配置 修改日志方式一(基于配置文件) 修改日志方式二(基于java代码) Feign的性能优化 连接池使用方法 Feign_最佳实践分析 方式一: 方式二 实现Feign最佳实践(方式二) 两种解决方案 Re…

Kubernetes教程(三)---纯三层网络方案

来自&#xff1a;指月 https://www.lixueduan.com 原文&#xff1a;https://www.lixueduan.com/posts/kubernetes/02-cluster-network/ 由于 COPY 过来图片无法展示&#xff0c;建议跳转到原文查看 本文主要介绍了 Kubernetes 中的 Pure Layer 3 网络方案。其中的典型例子&…

msvcp120.dll丢失的解决方法,msvcp120.dll一键修复方法

最近我遇到了一个让我头疼的问题&#xff0c;那就是在使用某个软件时出现了msvcp120.dll文件缺失的错误。这个错误导致我无法正常运行该软件&#xff0c;给我的工作和生活带来了很大的困扰。 起初&#xff0c;我尝试了一些简单的解决方法&#xff0c;比如重新安装软件、重启电脑…

Appium+python自动化(十八)- - Monkey事件

操作事件简介 Monkey所执行的随机事件流中包含11大事件&#xff0c;分别是触摸事件、手势事件、二指缩放事件、轨迹事件、屏幕旋转事件、基本导航事件、主要导航事件、系统按键事件、启动Activity事件、键盘事件、其他类型事件。Monkey通过这11大事件来模拟用户的常规操作&…

机器学习 深度学习编程笔记

sigmoid函数 def sigmoid(x):return 1.0 / (1np.exp((-x)))定义最小平方和损失函数 loss torch.nn.MSELoss()线性回归编程 如果不加噪音就成了正常的线性函数了&#xff0c;所以要加噪音。 torch.normal(0, 0.01, y.shape)torch.normal(0, 0.01, y.shape)是一个用于生成服从…

Vue 复杂json数据在el-table表格中展示(el-table分割数据)

文章目录 前言问题背景实现复杂json数据在el-table表格展示el-table-column分割线el-table-column高度 前言 在做复杂的动态表单&#xff0c;实现业务动态变动&#xff0c;比如有一条需要动态添加的el-form-item中包含了多个输入框&#xff0c;并实现表单验证&#xff0c;但在…

智慧税务大厅业务办理vr模拟体验提升缴税效率和质量

目前的税务部门的办事大厅&#xff0c;承载着纳税人的各种税务事项的办理&#xff0c;业务量较大&#xff0c;特别是窗口工作人员&#xff0c;在税务办理的高峰期&#xff0c;经常会遇到人手不够的情况&#xff0c;如果能够将vr技术应用的税务办理的环节中&#xff0c;让使用者…

FPGA FIFO——IP核

文章目录 前言一、FIFO1、区别2、分类 二、单时钟&多时钟FIFO框图三、FIFO IP 核配置四、源码1、fifo_wr(写模块)2、fifo_rd(读模块)3、ip_fifo(顶层文件) 五、仿真1、仿真文件2、波形分析 六、SignalTap II在线验证七、总结八、参考资料 前言 环境&#xff1a; 1、Quartus…

python与深度学习(六):CNN和手写数字识别二

目录 1. 说明2. 手写数字识别的CNN模型测试2.1 导入相关库2.2 加载数据和模型2.3 设置保存图片的路径2.4 加载图片2.5 图片预处理2.6 对图片进行预测2.7 显示图片 3. 完整代码和显示结果4. 多张图片进行测试的完整代码以及结果 1. 说明 本篇文章是对上篇文章训练的模型进行测试…

5.5.tensorRT基础(2)-封装插件过程,并实现更容易的插件开发

目录 前言1. 插件封装2. 补充知识总结 前言 杜老师推出的 tensorRT从零起步高性能部署 课程&#xff0c;之前有看过一遍&#xff0c;但是没有做笔记&#xff0c;很多东西也忘了。这次重新撸一遍&#xff0c;顺便记记笔记。 本次课程学习 tensorRT 基础-封装插件过程&#xff0c…