一 、MQ介绍
MQ 是(message queue) ,消息队列,消息中间件,采用JMS(java message service)规范的一种程序。它作为一个存储数据的容器独立部署在服务器上,提供接口给其他系统调用。
Mq消息中间件完成RPC调用的异步执行,服务调用之间的解耦合,提高主要(核心)服务的响应速度。
在项目中,将一些无需即时返回且耗时的操作提取出来,进行了异步处理,而这种异步处理的方式大大的节省了服务器的请求响应时间,从而提高了系统的吞吐量。
二、为什么要使用MQ?
1.解耦
比如有四个系统,系统A在代码中直接调用系统B和系统C的代码,如果将来D系统接入,系统A还需要修改代码,特别麻烦!
使用中间件后,直接将消息写入消息队列,需要消息的系统自己从消息队列中订阅,从而系统A不需要做任何修改。
2.接口异步处理
将消息写入消息队列,非必要的业务逻辑以异步的方式运行,所谓异步,就是不需要等待某个系统调用完成,它是非阻塞的,可以直接结束调用,没有返回值的可以这么调用,加快响应速度。
远程服务的调用分为:
同步调用:他是阻塞的,必须等待调用返回结果,才能结束调用。
异步调用:某个服务将另外一个服务需要的数据放入消息队列中,另外一个服务读取消息队列中的数据,完成特定的功能。降低生产者和服务消费者的耦合,提高通讯的效率。
3.流量削峰
并发量大的时候,所有的请求都直接怼到数据库上,造成数据库连接异常
消费者系统可以慢慢的按照数据库能处理的并发量,从消息队列中慢慢拉取消息。在生产中,这个短暂的高峰期积压是允许的。
三、使用了消息队列会有什么缺点?
答:1.系统可用性降低:如果消息队列挂了,系统将不能正常工作。
2.系统复杂性增加:出现更多的问题需要考虑,比如:一致性问题、如何保证消息不被重复消费,如何保证消息可靠传输等等。
3.消息传递路径更长,会增加延时(一些不重要的服务可以接受)
4.上游无法知道下游的执行结果(没有返回值的服务可以接受)