MQ(Message Queue)简介

一、何为MQ?

MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法。应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们。消息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通常是用于诸如远程过程调用的技术。排队指的是应用程序通过队列来通信。队列的使用除去了接收和发送应用程序同时执行的要求。——百度百科

差不多能看懂,简单来说,就跟人们排队买票是一样,只不过排队的不是人,而是消息。

二、MQ概述

要让消息队列能有机动起来,那么一个完整的体系包括什么呢?首先是消息,然后是存放消息的队列,接着就是管理队列的管理器,以及管理器之间通信的信道:

1. 消息

在MQ中,我们把应用程序交由MQ传输的数据定义为消息,我们可以定义消息的内容并对消息进行广义的理解,比如:用户的各种类型的数据文件,某个应用向其它应用发出的处理请求等都可以作为消息。消息有两部分组成:

  • 消息描述符(Message Discription或Message Header),描述消息的特征,如:消息的优先级、生命周期、消息Id等;
  • 消息体(Message Body),即用户数据部分。

MQ中,消息分为两种类型:

  • 非永久性(non-persistent)消息
  • 久性(persistent)消息

非永久性消息是存储在内存中的,它是为了提高性能而设计的,当系统掉电或MQ队列管理器重新启动时,将不可恢复。当用户对消息的可靠性要求不高,而侧重系统的性能表现时,可以采用该种类型的消息,如:当发布股票信息时,由于股票信息是不断更新的,我们可能每若干秒就会发布一次,新的消息会不断覆盖旧的消息。永久性消息是存储在硬盘上,并且纪录数据日志的,它具有高可靠性,在网络和系统发生故障等情况下都能确保消息不丢、不重。

此外,在MQ中,还有逻辑消息和物理消息的概念。利用逻辑消息和物理消息,我们可以将大消息进行分段处理,也可以将若干个本身完整的消息在应用逻辑上归为一组进行处理。

2. 队列

队列是消息的安全存放地,队列存储消息直到它被应用程序处理。消息队列以下述方式工作:

  • 程序A形成对消息队列系统的调用,此调用告知消息队列系统,消息准备好了投向程序B;
  • 消息队列系统发送此消息到程序B驻留处的系统,并将它放到程序B的队列中;
  • 适当时间后,程序B从它的队列中读此消息,并处理此信息。

由于采用了先进的程序设计思想以及内部工作机制,MQ能够在各种网络条件下保证消息的可靠传递,可以克服网络线路质量差或不稳定的现状,在传输过程中,如果通信线路出现故障或远端的主机发生故障,本地的应用程序都不会受到影响,可以继续发送数据,而无需等待网络故障恢复或远端主机正常后再重新运行。

在MQ中,队列分为很多种类型,其中包括:

  • 本地队列
  • 远程队列
  • 模板队列
  • 动态队列
  • 别名队列
  • …………

本地队列又分为普通本地队列和传输队列,普通本地队列是应用程序通过API对其进行读写操作的队列;传输队列可以理解为存储-转发队列,比如:我们将某个消息交给MQ系统发送到远程主机,而此时网络发生故障,MQ将把消息放在传输队列中暂存,当网络恢复时,再发往远端目的地。

远程队列是目的队列在本地的定义,它类似一个地址指针,指向远程主机上的某个目的队列,它仅仅是个定义,不真正占用磁盘存储空间。

模板队列和动态队列是MQ的一个特色,它的一个典型用途是用作系统的可扩展性考虑。我们可以创建一个模板队列,当今后需要新增队列时,每打开一个模板队列,MQ便会自动生成一个动态队列,我们还可以指定该动态队列为临时队列或者是永久队列,若为临时队列我们可以在关闭它的同时将它删除,相反,若为永久队列,我们可以将它永久保留,为我所用。

3. 队列管理器

队列管理器是MQ系统中最上层的一个概念,由它为我们提供基于队列的消息服务。

4. 通道

