消息中间件执行原理

news2025/1/21 8:51:28

1 关于消息中间件

1.1 什么是消息中间件?

消息中间件是指在分布式系统中完成消息的发送和接收的基础软件。 消息中间件也可以称消息队列(Message Queue / MQ),用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息队列模型,可以在分布式环境下扩展进程的通信。 简而言之,互联网场景中经常使用消息中间件进行消息路由、订阅发布、异步处理等操作,来缓解系统的压力。

1.2 它解决了我们哪些痛点?

1、解耦: 比如说系统A会交给系统B去处理一些事情,但是A不想直接跟B有关联,避免耦合太强,就可以通过在A,B中间加入消息队列,A将要任务的事情交给消息队列 ,B订阅消息队列来执行任务。

这种场景很常见,比如A是订单系统,B是库存系统,可以通过消息队列把削减库存的工作交予B系统去处理。如果A系统同时想让B、C、D...多个系统处理问题的时候,这种优势就更加明显了。

2、有序性: 先进先出原理,先来先处理,比如一个系统处理某件事需要很长一段时间,但是在处理这件事情时候,有其他人也发出了请求,可以把请求放在消息队里,一个一个来处理。

对数据的顺序性和一致性有强需求的业务,比如同一张银行卡同时被多个入口使用,需要保证入账出账的顺序性,避免出现数据不一致。

3、消息路由: 按照不同的规则,将队列中消息发送到不同的其他队列中

通过消息队列将不同染色的请求发送到不同的服务去操作。这样达成了流量按照业务拆分的目的。

4、异步处理: 处理一项任务的时候,有3个步骤A、B、C,需要先完成A操作, 然后做B、C 操作。任务执行成功与否强依赖A的结果,但不依赖B、C 的结果。 如果我们使用串行的执行方式,那处理任务的周期就会变长,系统的整体吞吐能力也会降低(在同一个系统中做异步其实也是比较大的开销),所以使用消息队列是比较好的办法。

登录操作就是典型的场景:A:执行登录并得到结果、B:记录登录日志、C:将用户信息和Token写入缓存。 执行完A就可以从登录页跳到首页了,B、C让服务慢慢去消化,不阻塞当前操作。

5、削峰: 将峰值期间的操作削减,比如A同学的整个操作流程包含12个步骤,后续的11个步骤是不需要强关注结果的数据,可以放在消息队列中。

2 消息中间件的执行原理

2.1 消息中间件的组成

Broker: 消息服务器,作为Server提供消息核心服务

Producer: 消息生产者,业务的发起方,负责生产消息传输给broker,

Consumer: 消息消费者,业务的处理方,负责从broker获取消息并进行业务逻辑处理

Topic: 主题,发布/订阅模式下的消息统一汇集地,不同生产者向topic发送消息,由MQ服务器分发到不同的订阅者,实现消息的广播

Queue: 队列,PTP模式下,特定生产者向特定queue发送消息,消费者订阅特定的queue完成指定消息的接收

Message: 消息体,根据不同通信协议定义的固定格式进行编码的数据包,来封装业务数据,实现消息的传输

这边以kafka为例子,这是典型的集群模式,Kafka通过Zookeeper管理集群配置,选举leader,以及在Consumer Group发生变化时进行rebalance。Producer使用push模式将消息发布到broker,Consumer使用pull模式从broker订阅并消费消息。

  • producer 负责生产消息
  • consumer 负责消费消息
  • broker 消息服务器,提供消息核心的处理工作
  • zookeeper 用于生产者和消费者的注册与发现

更多C++后台开发技术点知识内容包括C/C++,Linux,Nginx,ZeroMQ,MySQL,Redis,MongoDB,ZK,流媒体,音视频开发,Linux内核,TCP/IP,协程,DPDK多个高级知识点。

C/C++Linux服务器开发高级架构师/C++后台开发架构师​免费学习地址

