消息队列-MessageQueue 介绍

消息队列

介绍

消息中间件(MessageQueue)是基于队列与消息的传递技术,在网络环境中为应用程序提供同步或者异步可靠的消息传输性的软件系统,多用于分布式系统中的通信。

应用场景

场景1:应用解耦

在这里插入图片描述
用户下单,需要调用订单系统的服务,而订单系统需要调用 库存系统、支付系统、物流系统 等服务。

  • 问题1:当库存系统宕机,订单系统无法请求到库存系统的服务,就会一直等待服务响应,最后订单系统也会随之瘫痪,用户最终会得到 下单失败 的结果。
    在这里插入图片描述

  • 问题2:当有新的需求到来,比如说要增加 一个 X 系统(如下图所示),那么程序员需要到订单系统取修改相应的代码,以调用X系统的服务。当又要增加一个 Y 系统,类似的,程序员又需要到订单系统去修改相应的代码,以调用Y系统的服务,这个时候可以发现整个系统的耦合度是非常高的,容错性非常低,可维护性也非常底。
    在这里插入图片描述
    以上两个问题,总而言之,就是应用系统之间耦合度太高带来的问题。

  • 利用MQ解决问题
    在这里插入图片描述
    在这里插入图片描述

订单系统面向MQ发送消息,而 库存系统、支付系统、物流系统 面向MQ获取消息,也就是说,订单系统只是向MQ发送消息即可,库存系统、支付系统、物流系统 只是从MQ中获取消息即可。

整个过程中,订单系统无需和 库存系统、支付系统、物流系统 接触,不管它们处于怎样的状态(宕机或者正常运行),订单系统都不会受到影响,这样达到了 解耦合 的目的。

当有增加系统模块的需求,只需要将新增X系统设置成从MQ中获取消息即可,订单系统无需改动,提高了系统的 可维护性

场景2:异步提速

在这里插入图片描述
用户下单,需要请求 订单系统的服务,订单系统首先需要将 订单 存储到DB 中,然后将订单信息发送给 库存系统、支付系统、物流系统,当全部的流程完成之后,这个用户下单的过程才算完成。

  • 问题:首先这是一种同步调用的方式,订单系统首先需要将订单存储到DB中,然后,向库存系统发送订单信息,当库存系统处理完之后,再向支付系统发送订单信息,等支付系统完成之后,最后向物流系统发送订单信息,当物流系统完成之后,将结果返回给用户,总耗时 20 + 300 + 300 + 300 = 920ms,这是一个非常慢的速度,对于一个互联网系统来说,是无法接受的。
    在这里插入图片描述
    以上的问题关键在于 同步通讯方式 和 异步通讯方式

简单介绍一下 同步通讯方式 和 异步通讯方式

  • 同步通讯方式:每次进行消息传递的时候,需要等待接收者 完成接收 或者 处理完相应的业务 才会继续整个流程的工作,类似于 打电话,你说一句,需要等待对方回复一句,你才会继续说下一句话。
  • 异步通讯方式:每次进行消息传递的时候,只需要关注将消息发送出去,无需等待对方的回应,然后继续整个流程的工作,类似于 发邮件,我们只需要将信息通过邮箱发送出去,之后我们就可以继续干别的事情,不用等待。

综上所述,整个问题的关键在于使用的是 同步通讯的方式,这样会大大浪费时间,因此采用异步通讯的方式可以大大优化整个服务响应的速度。

  • 利用MQ解决问题
    在这里插入图片描述
    订单系统只需要将 订单信息 发送到MQ,无需等待 库存系统、支付系统、物流系统的处理时间,用户得到订单系统的响应只需要 20 + 5 = 25ms,而库存系统、支付系统、物流系统 只需要从MQ中获取相应的订单信息,然后处理即可,整个过程类似于并行处理。这样整个工作流程的时间就是 20 + 5 + 5 + 300 = 330ms,这样即可大大的减少时间,同时提高 用户体验系统的吞吐量
    在这里插入图片描述

场景3:流量削峰