通道是MQ系统中队列管理器之间传递消息的管道,它是建立在物理的网络连接之上的一个逻辑概念,也是MQ产品的精华。在MQ中,主要有三大类通道类型:

  • 消息通道
  • MQI通道
  • Cluster通道

消息通道是用于在MQ的服务器和服务器之间传输消息的,需要强调指出的是,该通道是单向的,它又有发送(sender), 接收(receive), 请求者(requestor), 服务者(server)等不同类型,供用户在不同情况下使用。MQI通道是MQ Client和MQ Server之间通讯和传输消息用的,与消息通道不同,它的传输是双向的。群集(Cluster)通道是位于同一个MQ 群集内部的队列管理器之间通讯使用的。

三、MQ工作原理

 

首先来看本地通讯的情况,应用程序A和应用程序B运行于同一系统A,它们之间可以借助消息队列技术进行彼此的通讯:应用程序A向队列1发送一条信息,而当应用程序B需要时就可以得到该信息。

其次是远程通讯的情况,如果信息传输的目标改为在系统B上的应用程序C,这种变化不会对应用程序A产生影响,应用程序A向队列2发送一条信息,系统A的MQ发现Q2所指向的目的队列实际上位于系统B,它将信息放到本地的一个特殊队列——传输队列(Transmission Queue)。我们建立一条从系统A到系统B的消息通道,消息通道代理将从传输队列中读取消息,并传递这条信息到系统B,然后等待确认。只有MQ接到系统B成功收到信息的确认之后,它才从传输队列中真正将该信息删除。如果通讯线路不通,或系统B不在运行,信息会留在传输队列中,直到被成功地传送到目的地。这是MQ最基本而最重要的技术–确保信息传输,并且是一次且仅一次(once-and-only-once)的传递。

MQ提供了用于应用集成的松耦合的连接方法,因为共享信息的应用不需要知道彼此物理位置(网络地址);不需要知道彼此间怎样建立通信;不需要同时处于运行状态;不需要在同样的操作系统或网络环境下运行。

四、MQ的通讯模式

MQ有四种通讯模式:

1. 点对点通讯

点对点方式是最为传统和常见的通讯方式,它支持一对一、一对多、多对多、多对一等多种配置方式,支持树状、网状等多种拓扑结构。

2. 多点广播

MQ适用于不同类型的应用。其中重要的,也是正在发展中的是”多点广播”应用,即能够将消息发送到多个目标站点(Destination List)。可以使用一条MQ指令将单一消息发送到多个目标站点,并确保为每一站点可靠地提供信息。MQ不仅提供了多点广播的功能,而且还拥有智能消息分发功能,在将一条消息发送到同一系统上的多个用户时,MQ将消息的一个复制版本和该系统上接收者的名单发送到目标MQ系统。目标MQ系统在本地复制这些消息,并将它们发送到名单上的队列,从而尽可能减少网络的传输量。

3.发布/订阅(Publish/Subscribe)模式

发布/订阅功能使消息的分发可以突破目的队列地理指向的限制,使消息按照特定的主题甚至内容进行分发,用户或应用程序可以根据主题或内容接收到所需要的消息。

发布/订阅功能使得发送者和接收者之间的耦合关系变得更为松散,发送者不必关心接收者的目的地址,而接收者也不必关心消息的发送地址,而只是根据消息的主题进行消息的收发。在MQ家族产品中,MQ Event Broker是专门用于使用发布/订阅技术进行数据通讯的产品,它支持基于队列和直接基于TCP/IP两种方式的发布和订阅。

4.群集(Cluster)

为了简化点对点通讯模式中的系统配置,MQ提供Cluster(群集)的解决方案。群集类似于一个域(Domain),群集内部的队列管理器之间通讯时,不需要两两之间建立消息通道,而是采用群集(Cluster)通道与其它成员通讯,从而大大简化了系统配置。此外,群集中的队列管理器之间能够自动进行负载均衡,当某一队列管理器出现故障时,其它队列管理器可以接管它的工作,从而大大提高系统的高可靠性。

