MQ(消息队列)
MQ(消息队列)
消息中间件
消息中间件是基于队列与消息传递技术,在网络环境中为应用系统提供同步或异步、可靠的消息传输的支撑性软件系统——百度百科
MQ是一直存在,不过随着微服务架构的流行,成了解决微服务之间问题的常用工具。
MQ的优势
1、应用解耦
传统的远程调用,如下其中库存系统出现故障会影响到订单系统,添加新系统需要重新修改订单系统的代码
使用MQ后,消息通过中间件转发,消费者从MQ中取消息,如果库存系统出现异常,等库存系统自我修复后再去MQ中取消息,不会影响其他系统。添加新系统也是去MQ中取,不用修改订单系统的代码。
订单系统:用户下单后,订单系统完成持久化处理,将消息写入消息队列,返回用户订单下单成功。
库存系统:订阅下单的消息,获取下单消息,进行库操作。 就算库存系统出现故障,消息队列也能保证消息的可靠投递,不会导致消息丢失。
2、异步提速
传统的直接调用,需要耗时920ms
使用MQ,一个订单只需要25ms,提升用户体验和系统的吞吐量(吞吐量:单位时间内处理请求的数目)
由此可以看出,引入消息队列后,用户的响应时间就等于写入数据库的时间+写入消息队列的时间(可以忽略不计),引入消息队列后处理后,大大提升了用户体验、以及系统的吞吐量。
3、削峰填谷
传统的远程调用,A系统处理不了直接崩溃了
使用MQ ,将请求交给MQ处理,然后由MQ每秒拉出1000个请求给A系统处理
总结
应用解耦:提高系统容错性和可维护性
异步提速:提升了用户体验和系统吞吐量
削峰填谷:提高系统稳定性
MQ的劣势
1.系统可用性降低
系统引入的外部依赖越多,系统的稳定性越差,一旦MQ宕机,就会对业务造成影响,如何保证MQ的高可用?
2.系统复杂度提高
MQ的加入大大的增加了系统的复杂度,以前系统间是同步的远程调用,限制是通过MQ进行异步调用,如何保证消息没有被重复消费?怎么处理消息丢失情况?怎么保证消息传递的顺序性?
3.一致性问题
A系统处理完业务,通过MQ给B、C、D三个系统发消息数据,如果B系统和C系统处理成功,D系统处理失败,如何保证消息数据处理的一致性?
使用MQ需要满足什么条件?
1、生产者不需要从消费者处获得反馈,引入消息队列之前的直接调用,其接口的返回值应该为空,这才让明明下层动作还未做,上层却当成动作做完了继续往后执行,即所谓的异步成为可能。
2、容许短暂的不一致性。
3、确实使用了有效果,即解耦、提速、削峰这些方面的收益,超过加入MQ,管理MQ的成本。
常见的MQ产品对比
- 感谢你赐予我前进的力量