前言:
从来没有真正弄明白mq是什么,只知道他有消峰,异步,解耦的作用。但是在日常开发工作中,就是简单的生产者发送消息,消费者接受消息。所以,从今天开始。我要吃掉这个技术。
一.这该死的订单系统
说到订单系统,大家一定会想到,不就是用户购买商品。订单系统从数据库中库存减少这样的操作嘛,再复杂一点就是要告诉xx物流来拿货,发快递。再复杂一点就是给用户发送消息告诉用户下订单已经成功了。再复杂一点就是支持退货,库存再加回来。再复杂一点就是用户下单购买商品,你给用户发一些红包啦,券啦。再复杂一点就是类似于双十一这种短时间有大量用户下订单的操作。
但是上面说的一些操作,其实藏匿着很多危机,比如告诉物流拿货,第三方物流系统接口挂掉了,那岂不是你下不了订单?比如退货,你这边库存已经加回来了,但是第三方支付系统告诉你退款失败。用户岂不是财货两空?再比如退货,你的红包之类的是不是得收回?双十一qps夸夸往上增,服务器挂掉了怎么办?
二.同步异步的概念
同步:就是从用户下订单开始 添加订单记录,减库存,发券,通知物流公司发货。这些操作都是一步步来的。比如添加订单记录用了10ms,减库存用了10ms,发券用了10ms,调用物流公司接口用了20ms.这个接口一共用了50ms
异步的概念,就是不用等上一个操作做完,下一个操作就可以执行。
三.mq的作用
其实mq就是用来干这件事情的,把发券,通知物流公司发货,抗下双十一这种大量请求的场景
都可以通过mq来解决上述问题。对应发券就是异步操作,通知物流公司发货就是跟第三方接口解耦,抗下双十一多请求就是消峰。
四.mq的选型
现在常见的mq一般有3种:rabbitmq,rocketmq,kafka 他们四个各有各的好多,也各有各的缺点。
我们在做技术选型的时候,要思考下面几个问题?
1.他会不会丢数据?
2.同等机器下,他能支持多少qps?
3.社区活不活跃?
4.可不可以部署集群环境
5.支持一些基本功能么(延时消息,事务消息,消息堆积,消息回溯,死信队列)?
名称 | 优势 | 劣势 | 吞吐量 |
rabbitmq | 保证数据不丢失,支持死信队列,可以部署集群 | 吞吐量比较低,加机器比较困难,开发语言erlang,无法读懂他的源码 | 每秒几万 |
rocketmq | 保证高可用,通过配置可以保证数据不丢失,支持高级特性,基于java开发,很容易读懂源码 | 官方文档相对不足 | 每秒10W |
Kafka | 性能高,可用性高 | 丢失数据 | 每秒10多w |
五.rocketmq的架构原理
1.mq如何集群化部署支持高并发访问?
一台rocketmq最多能10W并发,如果这时候有大量的请求发送过来怎么办?我们可以部署在多台机器上,然后只要让几十万请求分散到不同机器上即可。
2.mq如果要存储海量数据应该怎么做?
海量数据是通过分布式存储的方式来进行存储的,每台机器上的rocketmq进程一般称之为broker,每个broker会收到不同的消息,然后会把消息存储在本地的磁盘文件中。
对于生产者或者消费者来说如果他要发送消息到broker上也要通过NameServer来获取