PS:在JMS标准中,有两种消息模型P2P(Point to Point),Publish/Subscribe(Pub/Sub)  

五、MQ的优点

过去几年中,我们一直在使用、构建和宣传消息队列,我们认为它们是很令人敬畏的,这也不是什么秘密。我们相信对任何架构或应用来说,消息队列都是一个至关重要的组件,下面是十个理由:

1. 解耦

在项目启动之初来预测将来项目会碰到什么需求,是极其困难的。消息队列在处理过程中间插入了一个隐含的、基于数据的接口层,两边的处理过程都要实现这一接口。这允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束。

2. 冗余

有时在处理数据的时候处理过程会失败。除非数据被持久化,否则将永远丢失。消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险。在被许多消息队列所采用的”插入-获取-删除”范式中,在把一个消息从队列中删除之前,需要你的处理过程明确的指出该消息已经被处理完毕,确保你的数据被安全的保存直到你使用完毕。

3. 扩展性

因为消息队列解耦了你的处理过程,所以增大消息入队和处理的频率是很容易的;只要另外增加处理过程即可。不需要改变代码、不需要调节参数。扩展就像调大电力按钮一样简单。

4. 灵活性 & 峰值处理能力

当你的应用上了Hacker News的首页,你将发现访问流量攀升到一个不同寻常的水平。在访问量剧增的情况下,你的应用仍然需要继续发挥作用,但是这样的突发流量并不常见;如果为以能处理这类峰值访问为标准来投入资源随时待命无疑是巨大的浪费。使用消息队列能够使关键组件顶住增长的访问压力,而不是因为超出负荷的请求而完全崩溃。请查看我们关于峰值处理能力的博客文章了解更多此方面的信息。

5. 可恢复性

当体系的一部分组件失效,不会影响到整个系统。消息队列降低了进程间的耦合度,所以即使一个处理消息的进程挂掉,加入队列中的消息仍然可以在系统恢复后被处理。而这种允许重试或者延后处理请求的能力通常是造就一个略感不便的用户和一个沮丧透顶的用户之间的区别。

6. 送达保证

消息队列提供的冗余机制保证了消息能被实际的处理,只要一个进程读取了该队列即可。在此基础上,IronMQ提供了一个”只送达一次”保证。无论有多少进程在从队列中领取数据,每一个消息只能被处理一次。这之所以成为可能,是因为获取一个消息只是”预定”了这个消息,暂时把它移出了队列。除非客户端明确的表示已经处理完了这个消息,否则这个消息会被放回队列中去,在一段可配置的时间之后可再次被处理。

7.排序保证

在许多情况下,数据处理的顺序都很重要。消息队列本来就是排序的,并且能保证数据会按照特定的顺序来处理。

8.缓冲

在任何重要的系统中,都会有需要不同的处理时间的元素。例如,加载一张图片比应用过滤器花费更少的时间。消息队列通过一个缓冲层来帮助任务最高效率的执行–写入队列的处理会尽可能的快速,而不受从队列读的预备处理的约束。该缓冲有助于控制和优化数据流经过系统的速度。

9. 理解数据流

在一个分布式系统里,要得到一个关于用户操作会用多长时间及其原因的总体印象,是个巨大的挑战。消息系列通过消息被处理的频率,来方便的辅助确定那些表现不佳的处理过程或领域,这些地方的数据流都不够优化。

10. 异步通信

多时候,你不想也不需要立即处理消息。消息队列提供了异步处理机制,允许你把一个消息放入队列,但并不立即处理它。你想向队列中放入多少消息就放多少,然后在你乐意的时候再去处理它们。

六、MQ的使用场景

光说不练嘴把式,到底MQ能做些什么?以下介绍消息队列在实际应用中常用的使用场景。异步处理,应用解耦,流量削锋和消息通讯四个场景。

