MQ消息中间件的用处

1、系统解耦

假设你有个系统A,这个系统A会产出一个核心数据,现在下游有系统B和系统C需要这个数据。

那简单,系统A就是直接调用系统B和系统C的接口发送数据给他们就好了。

整个过程,如下图所示:
在这里插入图片描述
但是现在要是来了系统D、系统E、系统F、系统G,等等,十来个其他系统慢慢的都需要这份核心数据呢?如下图所示:
在这里插入图片描述
大家可别以为这是开玩笑,一个大规模系统,往往会拆分为几十个甚至上百个子系统,每个子系统又对应N多个服务,这些系统与系统之间有着错综复杂的关系网络。

如果某个系统产出一份核心数据,可能下游无数的其他系统都需要这份数据来实现各种业务逻辑。

此时如果你要是采取上面那种模式来设计系统架构,那么绝对你负责系统A的同学要被烦死了。

先是来一个人找他要求发送数据给一个新的系统H,系统A的同学要修改代码然后在那个代码里加入调用新系统H的流程。

一会那个系统B是个陈旧老系统要下线了,告诉系统A的同学:别给我发送数据了,接着系统A再次修改代码不再给这个系统B。

然后如果要是某个下游系统突然宕机了呢?

系统A的调用代码里是不是会抛异常?那系统A的同学会收到报警说异常了,结果他还要去care是下游哪个系统宕机了。

所以在实际的系统架构设计中,如果全部采取这种系统耦合的方式,在某些场景下绝对是不合适的,系统耦合度太严重。

并且互相耦合起来并不是核心链路的调用,而是一些非核心的场景(比如上述的数据消费)导致了系统耦合,这样会严重的影响上下游系统的开发和维护效率。

因此在上述系统架构中,就可以采用MQ中间件来实现系统解耦。

系统A就把自己的一份核心数据发到MQ里,下游哪个系统感兴趣自己去消费即可,不需要了就取消数据的消费,如下图所示:
在这里插入图片描述

2、异步调用

假设你有一个系统调用链路,是系统A调用系统B,一般耗时20ms;系统B调用系统C,一般耗时200ms;系统C调用系统D,一般耗时2s,如下图所示。
在这里插入图片描述
现在最大的问题就是:

用户一个请求过来巨慢无比,因为走完一个链路,需要耗费:

20ms + 200ms + 2000ms(2s) = 2220ms,

也就是2秒多的时间。但是实际上,链路中的系统A调用系统B,系统B调用系统C,这两个步骤起来也就220ms。

就因为引入了系统C调用系统D这个步骤,导致最终链路执行时间是2秒多,直接将链路调用性能降低了10倍,这就是导致链路执行过慢的罪魁祸首。

那此时我们可以思考一下,是不是可以将系统D从链路中抽离出去做成异步调用呢?

其实很多的业务场景是可以允许异步调用的。

举个例子:你平时点个外卖,咔嚓一下子下订单然后付款了,此时账户扣款、创建订单、通知商家给你准备菜品。

接着,是不是需要找个骑手给你送餐?那这个找骑手的过程,是需要一套复杂算法来实现调度的,比较耗时。

但是其实稍微晚个几十秒完成骑手的调度都是ok的,因为实际并不需要在你支付的一瞬间立马给你找好骑手,也没那个必要。

那么我们是不是就可以把找骑手给你送餐的这个步骤从链路中抽离出去,做成异步化的,哪怕延迟个几十秒,但是只要在一定时间范围内给你找到一个骑手去送餐就可以了。

这样是不是就可以让你下订单点外卖的速度变得超快?支付成功之后,直接创建好订单、账户扣款、通知商家立马给你准备做菜就ok了,这个过程可能就几百毫秒。

然后后台异步化的耗费可能几十秒通过调度算法给你找到一个骑手去送餐,但是这个步骤不影响我们快速下订单。

当然我们不是说那些大家熟悉的外卖平台的技术架构就一定是这么实现的,只不过是用一个生活中常见的例子给大家举例说明而已。

所以上面的链路也是同理,如果业务流程支持异步化的话,是不是就可以考虑把系统C对系统D的调用抽离出去做成异步化的,不要放在链路中同步依次调用。

这样,实现思路就是系统A -> 系统B -> 系统C,直接就耗费220ms后直接成功了。

然后系统C就是发送个消息到MQ中间件里,由系统D消费到消息之后慢慢的异步来执行这个耗时2s的业务处理。通过这种方式直接将核心链路的执行性能提升了10倍。

整个过程,如下图所示:
在这里插入图片描述

3、流量削峰

