银行秒杀系统优化方案整理

高并发

  1. 静态化与缓存
    1. 静态化
      • 项目前后端分离,页面资源全部以静态化形式存储在服务器本地,不向服务端请求。
    2. 缓存
      • 数据库中商品库存全部存储在Redis中,秒杀的时候进行库存预减,再搭配队列,减少对数据库的并发写操作。
  2. 图片与服务器分离
    • 图片资源利用腾讯云对象存储技术,全部以url形式存储在数据库中,对图片的请求转发到腾讯云官方,减少服务器的压力。
  3. Nginx反向代理、负载均衡
    • 项目同时部署在两台服务器上,搭配Nginx进行反向代理与负载均衡,分流请求到不同服务器上。性能高的服务器权重高,另一台权重较低,分担了流量,减轻接口压力。
  4. 限流
    1. 前端限流
      • 秒杀抢购按钮采用节流技术,限制用户点击次数。
    2. Nginx限流
      • 设置通过请求数进行限流,平均每秒允许不超过1000个请求,突发不超过2000个请求,并且处理突发2000个请求的时候,没有延迟,等到完成之后,按照正常的速率处理。在请求进入项目前就先进行一次流量削减,减少压力。
    3. 接口限流
      • 在请求进入接口时再利用令牌桶技术进行进一步限流,再度减轻后端处理业务的压力。
  5. 消息队列
    1. 利用RabbitMQ进行流量削锋,异步化下单操作,防止多线程同时操作数据库,保证线程安全,分离并发写。同时利用死信队列实现订单超时回滚数据。
  6. Redis
    1. Redis在本项目中作为中间件,承载大流量情况下的并发读写,防止数据库因承受不住突然的大流量而宕机。
    2. 数据缓存存储在Redis中,设置定时任务每59分与29分同步数据库商品信息(依据是秒杀一般在这两个时间点开启),保证更快的读。
    3. 利用Redis进行预减库存,并且搭配使用了lua脚本,既保证了操作原子性,又提升了读写效率。
  7. 库存标记
    1. 当Redis中的库存为0时,接口中的StockMap对应的商品库存标记为true,直接返回库存不足,减少对Redis的操作。

高性能

  1. CDN加速技术
  2. 通过静态CDN,路由懒加载,图片压缩等技术减少打包体积从而实现首屏加载优化。
  3. 购买8G4C高性能服务器

高可用

  1. 配置了腾讯云服务DDos防护功能,可以有效抵御2Gbps左右的攻击规模
  2. 为保证正常的CDN加速技术使用,防止恶意盗刷流量,我们通过三个方面去防御,即访问控制、流量管理以及安全防护。
    1. 用量封顶
      • 我们在腾讯云上选择了“带宽封顶”类型。当统计周期产生消耗超出所设阈值后,CDN会关闭服务。
    2. IP黑名单配置
      • 在腾讯云上通过配置了IP访问控制策略,可以有效限制访问来源,阻拦恶意IP盗刷、攻击等问题。只需将用户的IP或者IP网段填入黑名单,访问将直接返回403
    3. IP限频访问配置
      • 通过对IP单节点在每一秒钟的访问次数进行限制,可进行高频CC攻击抵御,防止恶意用户盗刷。我们限制为10次每秒。
  3. 秒杀地址隐藏
    • 每个用户会通过算法生成专属的密钥,根据密钥生成相应的秒杀地址,秒杀地址会存储在Redis中并且具有10s的生效时长,前端会将返回的密钥拼接到接口中变成真正的秒杀地址,秒杀时会检验地址合法性,一定程度上防止了暴力脚本抢购,保证了安全性。
  4. 分布式架构
    • 拆分了原本的单体项目,改造成了微服务形式,分别有个人信息系统、产品系统、秒杀系统、管理员系统,并且使用Nginx进行代理,提升了系统的健壮性,在一个服务崩溃的时候不会影响其他服务的正常运行。在主服务器上和备用服务器上都有备份。
    • 使用Redis配置信息共享
  5. 脚本检测以及防刷
    • 在Nginx配置中加入了请求头部信息检测,检查脚本信息关键字,若检测到直接返回404,拒绝在接口之外,防止脚本请求进入业务层。

其他

前端

  • 利用Vue3+Vant+TypeScript进行用户移动端的前端开发,Vue2+element-ui进行用户PC端与管理员端的前端开发,通过ECharts可视化呈现管理员端中的订单数据