1. 异步处理

场景说明:用户注册后,需要发注册邮件和注册短信。传统的做法有串行的方式并行方式两种。

  1. 串行方式

将注册信息写入数据库成功后,发送注册邮件,再发送注册短信。以上三个任务全部完成后,返回给客户端。 

 

  1. 并行方式

将注册信息写入数据库成功后,发送注册邮件的同时,发送注册短信。以上三个任务完成后,返回给客户端。与串行的差别是,并行的方式可以提高处理的时间。 

 

假设三个业务节点每个使用50毫秒钟,不考虑网络等其他开销,则串行方式的时间是150毫秒,并行的时间可能是100毫秒。因为CPU在单位时间内处理的请求数是一定的,假设CPU1秒内吞吐量是100次。则串行方式1秒内CPU可处理的请求量是7次(1000/150)。并行方式处理的请求量是10次(1000/100)。

小结:如以上案例描述,传统的方式系统的性能(并发量,吞吐量,响应时间)会有瓶颈。如何解决这个问题呢? 
引入消息队列,将不是必须的业务逻辑,异步处理。改造后的架构如下: 


按照以上约定,用户的响应时间相当于是注册信息写入数据库的时间,也就是50毫秒。注册邮件,发送短信写入消息队列后,直接返回,因此写入消息队列的速度很快,基本可以忽略,因此用户的响应时间可能是50毫秒。因此架构改变后,系统的吞吐量提高到每秒20 QPS。比串行提高了3倍,比并行提高了两倍。

2. 应用解耦

场景说明:用户下单后,订单系统需要通知库存系统。传统的做法是,订单系统调用库存系统的接口。如下图:

 

 

传统模式的缺点:

  • 假如库存系统无法访问,则订单减库存将失败,从而导致订单失败;
  • 订单系统与库存系统耦合。

如何解决以上问题呢?引入应用消息队列后的方案,如下图: 


订单系统:用户下单后,订单系统完成持久化处理,将消息写入消息队列,返回用户订单下单成功。 
库存系统:订阅下单的消息,采用拉/推的方式,获取下单信息,库存系统根据下单信息,进行库存操作。

假如,在下单时库存系统不能正常使用。也不影响正常下单,因为下单后,订单系统写入消息队列就不再关心其他的后续操作了。实现订单系统与库存系统的应用解耦。

3. 流量削锋

流量削锋也是消息队列中的常用场景,一般在秒杀或团抢活动中使用广泛。如,秒杀活动中,一般会因为流量过大,导致流量暴增,应用挂掉。

为解决这个问题,一般需要在应用前端加入消息队列。这样以来可以控制活动的人数,可以缓解短时间内高流量压垮应用。


用户的请求,服务器接收后,首先写入消息队列。假如消息队列长度超过最大数量,则直接抛弃用户请求或跳转到错误页面;秒杀业务根据消息队列中的请求信息,再做后续处理。

4. 日志处理

日志处理是指将消息队列用在日志处理中,比如Kafka的应用,解决大量日志传输的问题。架构简化如下: 

日志采集客户端,负责日志数据采集,定时写受写入Kafka队列; 
Kafka消息队列,负责日志数据的接收,存储和转发; 
日志处理应用:订阅并消费kafka队列中的日志数据;

 

以下是新浪kafka日志处理应用案例:《新浪技术分享:我们如何扛下32亿条实时日志的分析处理》 


Kafka:接收用户日志的消息队列。 
Logstash:做日志解析,统一成JSON输出给Elasticsearch。 
Elasticsearch:实时日志分析服务的核心技术,一个schemaless,实时的数据存储服务,通过index组织数据,兼具强大的搜索和统计功能。 
Kibana:基于Elasticsearch的数据可视化组件,超强的数据可视化能力是众多公司选择ELK stack的重要原因。

5. 消息通讯

