消息队列的优点和缺点

该系列博客是学完石杉老师的
一、优点
1.系统解耦
消息队列的优点和缺点_第1张图片
以上图片是传统的接口调用设计,该设计会出现几个问题:
(1)系统A完全和系统BCD耦合起来,当系统BCD其中一个服务出现问题,那么会直接造成其他几个服务不可用,最后导致整个系统不可用。
(2)如果想要在目前这种设计上面增加一个系统E,那么也就需要同步修改系统A的代码才能使用,系统几乎也就不存在可扩展性
基于消息队列的系统设计可以解决以上问题,系统A直接将数据放入MQ中,后续的事情几乎可以不用管,直接交由消息队列来处理,需要该数据的服务直接从消息队列中拿出来使用即可,如果新加入一个系统,该系统直接订阅MQ中的主题,不需要系统A做任何操作即可完成系统调用。如下图:
消息队列的优点和缺点_第2张图片
2.异步调用
消息队列的优点和缺点_第3张图片
上图中是不使用消息队列的情况,如果系统A操作完数据库之后会依次调用系统BCD,那么整个交互过程所耗时为50+100+200+300=650ms的时间,如果还有其他原因的话,整个交互时间会更长,对于用户来说是不能忍受这么长时间的等待的,其实我们可以在调用完系统A的操作之后,比如说系统A是用户支付模块,那么待用户支付完之后,后续操作都不需要用户来参与,可以直接返回支付结果,其他系统的调用可以不需要通知到用户,直接后台来处理,以下是使用消息队列之后的系统情况:
消息队列的优点和缺点_第4张图片
系统A在调用完数据库之后就发送数据到MQ中,然后直接返回用户结果,所以整个请求的耗时就是50ms+网络通信时间,大大提高了访问速度,提升用户体验。
3.流量削峰
在高并发环境下,一段时间内大量请求到后台系统中,如果没有对流量做控制,一般mysql的每秒请求在2000左右,对于大量请求那数据库肯定是会挂掉的,所以需要中间加一层隔离,对流量进行控制,保证数据库的正常运行,前端请求直接放入到队列中,然后设置消息队列每秒向消费者投递的消息数量来控制并发环境下的系统稳定性。
二、缺点
引入一个新的技术,会带来好的一面,当然也会产生不好的一面,以下是系统使用消息队列之后可能出现的问题。
1.降低系统可用性
消息队列在系统中充当一个中间人的身份,如果该中间人突然失联了,那其他两方就不知所措了,最后也就导致系统之间无法互动。
2.增加系统的复杂性
在使用消息队列的过程中,难免会出现生产者、MQ、消费者宕机不可用的情况,那么随之带来的问题就是消息重复、消息乱序、消息堆积等等问题都需要我们来控制。
3.一致性问题
消息队列的优点和缺点_第5张图片
如上图所示,系统需要保证ABCD之间的数据一致性,如果系统BC执行成功,系统D执行失败时,就会出现数据不一致问题

你可能感兴趣的:(消息队列)