直接的远程调用:例如:dubbo中的RPC
MQ:优势
1.应用解耦:
直接远程调用的方式:
问题一:容错性问题
假如库存系统挂掉了,然后订单系统在下订单的时候,整个链路就走不通了,导致订单系统也出现问题,(整个系统的容错性比较低)
问题二:可维护性问题
当想要加一个x系统的时候,就需要修改订单系统的代码,然后访问x系统
MQ解决上面两个问题
当用户下订单访问订单系统,订单系统发一条消息给MQ,这时候就可以给用户返回说下单成功了。然后后面的系统只需要从MQ中把消息拿出来并在自己的系统中消费就可以了。
问题一:还是当库存系统 出现问题了
库存系统修复好了,只需要从MQ中拿出消息,消费就好了。并不会导致订单系统也出现问题
问题二:可维护性问题:当加了一个x系统的时候。订单系统一行代码也不要改。只需要让x系统从MQ中把消息拿出来消费就好了。
2.异步提速
远程调用的方式:订单系统调DB然后订单系统调库存系统,然后订单系统调支付系统,然后订单系统调物流系统,然后订单系统调X系统。
使用MQ过后:订单系统只需要保存自己的数据库花费20ms,然后再向MQ发送消息。25ms就能得到响应
3.削峰填谷
远程调用的方式 :假设A系统每秒最大处理1000请求,突然用户多了,每秒5000请求,A系统就挂了
MQ做法:
MQ劣势
1.系统的可用性降低
远程调用的方式:只需要保证AB系统都没问题,那么整个系统就没问题
使用MQ过后:还要保证mq没问题
2.系统的复杂度提高
3.一致性问题
MQ的使用应该满足什么条件
1.生产者不需要从消费者处获得反馈
假设有A B C三个系统 A调用了B系统过后,得到的结果再去调用C系统
2.容许短暂的不一致性
例如:刚才的订单系统,下了订单过后,订单系统发送消息给MQ,不需要等待库存系统等待把消息消费