面试题----在什么地方可以用mq,或者为什么要使用mq

首先,mq的作用有三个:

1.实现异步通信

同步通信是什么样的?发出一个调用请求之后,在没有得到结果之前,就不返回,由调用者主动等待这个调用的结果,而异步是相反的,在调用发出之后,这个调用就直接返回了,所以没有返回结果,也就是说,当一个异步过程调用发出后,调用者不会马上得到结果,而是在调用发出后,被调用者通过状态,通知来通知调用者,或者通过回调函数处理这个调用

2.实现系统解耦

在我们的分布式系统中,一个业务流程涉及多个系统的时候,他们之间就会形成一个依赖关系。
在这里插入图片描述
比如我们以 12306 网站退票为例,在传统的通信方式中,订单系统发生了退货的动作,那么要依次调用所有下游系统的API,比如调用库存系统的 API 恢复库存,因为这张火车票还要释放出去给其他乘客购买;调用支付系统的 API,不论是支付宝微信还是银行 卡,要把手续费扣掉以后,原路退回给消费者;调用通知系统 API 通知用户退货成功。
这个过程是串行执行的,如果在恢复库存的时候发生了异常,那么后面的代码都不 会执行。由于这一系列的动作,恢复库存,资金退还,发送通知,本质上没有一个严格 的先后顺序,也没有直接的依赖关系,也就是说,只要用户提交了退货的请求,后面的这些动作都是要完成的。库存有没有恢复成功,不影响资金的退还和发送通知.
所以,这种情况下,我们可以引入MQ实现系统之间依赖关系
引入MQ之后:
在这里插入图片描述
订单系统只需要把退货的消息发送到消息队列上,由各个下游的业务系统自己创建 队列,然后监听队列消费消息。 在这种情况下订单系统里面就不需要配置其他系统的 IP、端口、接口地址了,因为它不需要关心消费者在网络上的什么位置,所以下游系统改 IP 没有任何影响。甚至不需要关心消费者有没有消费成功,它只需要把消费发到消息队列的服务器上就可以了。
这样,我们就实现了系统之间依赖关系的解耦。

3.实现流量削峰

第三个主要功能,是实现流量削峰。 在很多的电商系统里面,有一个瞬间流量达到峰值的情况,比如京东的 618,淘宝的双11,还有小米抢购。普通的硬件服务器肯定支撑不了这种百万或者千万级别的并发 量,就像 2012 年的小米一样,动不动服务器就崩溃。 如果通过堆硬件的方式去解决,那么在流量峰值过去以后就会出现巨大的资源浪费。 那要怎么办呢?如果说要保护我们的应用服务器和数据库,限流也是可以的,但是这样又会导致订单的丢失,没有达到我们的目的。 为了解决这个问题,我们就可以引入 MQ,MQ 既然是队列,一定有队列的特性, 我们知道队列的特性是什么? (先进先出 FIFO) 这样,我们就可以先把所有的流量承接下来,转换成 MQ 消息发送到消息队列服务 器上,业务层就可以根据自己的消费速率去处理这些消息,处理之后再返回结果。就像 我们在火车站排队一样,大家只能一个一个买票,不会因为人多就导致售票员忙不过来。 如果要处理快一点,大不了多开几个窗口(增加几个消费者)。

4.总结:

1)对于数量量大或者处理耗时长的操作,可以引入MQ实现异步通信,减少客户端的等待,提升响应速度.
2)对于改动影响大的系统之间,可以引入MQ实现解耦,减少系统之间的直接依赖
3)对于出现瞬间的流量峰值的系统,可以引入MQ实现流量削峰,达到保护应用和数据库的目的

5.使用消息队列带来的一些问题

1)系统可用性降低:原来是两个节点的通信,现在还需要独立运行一个服务,如果MQ服务器或者通信网络出现问题,就会导致请求失败
2)系统复杂性提高:第一开发者必须要理解相关的模型和概念,才能正确的配置和使用MQ,第二使用MQ发送消息必须要考虑消息丢失和消息重复消费的问题,一旦消息没有被正确的消费,就会带来数据一致性的问题

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值