消息通讯是指,消息队列一般都内置了高效的通信机制,因此也可以用在纯的消息通讯。比如实现点对点消息队列,或者聊天室等。

点对点通讯:


客户端A和客户端B使用同一队列,进行消息通讯。

聊天室通讯:


客户端A,客户端B,客户端N订阅同一主题,进行消息发布和接收。实现类似聊天室效果。

 


---------------------
作者:staybug
来源:CSDN
原文:https://blog.csdn.net/weixin_43994338/article/details/105883473
版权声明:本文为作者原创文章,转载请附上博文链接!
内容解析By:CSDN,CNBLOG博客文章一键转载插件

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

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

相关文章

Blazor University (39)JavaScript 互操作 —— 更新 document title

原文链接:https://blazor-university.com/javascript-interop/calling-javascript-from-dotnet/updating-the-document-title/更新 document title源代码[1]在创建 Blazor 布局[2]部分中,我们看到了 Blazor 应用程序如何存在于 HTML(或 cshtm…

IIS 日志文件位置

IIS 6 Log files location IIS 6中日志文件的位置%windir%\System32\LogFilesIIS 7 Log files location IIS的日志文件的位置%SystemDrive%\inetpub\logs\LogFiles用户每打开一次网页,iis 都会记录用户IP、访问的网页地址、访问时间、访问状态等信息,这些…

APP测试流程和测试点

1 APP测试基本流程 1.1流程图 1.2测试周期 测试周期可按项目的开发周期来确定测试时间,一般测试时间为两三周(即15个工作日),根据项目情况以及版本质量可适当缩短或延长测试时间。正式测试前先向主管确认项目排期。 1.3测试资源 测…

39所强基计划试点高校已全部公布招生简章

截至目前(4月8日下午) 39所强基计划试点高校 已全部公布招生简章 各高校招生要求是什么? 招生专业有哪些? 什么时候报名? 一起来看 北京大学 招生对象及报名条件 各省(区、市)符合2022年全国普通高等学校招生统…

【ArcGIS错误异常100问】之001:License服务无法启动权威解决办法

测试环境: 操作系统:Windows10ArcGIS版本:10.X结果:通过测试 文章目录1. 错误提示2. 问题分析3. 解决办法3.1 关闭Windows Defender3.2 关闭系统防火墙3.3 删除迈克菲(McAfee)杀毒软件3.4 在系统服务中启动…

ASP.NET Core 技术内幕与项目实战读后感

前几天拿到了杨中科老师的新书《ASP.NET Core 技术内幕与项目实战》,迫不及待的“两”口气读完了。用一句话来总结,这是一本写给.NET开发者的非常实用的接地气的好书,感觉有必要自发为这本书宣传一波。杨老师在 .NET 开发者社区中的知名度非常…

avalon2学习教程15指令总结

avalon的指令在上一节已经全部介绍完毕,当然有的语焉不详,如ms-js。本节主要总结我对这方面的思考与探索。 MVVM的成功很大一语分是来自于其指令,或叫绑定。让操作视图的功能交由形形式式的指令来代劳。VM,成了一个大管家。它只一…

【ArcGIS错误异常100问】之002:Error 000735 简化容差:值是必需的(简化线、简化面工具)

测试环境: 操作系统:windows7ArcGIS版本:10.2结果:通过测试 文章目录1. 错误提示2. 问题分析3. 解决办法4. 问题验证1. 错误提示 在ArcGIS中使用简化面或者简化线工具时,点击确定会提示Error 000735:简化容…

.NET桌面开发的一些思考

在22日,我在公众号上发布了一条短文字,内容如下:其实在.NET开发大军中,还有一股力量,那就是桌面程序的开发者们。他们很少发声,可能技术成熟,可能太企业化了,也可能我没关注到。最近…

【ArcGIS错误异常100问】之003:属性表中文乱码解决办法总结

