为什么要用Mq?
可能很多兄弟们说不上来为什么要用Mq,如果我继续提问的话肯定会说,因为面试需要。
1、我们先从一个例子说起,目前我从淘宝下了一个订单,那淘宝怎么处理这些订单信息呢?
我简化一下处理逻辑,支付系统存支付金额和订单号,库存系统要减掉相对应的库存量,物流系统获取收货地址处理订单。(实际处理逻辑可能更复杂,我这里简化了一下),订单信息我用dubbo RPC调用发送给这三个系统。
你下完订单以后,我因为远程调用这三个系统发送完消息,才能给你返回下单成功通知,那现在因为部门搬迁原因 ,库存系统宕机了,我直接报给你404,你会不会把我投诉到我家去呢?
为了避免出现这个问题,我们架构师想了一个办法,我们中间加一个队列,消息先发送给队列 ,发送完队列以后我就给用户返回下单成功同志,然后其他接受这些消息的系统从这个队列里面拿,就成功解耦了,但该怎么写一个这种消息队列呢,先看一下市面上有没有相似的产品,有了kalfka,直接抄,然后修改。
后面我们的处理逻辑就变成下图:
2、我们营销团队成功策划了双十一,双十一这一天qps都达到了1万/s ,我现在下单接口最多能撑得住1000/s ,怎么办呢?
我们架构师想了一个办法,我先把请求都放在mq中,A系统从mq中每次获取1000个请求不就解决了上述问题
3、营销团队又想了一个方案,淘宝开通会员制,有会员的用户打折商品。但这需要添加一个会员模块,每次用户下单我还需要把这个信息发送到会员模块,记录总给给他省了多少钱。
我们架构师想了每次新增一个模块,都要修改原来的逻辑,有没有办法,这些新增的系统自己取获取自己想要的资源呢?
Mq的作用 总结一下:
1、应用解耦;
2、流量削峰
3、数据分发
Mq有哪些缺点?
1、如果Mq宕机,你整个业务逻辑就无法处理了,这是后续必须解决的地方。
2、以前一个代码就实现同步操作,现在先同步到Mq,再从mq获取,逻辑变的复杂了,而且我怎么保证,你Mq里面是否丢失数据,是否重复给我发同样的消息呢?我的业务都是顺序消费,你怎么保证呢?
3、我如何保证A,B,C系统都成功处理完消息呢?
总结一下Mq的缺点:
1、系统可用性降低;
2、系统复杂度提高;
3、一致性问题。
Mq产品进行比较:
特性 | ActiveMq | RabbitMQ | RocketMQ | Kafka |
开发语言 | java | erlang | java | scala |
单机吞吐量 | 万级 | 万级 | 10万级 | 10万级 |
时效性 | ms | us | ms | ms |
可用性 | 高 | 高 | 非常高 | 非常高 |
功能特性 | 成熟产品,有较多文档,各种协议支持较好 | 基于erlang开发,并发能力强 | mq功能比较全,扩展性强 | 大数据领域应用广 |