使用MQ消息队列的优缺点
## 首先要知道,为什么要用Mq,说白了就是以下3点
解耦
**就是一个系统或者一个模块,调用了多个系统或者模块,互相之间的调用很复杂,维护起来很麻烦。其实这个调用是不需要直接同步调用接口的, 皆可以用MQ给他异步化解耦。**
比如 : 像如图所示 a系统和其他系统没有直接的关联 那我们进行扩展的时候也会更灵活
消峰
如图所示 , 不用消息队列的时候,你的每个请求都要进过数据库,但数据库性能有限,这时候你的网站就会有性能瓶颈,但是如果你加入消息队列就会不一样,发送请求给应用服务器然后给消息队列,然后直接返回,由消息队列异步写入数据库,提升性能
异步
如上图所示, 不用消息队列,
你完成一项注册流程 需要 注册—>发短信----》发送激活邮件----》发微信验证 一共需要20秒
如果使用了 消息队列
注册 +(发短信+发邮件+微信验证) = 5+ 5 =10秒
性能提升一倍
–那MQ有哪些缺点
1》 系统可用性降低****:引入的依赖越多,越容易挂掉,
比如图1中的MQ分布式消息队列一旦宕机 ,你整个服务就jj了**
2 》 系统复杂性提高:强行使用MQ 会有出现 消息丢失,消息重复消费,消息顺序不对**
比如 A系统发生消息给b系统,但b系统没有及时会有 这个时候你怎么办? 重发?还是算失败?
一般为了消息一定被消费,我们一般选择重新发送,这样一来就会出现 重复消费
还有 比如 你上某宝买东西,正确的顺序应该是 下单 ——----》 付钱---》生成订单
一共3条消息 ,就会涉及到 ,3条消息发送给3个系统 ,一旦顺序不对就会出问题,中间要是网络不好还会出现消息丢失的情况
3》一致性问题:一个系统处理完了直接返回成功了,就会以为这请求处理是成功的;但是实际上是,另外的系统那里,可能某几个系统写库成功了,结果有个系统写库失败了,容易导致数据不一致。
比如 : 还是拿某宝下单的列子 ,用户发送请求给MQ 然后返回下单成功 ,这个时候以为是成功,
但MQ还要调用 库存系统,金额系统,订单系统,一旦某个系统出息消息失败,就会导致明明下单了,钱也扣了,但库存就是不减少。
----------------------------------最后总结
MQ 能一定程度提高你的性能 ,但也会引入很多坑 ,所以 mq有风险,使用需谨慎, 后面给大家分享 怎么针对这些问题做一些补偿,每个MQ的
补偿都不一样,会说说一些常用的 比如 RocketMQ kafaka RabbitMQ ActiveMq 他们是怎么解决这些问题的 好 下次见 我是killer