在刚入MQ这个坑的时候,确实会觉得MQ真的不错,既可以解决多个系统耦合度太高的问题,又可以解决系统同步请求耗时的问题,还能大大降低请求资源对于系统以及数据库的压力,也就是我们常说的MQ的三大好处:
1、解耦:
就是一个系统或者一个模块,调用了多个系统或者模块,互相之间的调用很复杂,维护起来很麻烦。其实这个调用是不需要直接同步调用接口的,皆可以用MQ给他异步化解耦。
2、异步:
一个系统接收一个请求,需要在本地写库,还需要在另外几个相关的系统写库都需要一定的时长。最终请求总延时是就是三者的总时长,而当使用MQ异步请求,也就是两个时长,第一个是创建MQ,第二个是将消息放入MQ中,这样会大大提高效率。
3、削峰
可能每个系统的早高峰不一样,有些系统是上班期间访问量很大,有些系统是下班时间访问量大,所以,我们需要用MQ来降低并发请求到数据库的数据,给数据库一定的时间去处理,不然一起拥进到数据库,系统就会崩了。
当然,使用这个MQ还会有好些个坑。
1)、系统可用性降低:系统引入的外部依赖越多,越容易挂掉,可能开始,你就是一个系统调用几个系统的接口,被调用的系统好好的,没啥问题,如果加个了MQ进来,MQ可能会挂掉,一旦MQ挂了,整套系统崩溃了,就会出大问题。
2)、系统复杂性提高:强行使用MQ,消息可能会重复消费,消息也有可能会丢失,消息传递的顺序性也可能会乱序,问题一大堆。
3)、一致性问题:一个系统处理完了直接返回成功了,就会以为这请求处理是成功的;但是实际上是,另外的系统那里,可能某几个系统写库成功了,结果有个系统写库失败了,容易导致数据不一致。
所以消息队列实际是一种非常复杂的架构,你引入对系统可能提速不少,但是也得针对它做各种技术方案和架构来避开他的弊端,可能用完了之后,你会发现这个系统复杂度也提高了很多,如果有需要,才加入MQ。