MQ的基本概念
MQ概念
MQ全程Message Queue(消息队列),是在消息的传输过程中保存消息的容器,多用于分布式系统之间进行通信。
分布式系统两种通信方式:直接远程调用、借助第三方(MQ)完成间接通信
消息的发送方称为生产者,接收方称为消费者
MQ的优势和劣势
优势
-
应用解耦
A系统只关注往MQ中发送消息,不关注后续链路处理,如果后续链路中的B系统挂了也不影响A系统的正常工作,当B系统重新启动后会去MQ消费之前发送的消息,提升系统容错性和可维护性
-
异步提速
由于各子系统解耦,所以A系统不需要等待B系统的响应回写之后再做后续操作,只要往MQ中发送消息成功就可以继续执行后续操作,整个过程耗时减短,提升用户体验和系统吞吐量
-
削峰填谷
例如A系统支持最大吞吐为1000,当某时刻过来5000请求势必导致A系统宕机,解决办法就是在请求A系统之前加入MQ即5000请求首先将消息发送到MQ(消息队列吞吐量比应用系统大很多),这样高峰期产生数据被积压在MQ中,对A系统来说高峰期被“削”掉了,只需要在之后的按1000的消费速度去消费这些消息即可,提升系统稳定性
劣势
-
系统可用性降低
系统引入的外部依赖越多,系统的稳定性就越差,一旦MQ宕机,就会对业务造成影响
问题:如何保证MQ的高可用?
-
系统复杂度提高
MQ的加入大大增加了系统的复杂度
问题:如何保证消息没有被重复消费?
怎么处理消息丢失情况?
怎么保证消息传递的顺序性?
-
一致性问题
A系统发送消息,通过MQ给B、C系统,如果B系统处理成功,C系统处理失败
问题:如何保证消息数据处理的一致性?
既然MQ有优势也有劣势,那么MQ的引入满足什么条件呢?
- 生产者不需要从消费者处获取反馈。引入消息队列之前的直接调用,其接口的返回值应该是空,这种情况下即使下层动作还没做,上层可以当成动作做完了继续往后走,即所谓异步
- 容许短暂的不一致性
- 效益大于维护成本,即解耦、提速、削峰这些方面带来的收益要超过加入MQ带来的系统维护成本
常见的MQ产品
在实际生产中可根据项目着重点,择优选择