为什么要使用MQ消息中间件?

本文探讨了消息队列(MQ)在解决大型分布式系统中耦合性、流量处理及性能问题上的应用。通过引入MQ,系统实现了模块间解耦,设置流量缓冲,并将非关键操作异步化,显著提升了整体吞吐能力和稳定性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在面试大型互联网公司的时候,很可能会被问到消息队列的问题:

  1.在何种场景下使用了消息中间件?

  2.为什么要在系统里引入消息中间件?

  3.如何实现幂等?

链式调用是我们在写程序时候的一般流程,为了完成一个整体功能,会将其拆分成多个函数(或子模块),比如模块A调用模块B,模块B调用模块C,模块C调用模块D。但在大型分布式应用中,系统间的RPC交互繁杂,一个功能背后要调用上百个接口并非不可能,这种架构有如下几个劣势

1、 这些接口之间耦合比较严重,每新增一个下游功能,都要对上有的相关接口进行改造;举个例子:假如系统A要发送数据给系统B和C,发送给每个系统的数据可能有差异,因此系统A对要发送给每个系统的数据进行了组装,然后逐一发送;当代码上线后,新增了一个需求:把数据也发送给D。此时就需要修改A系统,让他感知到D的存在,同时把数据处理好给D。在这个过程中你会看到,每接入一个下游系统,都要对A系统进行代码改造,开发联调的效率很低。其整体架构如下图:

2、面对大流量并发时,容易被冲垮每个接口模块的吞吐能力是有限的,这个上限能力如果堤坝,当大流量(洪水)来临时,容易被冲垮。

3、存在性能问题。RPC接口基本上是同步调用,整体的服务性能遵循“木桶理论”,即链路中最慢的那个接口。比如A调用B/C/D都是50ms,但此时B又调用了B1,花费2000ms,那么直接就拖累了整个服务性能。

根据上述的几个问题,在设计系统时可以明确要达到的目标:

1、 要做到系统解耦,当新的模块接进来时,可以做到代码改动最小;

2、设置流量缓冲池,可以让后端系统按照自身吞吐能力进行消费,不被冲垮;

3、强弱依赖梳理,将非关键调用链路的操作异步化,提升整体系统的吞吐能力,比如上图中A、B、C、D是让用户发起付款,然后返回付款成功提示的几个关键流程,而B1是通知付款后通知商家发货的模块,那么实质上用户对B1完成的时间容忍度比较大(比如几秒之后),可以将其异步化。

在现在的系统视线中,MQ消息队列是普遍使用的,可以完美的解决这些问题的利器。下图是使用了MQ的简单架构图,可以看到MQ在最前端对流量进行蓄洪,下游的系统ABC只与MQ打交道,通过事先定义好的消息格式来解析。

引入MQ之后的系统架构、交互方式与最初的链式调用架构非常不同,虽然可以解决上文提到的问题,但也要充分理解其原理特性来避免其带来的副作用,这里以消息队列如何保证“消息的可靠投递”为切入点,来看看MQ的实现方式。

1. Client如何将消息可靠投递到MQ

1.Client发送消息给MQ

2.MQ将消息持久化后,发送Ack消息给Client,此处有可能因为网络问题导致Ack消息无法发送到Client,那么Client在等待超时后,会重传消息

3.Client收到Ack消息后,认为消息已经投递成功。

2. MQ如何将消息可靠投递到Client

1.MQ将消息push给Client(或Client来pull消息)

2.Client得到消息并做完业务逻辑

3.Client发送Ack消息给MQ,通知MQ删除该消息,此处有可能因为网络问题导致Ack失败,那么Client会重复消息,这里就引出消费幂等的问题

4.MQ将已消费的消息删除

看完了这篇分享,不知道你对自己的Java学习是不是有了更多的感悟~ 

扩展阅读

分布式 MySQL 数据库中间件 MySQLDA 深入介绍

为什么不应该重写service方法?

HashMap为什么是线程不安全的

你为什么用或不用框架?

写完这个排序算法,为什么面试官让我滚?

从线程池理论浅析为什么要看源码

文章来源网络,版权归作者本人所有,如侵犯到原作者权益,请与我们联系删除

### 回答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. 可拓展性:消息中间件能够支持高并发和高可用的应用场景,通过多个消息队列实例的部署,能够实现水平扩展和负载均衡,提高系统的可拓展性。 综上所述,使用消息中间件的优势包括解耦、异步通信、缓冲与削峰、可靠性与持久化以及可拓展性。这些优势能够提高系统的性能、可用性和可维护性,使得分布式系统更加稳定和灵活。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值