【文章福利】另外还整理一些C++后台开发架构师 相关学习资料,面试题,教学视频,以及学习路线图,免费分享有需要的可以点击领取

2.2 消息中间件的模式分类

2.2.1 PTP点对点

使用queue作为通信载体,消息生产者生产消息发送到queue中,然后消息消费者从queue中取出并且消费消息。 消息被消费以后,queue中不再存储,所以消息消费者不可能消费到已经被消费的消息。 Queue支持存在多个消费者,但是对一个消息而言,只会有一个消费者可以消费。

点对点模式包含三个角色:

  • 消息队列(Queue)
  • 发送者(Sender)
  • 接收者(Receiver)

每个消息都被发送到一个特定的队列,接收者从队列中获取消息。队列保留着消息,可以放在内存 中也可以持久化,直到他们被消费或超时。

特点:

  • 每个消息只有一个消费者(Consumer)(即一旦被消费,消息就不再在消息队列中)
  • 发送者和接收者之间在时间上没有依赖性
  • 接收者在成功接收消息之后需向队列应答成功
  • 利用FIFO先进先出的特性,可以保证消息的顺序性。

2.2.2 Pub/Sub发布订阅(广播)

使用topic作为通信载体,消息生产者(发布)将消息发布到topic中,同时有多个消息消费者(订阅)消费该消息。和点对点方式不同,发布到topic的消息会被所有订阅者消费。 queue实现了负载均衡,将producer生产的消息发送到消息队列中,由多个消费者消费。但一个消息只能被一个消费者接受,当没有消费者可用时,这个消息会被保存直到有一个可用的消费者。

发布订阅模型包含三个角色:

  • 主题(Topic)
  • 发布者(Publisher)
  • 订阅者(Subscriber)

多个发布者将消息发送到Topic,系统将这些消息传递给多个订阅者。

特点:

  • 每个消息可以有多个消费者:和点对点方式不同,发布消息可以被所有订阅者消费
  • 发布者和订阅者之间有时间上的依赖性。
  • 针对某个主题(Topic)的订阅者,它必须创建一个订阅者之后,才能消费发布者的消息。
  • 为了消费消息,订阅者必须保持运行的状态。

2.3 消息中间件的优势

系统解耦:交互系统之间没有直接的调用关系,只是通过消息传输,故系统侵入性不强,耦合度低。 提高系统响应时间:例如原来的一套逻辑,可将紧急重要(需要立刻响应)的业务放到该调用方法中,响应要求不高的使用消息队列,放到MQ队列中,供消费者处理。 为大数据处理架构提供服务:通过消息作为整合,大数据的背景下,消息队列还与实时处理架构整合,为数据处理提供性能支持。

2.4 消息中间件常用协议

AMQP协议、MQTT协议、STOMP协议、XMPP协议、其他基于TCP/IP自定义的协议消息中间件的组成

2.4.1 AMQP

AMQP即Advanced Message Queuing Protocol,是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。AMQP 的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。 优点:可靠、通用。

2.4.2 MQTT

MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个即时通讯协议,有可能成为物联网的重要组成部分。该协议支持所有平台,几乎可以把所有联网物品和外部连接起来,被用来当做传感器和致动器(比如通过Twitter让房屋联网)的通信协议。 优点:格式简洁、占用带宽小、移动端通信、PUSH、嵌入式系统

2.4.3 STOMP

STOMP(Streaming Text Orientated Message Protocol)是流文本定向消息协议,是一种为MOM(Message Oriented Middleware,面向消息的中间件)设计的简单文本协议。STOMP提供一个可互操作的连接格式,允许客户端与任意STOMP消息代理(Broker)进行交互。 优点:命令模式(非topic\queue模式)

2.4.4 XMPP