测试环境: 操作系统:windows7ArcGIS版本:10.X、Pro结果:通过测试 文章目录1. 错误提示2. 原因分析3. 解决方法4. 问题验证1. 错误提示 如图所示,安装完ArcGIS Pro后,由于计算机系统和应用软件字符编码的问…

大型网站架构演化(二)——应用服务和数据服务分离

随着网站业务的发展,一台服务器逐渐不能满足需求:越来越多的用户访问导致性能越来越差,越来越多的数据导致存储空间不足。这时就需要将应用和数据分离。应用和数据分离后整个网站使用三台服务器:应用服务器、文件服务器和数据库服…

再不自动化就晚啦!优云教你4步打造基于CentOS的产品镜像

随着Linux程序的增多,软件的安装过程中经常出现如下问题: 1、硬件配置类似或者相同时,批量安装系统和软件,希望实现自动化安装,减少安装时间和人为出错。 2、工程实施人员在不同客户现场进行系统和软件安装(硬件配置不…

【ArcGIS错误异常100问】之004:ArcGIS表转Excel超了65535限制解决办法

测试环境: 操作系统:windows7ArcGIS版本:10.2 文章目录1. 错误提示2. 原因分析3. 解决方法1. 错误提示 如下图,当矢量shp图斑数目过多,文件超过了65535条记录时,利用ArcGIS的表转Excel工具处理成Excel文件…

[转]硬核 | Redis 布隆(Bloom Filter)过滤器原理与实战

在Redis 缓存击穿(失效)、缓存穿透、缓存雪崩怎么解决?中我们说到可以使用布隆过滤器避免「缓存穿透」。 码哥,布隆过滤器还能在哪些场景使用呀? 比如我们使用「码哥跳动」开发的「明日头条」APP 看新闻,如…

Senparc.Weixin.Sample.MP源码剖析

Senparc.Weixin.Sample.MP是微信公众号样例的.NET6源码,项目配置文件appsettings.json的修改和微信公众号测试环境的搭建参考:微信公众号调试与Natapp环境搭建。接下来从项目结构,项目应用和项目源码3个角度来进行讲解。一.项目结构角度项目代…

mock.js使用

一、Mock.js入门 1. 什么是mock.js? Mock.js (官网http://mockjs.com/)是一款模拟数据生成器,旨在帮助前端攻城狮独立 于后端进行开发,帮助编写单元测试。提供了以下模拟功能: 1,根据数据模板生成模拟数据…

【ArcGIS微课1000例】0042:ArcGIS自带取色器工具的妙用

在ArcGIS中作图时,通常要进行颜色对照填充,输入特定的RGB值,本文介绍ArcGIS自带取色器工具的妙用,及第三方颜色拾取工具。 文章目录 一、ArcGIS自带取色器二、第三方取色器工具一、ArcGIS自带取色器 很多人可能不知道,ArcGIS中自带取色器工具,如下图所示。 当然了,自带…

微信.NET SDK-Senparc资料整理

微信生态系统包括微信公众号、小程序、微信支付、微信开放平台、企业微信、小游戏等,官方提供了很多的API接口。Senparc是目前使用最广泛的微信.NET SDK,同时支持支持.NET Framework 4.5/.NET Core 2.x/.NET Core 3.x/.NET 5/.NET 6。由于在微信生态开发…

7 种提升 Spring Boot 吞吐量神技

目录 二、增加内嵌Tomcat的最大连接数 三、使用ComponentScan()定位扫包比SpringBootApplication扫包更快 四、默认tomcat容器改为Undertow(Jboss下的服务器,Tomcat吞吐量5000,Undertow吞吐量8000) 五、使用 BufferedWriter 进…

【ArcGIS微课1000例】0043:ArcGIS缩略图的创建及应用

缩略图通常出现在地图文档中,便于在启动页面中快速打开指定的地图文档,提高效率。 文章目录一、缩略图预览二、缩略图创建一、缩略图预览 打开ArcMap软件,弹出启动窗口,在最近打开的文档中,可以看到两类,一…