我们知道,某些时刻,用户的订单量会瞬间增大(双11 秒杀活动),这个时候如果请求数超过了系统的请求处理能力,会导致系统宕机或者瘫痪。
在这里插入图片描述

  • 问题:当某些时刻,系统接收到请求数量远远大于系统本身能够承担的请求量,这个时候系统往往容易崩溃或者产生其他的问题。
  • 利用MQ解决问题
    在这里插入图片描述
    A系统是直接接触不到用户的大量请求的,而是MQ将用户的大量请求存储到队列中,而A系统则可以根据自身的能力,从MQ中拉取用户的请求,按照自己的处理能力对请求进行处理,简而言之就是,MQ帮助系统承担了用户请求的压力,而系统只需要按照自己的能力去完成请求处理。

在这里插入图片描述

小结

  • 应用解耦:提高系统的 容错率可维护性
  • 异步提速:提升 用户体验系统吞吐量
  • 流量削峰:提高系统 稳定性

局限性(缺点)

  • 系统可用性降低:假设一个分布式系统中,没有用到MQ,只有A、B两个系统,我们只需要保证A、B两个系统正常运行,整个分布式系统就能正常运行,而当我们使用了MQ这样的消息中间件,我们就需要保证 A、B、MQ 三者正常运行,才能保证整个分布式系统正常运行。(如何保证MQ高可用?)
  • 系统复杂度提高:MQ 的加入大大增加了系统的复杂度,以前系统间是同步的远程调用,现在是通过 MQ 进行异步调用。(如何保证消息没有被重复消费?怎么处理消息丢失情况? 那么保证消息传递的顺序性?)
  • 一致性问题:A 系统处理完业务,通过 MQ 给B、C、D三个系统发消息数据,如果 B 系统、C 系统处理成功,D 系统处理失败。如何保证消息数据处理的一致性?

MQ的适用场景

  • 生产者不需要从消费者处获得反馈。引入消息队列之前的直接调用,其接口的返回值应该为空,这才让明明下层的动作还没做,上层却当成动作做完了继续往后走,即所谓异步成为了可能。
  • 容许短暂的不一致性,之前在场景2中我们提到,订单系统并没有等待 库存系统、支付系统、物流系统完成工作就响应给了用户 下单成功 的反馈,这个时候的反馈结果和事实是存在不一致性的。
  • 确实是用了有效果。即解耦、提速、削峰这些方面的收益,超过加入MQ、管理MQ的成本。

常见的MQ产品

在这里插入图片描述
RabbitMQ

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一、消息处理中的主要概念 “消息”是在两台计算机间传送的数据单位。消息可以非常简单,例如只包含文本字符串;也可以更复杂,可能包含嵌入对象。 消息被发送到队列中。“消息队列”是在消息的传输过程中保存消息的容器。消息队列管理器在将消息从它的源中继到它的目标时充当中间人。队列的主要目的是提供路由并保证消息的传递;如果发送消息时接收者不可用,消息队列会保留消息,直到可以成功地传递它。 “消息队列”是 Microsoft 的消息处理技术,它在任何安装了 Microsoft Windows 的计算机组合中,为任何应用程序提供消息处理和消息队列功能,无论这些计算机是否在同一个网络上或者是否同时联机。 “消息队列网络”是能够相互间来回发送消息的任何一组计算机。网络中的不同计算机在确保消息顺利处理的过程中扮演不同的角色。它们中有些提供路由信息以确定如何发送消息,有些保存整个网络的重要信息,而有些只是发送和接收消息。 “消息队列”安装期间,管理员确定哪些服务器可以互相通信,并设置特定服务器的特殊角色。构成此“消息队列”网络的计算机称为“站点”,它们之间通过“站点链接”相互连接。每个站点链接都有一个关联的“开销”,它由管理员确定,指示了经过此站点链接传递消息的频率。 “消息队列”管理员还在网络中设置一台或多台作为“路由服务器”的计算机。路由服务器查看各站点链接的开销,确定经过多个站点传递消息的最快和最有效的方法,以此决定如何传递消息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值