假设你有一个系统,平时正常的时候每秒可能就几百个请求,系统部署在8核16G的机器的上,正常处理都是ok的,每秒几百请求是可以轻松抗住的。但是如下图所示,在高峰期一下子来了每秒钟几千请求,瞬时出现了流量高峰,此时你的选择是要搞10台机器,抗住每秒几千请求的瞬时高峰吗?
在这里插入图片描述
那如果瞬时高峰每天就那么半个小时,接着直接就降低为了每秒就几百请求,如果你线上部署了很多台机器,那么每台机器就处理每秒几十个请求就可以了,这不是有点浪费机器资源吗?大部分时候,每秒几百请求,一台机器就足够了,但是为了抗那每天瞬时的高峰,硬是部署了10台机器,每天就那半个小时有用,别的时候都是浪费资源的。
在这里插入图片描述
但是如果你就部署一台机器,那会导致瞬时高峰时,一下子压垮你的系统,因为绝对无法抗住每秒几千的请求高峰。此时我们就可以用MQ中间件来进行流量削峰。所有机器前面部署一层MQ,平时每秒几百请求大家都可以轻松接收消息。一旦到了瞬时高峰期,一下涌入每秒几千的请求,就可以积压在MQ里面,然后那一台机器慢慢的处理和消费。等高峰期过了,再消费一段时间,MQ里积压的数据就消费完毕了。
在这里插入图片描述
这个就是很典型的一个MQ的用法,用有限的机器资源承载高并发请求,如果业务场景允许异步削峰,高峰期积压一些请求在MQ里,然后高峰期过了,后台系统在一定时间内消费完毕不再积压的话,那就很适合用这种技术方案。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 使用MQ消息中间件的优势在于它可以让发送和接收消息的应用程序解耦,异步地进行消息传递。MQ消息中间件还可以提供可靠的消息传输,支持各种消息模式,提供灵活的消息路由,支持可靠的消息重试,可以提供高吞吐率的消息处理等优势。 ### 回答2: 使用消息中间件MQ)的主要原因是为了解决分布式系统中的异步通信和解耦的问题,提高系统的可靠性、可扩展性和性能。以下是MQ的几个重要优势: 1. 异步通信:MQ提供了异步通信的机制,可以让发送方和接收方在时间上解耦。发送方把消息发送到MQ后,可以立即继续自己的工作,而不需要等待接收方的响应。这对于处理高并发请求和处理耗时任务非常有帮助。 2. 解耦:MQ能够将发送方和接收方解耦,发送方只需要关注把消息发送到MQ中,而不需要知道实际的接收方是谁。同样,接收方只需要从MQ中获取消息,而不需要知道消息的发送方是谁。这样可以提高系统的灵活性和可维护性。 3. 可靠性:MQ提供消息持久化的机制,确保即使在发送方和接收方的故障或者断电情况下,消息仍然能够被保存下来,并在故障恢复后重新传递。同时,MQ还提供了事务和回滚的机制,保证消息的可靠性传递。 4. 可扩展性:MQ具有高度的可扩展性,可以根据实际需求添加更多的消息生产者和消费者。同时,MQ还支持多种消息传递模式,如发布/订阅、点对点等,可以根据不同的业务场景选择合适的模式。 5. 削峰填谷:通过将消息缓存到MQ中,可以平滑处理系统的高峰请求和突发流量,避免系统的负载过高。同时,MQ还支持消息的优先级和延时发送,可以更好地满足不同类型的消息需求。 总之,使用MQ消息中间件可以提供异步通信、解耦、可靠性、可扩展性和削峰填谷等优势,帮助构建高性能、高可靠性的分布式系统。 ### 回答3: MQ消息中间件(Message Queue)是一种用于处理消息的软件架构,它被广泛应用于分布式系统和异步通信中。使用MQ消息中间件的主要原因有以下几点: 1. 解耦:使用消息中间件能够将系统中不同模块之间的通信解耦,即发送方和接收方之间不直接依赖于彼此的存在。发送方只需要将消息发送到队列中,而不需要关心具体的接收方是谁。这种解耦能够提高系统的可扩展性和可维护性。 2. 异步通信:消息中间件支持异步通信模式,即发送方发送消息后就可以继续处理其他任务,不需要等待接收方返回响应。这种方式可以提高系统的性能和吞吐量,同时也能降低系统之间的耦合度。 3. 缓冲与削峰:消息中间件能够缓冲消息,当接收方无法立即处理消息时,消息会暂时存储在队列中,等待接收方空闲时再进行处理。这种缓冲能够平衡系统中不同模块之间的处理速度差异,并且能够应对突发性的请求,避免系统过载。 4. 可靠性与持久化:消息中间件支持消息的持久化存储,保证消息不会因为系统故障或中断而丢失。即使在消息发送后出现问题,通过重新发送机制,消息仍然能够被接收方正确处理,保证消息的可靠性。 5. 可拓展性:消息中间件能够支持高并发和高可用的应用场景,通过多个消息队列实例的部署,能够实现水平扩展和负载均衡,提高系统的可拓展性。 综上所述,使用消息中间件的优势包括解耦、异步通信、缓冲与削峰、可靠性与持久化以及可拓展性。这些优势能够提高系统的性能、可用性和可维护性,使得分布式系统更加稳定和灵活。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值