5. 消息队列异步处理订单
我们之前通过数据库中的乐观锁来控制超卖的问题,并且也通过Jmeter压力测试,那么如果并发量足够大,而且不对其进行限制那么对于接口,对于数据库和服务器都是一个很大的压力,此时,我们需要接口限流,我们通常使用令牌桶算法+乐观锁进行对高并发的限制,但是如果遇到爬虫进行不断的发送数据,这样也会比正常用户大概率秒杀到商品,此时我们需要隐藏接口、带MD5进行双向验证,和单用户限制发送请求的频率。
除了这些方法,实际上我们还可以对于下单的异步处理,我们之前提过,用户进行对商品秒杀的时候会在同一时间进行高并发的请求流量到服务器中,如果每个请求都立即访问数据库进行扣减库存+写入订单的操作,对数据库的压力是巨大的。
那这样我们可以通过RabbitMQ (消息队列)对我们数据库减轻压力:当"幸运儿"成功的将其的秒杀请求放到消息队列中,给其返回抢购成功,实际上用户并不关心自己的订单号马上返回,用户只关心自己是否能够成功抢购,所以对于生成订单号,减少库存等操作我们可以通过异步处理订单将数据写入数据库,比起多线程同步修改数据库的操作,大大缓解了数据库的连接压力,最主要的好处就表现在数据库连接的减少
同步方式:大量请求快速占满数据库框架开启的数据库连接池,同时修改数据库,导致数据库读写性能骤减。
异步方式:一条条消息以顺序的方式写入数据库,连接数几乎不变(当然,也取决于消息队列消费者的数量)。
image-20200930102122309.png
5.1 配置RabbitMQ
导入RabbitMQ依赖和fastJson
org.springframework.boot
spring-boot-starter-amqp
com.alibaba
fastjson
1.2.73
使用Docker在服务器上安装rabbitMQ
# 获取最新的指定版本,该版本包含了web控制页面
docker pull rabbitmq:management
# 默认guest 用户,密码也是guest
docker run -d --name rabbit -p