1. 秒杀问题

add: 2019-11-18

1.1. 需要解决的问题

  • 高并发
  • 超卖
  • 恶意请求
  • 链接暴露
  • 数据库负载

1.2. 解决方式

1.2.1. 服务单一职责

首先,尽量让服务进行拆分,每个服务之间互不影响,这样可以防止一个服务有问题,直接拖挂了其他服务

可以将 秒杀单独列个服务,单独建个数据库,另外,需要注意数据库索引,建立高性能索引

1.2.2. 秒杀链接加盐

防止一些羊毛党(带技术的)可能直接跳过页面按钮,直接从链接请求,可能时间还没到,服务就请求挂了。。

可以考虑在链接后加入参数,参数可以考虑加密,简而言之就是加盐,这样防止连接直接暴露且被爆

1.2.3. Redis集群

单机Redis可能顶不住,可以考虑用Redis集群,Redis集群,主从同步,读写分离,开启持久化

1.2.4. nginx

多台服务,做负载均衡,如果买不起,可以考虑租点流量机

另外把恶意请求进行拦截,比如单个用户请求次数太夸张,可以直接在网关那层直接拦截掉,因为可能会占网络带宽或者

把 服务器打崩,缓存击穿等

1.2.5. 资源静态化

现在大部分都是前后端分离的,所以很多静态资源直接放入到CDN

1.2.6. 按钮控制

这个一般只能防止下表白,比如时间点到之前,按钮置灰,按下后不允许再点!或者延迟几秒才能再次点!

1.2.7. 限流

前端限流:限定点一下后几秒之后才能再点

后端限流: 只要成功抢到的人才能走到订单生成和支付等操作,一旦产品卖光了,直接返回 秒杀失败 的信息给前端用户

实际限流的操作如果没有成熟技术支持,可以考虑基本的限流方式,比如计数,令牌桶等等,如果有技术支持,可考虑

加入限流组件比如:阿里的Sentinel、Hystrix等

1.2.8. 库存预热

在秒杀前先把库存跑到Redis里去,不过有个问题,如果高并发了,扣库存,可能会超卖

超卖怎么解决呢,用Lua

Lua 脚本功能是 Reids在 2.6 版本的最大亮点, 通过内嵌对 Lua 环境的支持, Redis 解决了长久以来不能高效地处理 CAS (check-and-set)命令的缺点, 并且可以通过组合使用多个命令, 轻松实现以前很难实现或者不能高效实现的模式。

Lua脚本是类似Redis事务,有一定的原子性,不会被其他命令插队,可以完成一些Redis事务性的操作

写一个Lua脚本,把判断库存扣减库存的操作都写在一个脚本丢给Redis去做,到0了后面的都 直接返回 秒杀失败,

一个失败了修改一个开关,直接挡住所有的请求,再处理其他事情

1.2.9. 限流&降级&熔断&隔离

限流: 至少能顶住一部分 降级: 降级了还是被打挂了 熔断: 不影响其他系统 隔离: 一旦挂了,别影响其他系统,毕竟需要调用别的系统

1.2.10. 削峰填谷

平常如果用户不需要即刻返回信息的话,可以考虑消息队列,比如小米抢手机,用户抢之后,会看到排队的页面。。

我个人之前的业务比如 发放红包,都是走队列,用户可能需要等待一会,但是这样对服务稳定起了很重要的作用

贴个图:

秒杀

以上是我在某网站看到文章,通过修改和整理,如果你需要看原文,看原文地址

原文地址

results matching ""

    No results matching ""