XMPP(可扩展消息处理现场协议,Extensible Messaging and Presence Protocol)是基于可扩展标记语言(XML)的协议,多用于即时消息(IM)以及在线现场探测。适用于服务器之间的准即时操作。核心是基于XML流传输,这个协议可能最终允许因特网用户向因特网上的其他任何人发送即时消息, 即使其操作系统和浏览器不同。 优点:通用公开、兼容性强、可扩展、安全性高,但XML编码格式占用带宽大

2.5 主流的消息中间件

常见的消息中间件包括:RabbitMQ、RocketMQ、kafka 等,后面我们会有一篇专门对这几种中间件的能力和技术参数做一项完整的对比,并给出不同业务场景下的技术选型建议。

原文链接:MQ系列1:消息中间件执行原理 - Hello-Brand - 博客园

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

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

相关文章

区块链技术应用展望

区块链作为一个"去中心化"的分布式账本数据库,能够让数据的产生、运行和应用更加公开与透明。区块链被认为是互联网之后又一大创新之举,是第二个互联网时代——价值互联网时代的来临,区块链将从基础设施层面为各行各业带来巨大的变…

力扣(LeetCode)353. 贪吃蛇(2022.12.20)

请你设计一个 贪吃蛇游戏,该游戏将会在一个 屏幕尺寸 宽度 x 高度 的屏幕上运行。如果你不熟悉这个游戏,可以 点击这里 在线试玩。 起初时,蛇在左上角的 (0, 0) 位置,身体长度为 1 个单位。 你将会被给出一个数组形式的食物位置…

C++中二叉树的递归遍历方法

在《C中二叉树的非递归遍历方法2-1》中提到,二叉树的遍历分为前序遍历、中序遍历、后序遍历和层序遍历四种。要遍历的二叉树如图1所示。 图1 二叉树结构 创建该二叉树的代码请参见《C中二叉树的非递归遍历方法2-1》。 1 前序遍历的递归实现 前序遍历的输出顺序是…

VC2010 的控制台程序中使用 EasyX

以下是在 VC2010 的控制台应用程序中使用 EasyX 的具体步骤: 1. 启动 VC2010,点击菜单 File -> New -> Project...,打开 New Project 对话框: 2. 选择 “Win32 Console Application” 类型的项目,并选择项目所在…

「驱动知识」Linux下RTC时间的读写分析

Linux下RTC时间的读写分析​ 1.1.1 系统时间与RTC时间​ Linux系统下包含两个时间:系统时间和RTC时间。​ 系统时间:是由主芯片的定时器进行维护的时间,一般情况下都会选择芯片上最高精度的定时器作为系统时间的定时基准,以避免…

【我不熟悉的javascript】map和weakmap的区别

map 保存键值对,并且能够记住键的原始插入顺序,任何值(对象或者基本类型)都可以作为一个键或一个值 基本方法有 get, set, has, delete, clear长度 .size迭代 keys, values, extries, forEach可以使用for ...of 迭代任何值(对象或者基本类型)都可以作为…

如何在头条做营销:2022今日头条营销价值洞察报告.pdf(附下载链接)

省时查报告-专业、及时、全面的行研报告库省时查方案-专业、及时、全面的营销策划方案库【免费下载】2022年11月份热门报告盘点《底层逻辑》高清配图华为2021数字化转型:从战略到执行.pdf华为项目管理金种子培训教材.pdf清华大学256页PPT元宇宙研究报告.pdf&#xf…

nn.AdaptiveAvgPool2d和nn.AvgPool2d的区别

nn.AdaptiveAvgPool2d 功能:该函数与二维平均池化运算类似,区别主要体现在自适应上,对于任何输入大小,输出大小均为指定的HW大小。 nn.AdaptiveAvgPool2d(output_size)output_size:指定的输出大小,可以是…

echarts-for-weixin只显示折线图,其他不显示解决办法

小程序使用echarts-for-weixin展示图表,结果只展示折线图,其他的统统不显示,百度大法一下午终于知道可能是echarts包内只有折线图。 下载好替换搞定!

