面试题----在什么地方可以用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发送消息必须要考虑消息丢失和消息重复消费的问题,一旦消息没有被正确的消费,就会带来数据一致性的问题

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章