高并发下的超卖问题

超卖问题的处理需多角度进行流量的控制

前端(防止用户的操作发出大量请求)

首先是页面的按钮防抖,防止用户发出大量请求

(有用的请求并没有那么多,如果可以,也可以直接在前端用随机的方式进行处理(直接随机给用户一个你没抢到.....))

利用cdn缓存静态资源(减轻服务器的压力),手动推给cdn进行预热

这样大量的请求就会打到cdn而不是所有地区的请求都到服务器

后端

瞬时流量的承接(前端也吸收了一部分的流量)

1,负载均衡

nginx(这个东西一般来说是做为前端的静态资源代理器,当然在这个地方也可以进行单个集群的负载均衡以及限流+黑名单)

设置的内容:

DB--防止超卖

乐观锁

乐观锁和悲观锁的内容不在这边进行叙述

DB--库存分组

将总库存也做集群,分为小库存,提高读写效率

DB--插入库存扣减流水

一直update行会出现问题,将update改为insert。插入数据的量不好控制会导致超卖

DB--热点行问题

数据库的热点行问题是指某些数据行被频繁访问或更新,导致这些行成为系统性能的瓶颈。(锁竞争)

解决方法之前的库存分组

db-redis缓存

用redis+lua的方式进行控制,先将大量写入数据放置到redis中进行处理,然后将redis的数据异步刷新到mysql中(在这里异步刷新的作用还有削峰填谷的作用)用来实现最终一致性,

除了这个db方案,还需要一个准时对账机制

lua脚本不单单需要进行库存的削减,还需要将流水zset进流水对列。定时拉取一段时间的流水和数据库的库存比较是否一致,不是则进行缓存。

如果发生了不一致

我们更倾向于认为数据库的数据可靠()根据数据库进行补偿

redis中的流水数据可能因为缓存失效和数据丢失而导致不一致

预防黑产

将行为异常的用户进行拉黑

幂等性

无论执行多少次,结果不变

兜底方案

直接关闭秒杀服务,秒杀服务的失败对于用户来说是可以接受的,直接止损

0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
下载 APP