【Vue 快速入门系列】3分钟掌握Vue中插槽的使用与理解

文章目录前言一、常规实现方式二、匿名插槽三、具名插槽四、作用域插槽前言 插槽作用:让父组件可以向子组件指定位置插入html结构,也是一种组件间通信的方式,适用于 父组件 > 子组件 。 插槽分类:默认插槽、具名插槽、作用域插…

docker部署solr+zk集群

在三台服务器上搭建solr集群,具体架构如下所示: 192.168.184.127 solr1/zk1 192.168.184.128 solr2/zk2 192.168.184.129 solr3/zk3 1.安装docker 三台服务器上都执行以下命令 # setenforce 0 # systemctl stop firewall…

代码随想录Day56|583.两个字符串的删除操作 、72.编辑距离、编辑距离总结篇

文章目录583.两个字符串的删除操作72.编辑距离编辑距离总结篇583.两个字符串的删除操作 文章讲解:代码随想录 (programmercarl.com) 题目链接:583. 两个字符串的删除操作 - 力扣(LeetCode) 题目: 给定两个单词 wor…

Flume EmbeddedAgent

flume flume 二次开发,对EmbeddedAgent的简易改造,动态控制agent,实现启动、关闭等功能。 模块结构如下所示: flume-parent github地址 1、用途 1.1、本地调试 对flume不是特别熟悉的开发者,都没有办法一次开发完…

消息队列mq

1. 为什么使用消息队列? 其实就是问问你消息队列都有哪些使用场景,然后你项目里具体是什么场景,说说你在这个场景里用消息队列是什么? 解耦、异步、削峰 2. 消息队列优缺点 2.1.优点 优点上面已经说了,就是在特殊…

并查集的原理及实现

Ⅰ. 并查集原理 在一些应用问题中,需要将 n 个不同的元素划分成一些不相交的集合。开始时,每个元素自成一个单元素集合,然后按一定的规律将归于同一组元素的集合合并。在此过程中要反复用到查询某一个元素归属于那个集合的运算。适合于描述这…

前端基础_线型Line styles

线型Line styles 线型包括如下属性。 lineWidth value lineCap type lineJoin type miterLimit value 通过这些属性来设置线的样式。下面将结合实例来讲解一下各属性的应用及应用后的效果。 lineWidth属性 该属性设置当前绘线的粗细,属性值必须…

ArcGIS编辑绘制图斑又慢又难?这些高效的处理技巧你值得拥有!

GIS画图是不是画得很慢! 图斑修改是不是无从下手! 图纸矢量化是不是琐碎繁杂、工作量大! 其实,强大的ArcGIS有很多高效的图斑编辑技巧,掌握这些技巧,无论是绘制图斑、还是修改图斑,还是图纸矢量化,绝对让你事半功倍! NO.1—自动完成面 当你要绘制一个图斑的相邻图…

华为云桌面,企业云上办公为何都偏好它?

在众多云上办公产品中,华为云桌面基于华为云的三十年投入的技术强、资源多、创新快和更可靠的优势,在众多云上办公产品中脱颖而出,成为众多企业数字化转型道路上不二选择,类似于三一重工、中泰模具、小飞侠等企业都选择了华为云桌…

非递归前序、中序遍历代码推演出后序遍历代码(极其透彻)

一、前言 众所周知,二叉树的遍历方式有三种:前序遍历、中序遍历和后序遍历。 🍌 前序遍历:首先访问根节点,然后递归遍历左子树,最后递归遍历右子树。 🍌 中序遍历:首先递归遍历左…

pypower的简单应用1

目录 一、背景描述 二、如何打开IEEE30节点并进行潮流计算 三、如何修改已有模型参数 四、完整代码 五、注意事项 pypower与matpower非常类似,可以利用matpower学习pypower,当然也有一些不同之处。下面记录一下应用pypower解决的问题。 一、背景描述…