一个秒杀系统的设计

系统功能

  • 鉴权登录
  • 展示简单用户基本信息
  • 秒杀
  • 记录用户停留点击轨迹

业务数据

  • 用户量:1000万+
  • 估计参与秒杀总用户量:100万以内
  • 估计每次秒杀参与用户量:10万以内
  • 秒杀对象:红包、免费电子券

系统特点

  • 功能非常简单(可看作完全没什么业务)
  • 重点支撑高并发,应用不能崩垮
  • 秒杀的数据完整性必须保证,放第一位
  • 登录放第二位、用户触点放最后。用户信息查询不涉及增删改

设计要点

  • 作为独立系统,不影响其他系统
  • 登录需支持微信公众号(或微信小程序)、APP、手机浏览器
  • 不考虑PC端

设计

技术选择设计

  • 采用内存数据库redis(集群),实现登录、用户信息、秒杀
  • 采用消息队列kafka(集群),记录用户触点
  • 采用nginx(集群),负载用户访问
  • 采用前后端分离开发,前端Vue2.5,后端springboot
  • 应用使用docker和tomcat部署

redis设计

  • 用户量大,key采用短缩写命名,节省内存
  • 用户信息用google的protobuf序列化,节省内存,提供读取效率
  • 随机短信验证码采用list存储,pop读取后不继续保留占用内存
  • 部署40台redis集群,每台给redis分配32G内存左右
  • 主从备份,也有600G内存可用,每个用户基本信息和业务信息如果为10K,总共也就100G,应完全足够

kafka设计

  • 4台kafka集群,每台好像100个分区(具体忘了,时间太久了)
  • 写一个后台应用程序,读取kafka到mysql或oracle,进行用户触点分析与管理

nginx设计

  • 域名买阿里云的,https证书也买阿里云的,在上面配置好指向F5
  • F5配置指向4台nginx负载,ssl证书在nginx上配置
  • 同时预留4台nginx,配置同前面4台,但不启动(如果负载不够再启动)
  • 按照每台nginx支撑3万的并发,4台应该足够,但是一般保守估计为1万,所以预留
  • 优化linux配置,优化nginx配置,支撑高并发(详见我写的另一篇blog)

限流设计

  • 限流,防止系统雪崩
  • 通过nginx配置实现
  • nginx支持简单的限流配置,共三种
    • 按ip限
    • 按主机限
    • 按流量限
  • 三种全用上,每ip限10个连接,每主机1万连接,流量每秒1兆(千兆带宽)
  • 熔断先不弄

应用开发设计

  • 用户基础信息一次读取,放内存,不多次读取

应用部署设计

  • 40台主机部署tomcat,每台用docker启动2个,共80个
  • vue用webpack前端工程化,编译成少量的css和js文件,尽量少占用http连接

安全设计

  • https
  • 登录验证(不用落后的加密算法,如DES和3DES)
  • 尽量用nginx和vue挡在前面,RESTful不让访问
  • 特别秒杀的应用要保护好,代码采用多重判断验证

系统效果

  • 最终用户量没预计的大
  • 出现了一次短时间的503错误(估计当时访问量很大)
  • 没有故障,没有投诉
  • 但其实很多地方都做的不好,下次再做的话要改进

2019.3.3记录(共用时45分钟,中间喝了一杯牛奶)。

posted @ 2019-03-03 11:47  Danni3  阅读(380)  评论(0编辑  收藏  举报