zoukankan      html  css  js  c++  java
  • 一个秒杀系统的设计

    系统功能

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

    业务数据

    • 用户量: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分钟,中间喝了一杯牛奶)。

  • 相关阅读:
    GIT
    JS常用功能
    prop checkbox 是否选中的问题。
    关于 未能加载文件或程序集“MySql.Web.v20 ...... 的问题
    Codeforces Round #535(div 3) 简要题解
    [Codeforces 600E] Lomsat gelral
    [PA 2011] Journeys
    [HNOI 2012] 永无乡
    [ONTAK2010] Peaks
    [BZOJ 3307] 雨天的尾巴
  • 原文地址:https://www.cnblogs.com/ouyida3/p/10464530.html
Copyright © 2011-2022 走看看