MQ专题1-消息队列的执行原理

news2024/11/20 4:43:44

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 用于生产者和消费者的注册与发现

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编码格式占用带宽大

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

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

相关文章

打包Qt程序,自动添加依赖的库和文件(详细步骤)

1、打开对应版本的命令面板,选择即可: 一般安装qt的时候,都会自带的 2、进入到编译成功的程序所在的目录: 输入:windeployqt XXX.exe(实际的程序名字) 这样这个程序所依赖的库都会自动添加进来…

工地木模板多少钱一张?

工地木模板是建筑工地上常用的模板材料,用于支撑混凝土浇筑时的形状和结构。对于计划购买工地木模板的人来说,了解其价格是十分重要的。下面将介绍一些关于工地木模板价格的具体信息,以帮助您做出明智的购买决策。 根据市场调研和互联网搜索的…

访问控制中PIP的典型流程和关键点思考

PIP的定位 企业ABAC中访问控制机制的部署实施有几个重要的功能“点”,用于检索和管理策略的服务节点,其中包含了用于处理策略上下文或工作流、以及检索和评估属性的一些逻辑组件。下图给出了这些功能点:策略执行点(PEP&#xff0…

什么是接口测试?三分钟带你全面认识接口测试、带你学会接口测试~

目录 1、接口是什么? 2、接口的类型 3、接口测试初识 3.1、什么是接口测试 3.2、原理 3.3、特点 3.4、什么是自动化接口测试 4、接口测试流程 5、传统风格接口与RESTful风格接口 6、接口文档 6.1、什么是接口文档 6.2、接口文档作用 6.3、展现形式 6.4…

【python VS vba(系列1)】 python和vba读写文件的方式比较 (建设ing)

目录 1 前言 : 为什么要做这个系列 2 用VBA 实现 遍历文件夹,读取文件内容,写入文件内容等 2.1 遍历文件夹的文件名 2.1.1 用VBA取得文件名等需要使用 dir mkdir 等类dos的命令 2.1.2 用VBA打开,写入,关闭文件: 2.1.3 看具体…

8个卓越的矢量图插画资源网站

在插画设计中,如何寻找能够自由缩放的矢量图插画素材,一直是我们设计的难点。 下面,为大家推荐8个矢量图插画素材网站,希望能够满足同学们的设计需求。 1:即时设计 即时设计是可云端编辑的专业级 UI 设计工具&#…

ssm+vue的汽车站车辆运营管理系统(有报告)。Javaee项目,ssm vue前后端分离项目。

演示视频: ssmvue的汽车站车辆运营管理系统(有报告)。Javaee项目,ssm vue前后端分离项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系…

vben admin配置详解(Table, Form)

vben这个后台管理系统的框架,基于ant-design-vue组件库封装了很多好用的组件,我们在日常开发中用的最多的就是Table, Form组件了。下面就简单介绍一下。 监听菜单折叠: const { getCollapsed } useMenuSetting();const isCollapsed ref(false);watch…

揭秘 AI 开发“武功秘籍”,NVIDIA 发布首部 DPU 和 DOCA 编程入门书籍

随着人工智能的“iPhone 时刻”到来,每家企业都将采用生成式人工智能,每个行业也都将被人工智能改变,开发者也在积极拥抱这股浪潮。 据开发者社区 CSDN 统计,在其注册开发者中,689 万开发者阅读、撰写与研究 AI 技术&…

吃透Spring源码分析专题

想说的话 本人在互联网摸爬滚打至今(23年)6年了,平时有写博客的习惯,这个习惯是从大学的时候开始的,目前主要关注java领域相关的技术,python也有涉及,写Spring专题是因为Spring确实很重要,在目前这个开发模…

考完PMP认证还需要考NPDP认证吗?

这个问题要看你自己,是项目经理,还是会和产品经理打交道,还是本身是产品开发的职位,或者就是产品经理等。考完PMP认证再考NPDP认证是有好处的,项目思维教会我们往前走,而产品思维,可以让我们走的…

html web前端,点击发送验证码,按钮60秒倒计时

html web前端&#xff0c;点击发送验证码&#xff0c;按钮60秒倒计时 eaca39b57a49d39f6c9e2f49f2559e9a.jpg <!DOCTYPE html> <html><head><meta http-equiv"Content-Type" content"text/html; charsetutf-8" /><title><…

快速解决“msvcp110.dll丢失”问题,msvcp110.dll丢失修复分享

解决"msvcp110.dll丢失"问题的方法 在计算机使用过程中&#xff0c;我们可能会遇到各种问题。其中&#xff0c;“msvcp110.dll丢失”是一个常见的错误&#xff0c;通常出现在运行某些软件或游戏时。这个错误不仅会打断我们的工作或娱乐&#xff0c;而且可能对我们的…

Perforce发布《2023游戏开发与设计现状报告》,洞察游戏行业的改变与2023年最令人兴奋的行业动向

近期&#xff0c;Perforce发布了《2023游戏开发与设计现状报告》。此报告调查了来自全球各地的游戏开发专业人士&#xff0c;了解他们面临的主要开发挑战、使用的工具和流程&#xff0c;以及目前最让他们对这个行业感到兴奋的方面。 龙智作为Perforce授权合作伙伴&#xff0c;…

C++为什么不提倡使用单例模式?

C为什么不提倡使用单例模式&#xff1f; 我是不提倡C当中使用单例模式的&#xff0c;在很早以前写过一个答案提过关于单例的问题。 正好最近有个朋友刚翻译了C core guidelines&#xff0c;里面的I.3也提了单例模式的危害&#xff0c;直接用“避免单例”作为标题&#xff0c;今…

测吧(北京)科技有限公司项目总监王雪冬一行访问计算机学院探讨合作

3月15日&#xff0c;测吧&#xff08;北京&#xff09;科技有限公司&#xff08;以下简称测吧&#xff09;项目总监王雪冬来到计算机学院对校企合作、学生就业、学生竞赛等一系列工作进行了深入研讨&#xff0c;并向计算机学院颁发了优秀组织单位和优秀指导老师奖。会议由黄曼绮…

JCJC-基于剪贴板的碎片信息收集工具

给大家介绍一款基于剪贴板的碎片信息收集工具-JCJC。 JCJC 的主要功能是跟踪剪贴板内容的变动&#xff0c;自动把剪贴板的内存保存为 MarkDown 格式文件。 MarkDown 文件说明&#xff1a; MarkDown 文件存储在 JCJC 安装目录中的 jcjc\notes 目录下 &#xff0c;文件名称格式…

Elasticsearch的增删查改详细操作

目录标题 一、创建索引二、查看索引三、修改索引四、删除索引五、向索引增加数据 一、创建索引 单独创建索引 PUT /test1 # test1 为索引名称自定义{"settings":{ # 创建index 需要有效的xcontent字节及Json格式 否则创建不成功 "index":{"number_…

目标跟踪ZoomTrack: Target-aware Non-uniform Resizing for Efficient Visual Tracking

论文作者&#xff1a;Yutong Kou,Jin Gao,Bing Li,Gang Wang,Weiming Hu,Yizheng Wang,Liang Li 作者单位&#xff1a;CASIA; University of Chinese Academy of Sciences; ShanghaiTech University; Beijing Institute of Basic Medical Sciences; People AI, Inc 论文链接&…

解决Nginx代理MinIO出现Access Denied

通过nginx代理访问minio文件地址时出现了Access Denied的错误 我的访问地址: http://ab.ac.ad.cn:10001/group2/2023/10/23/3_20231023101203A001.jpg/ 访问错误情况如下: 解决如下,实测有用 我这里一开始nginx配置如下: server {listen 10001;server_name ab.…