作者:vincentsu,腾讯 PCG 后台开发工程师

如今的互联网已经在海量服务领域有了很成熟的理论,因此自己也很庆幸,能够从 0 到 1 完整践行海量服务。微视春节项目中的集卡瓜分活动,是一个典型的秒杀场景,自己参与其中,分享一些心得和总结。

如今的互联网已经在海量服务领域有了很成熟的理论,因此自己也很庆幸,能够从 0 到 1 完整践行海量服务。微视春节项目中的集卡瓜分活动,是一个典型的秒杀场景,自己参与其中,分享一些心得和总结。

秒杀系统的难点

  • 友好的用户体验

  • 用户不能接受破窗的体验,例如:系统超时、系统错误的提示,或者直接 404 页面

  • 瞬时高并发流量的挑战

  • 木桶短板理论,整个系统的瓶颈往往都在 DB,如何设计出高并发、高可用系统?

如何设计

上图是一个典型的互联网业务,用户完成一个写操作,一般会通过接入层和逻辑层,这里的服务都是无状态,可以通过平行拓展去解决高并发的问题;到了 db 层,必须要落到介质中,可以是磁盘/ssd/内存,如果出现 key 的冲突,会有一些并发控制技术,例如 cas/加锁/串行排队等。

直筒型

直筒型业务,指的是用户请求 1:1 的洞穿到 db 层,如下图所示。在比较简单的业务中,才会采用这个模型。随着业务规模复杂度上来,一定会有 db 和逻辑层分离、逻辑层和接入层分离。

漏斗型

漏斗型业务,指的是,用户的请求,从客户端到 db 层,层层递减,递减的程度视业务而定。例如当 10w 人去抢 1 个物品时,db 层的请求在个位数量级,这就是比较理想的模型。如下图所示

这个模型,是高并发的基础,翻译一下就是下面这些:

  • 及早发现,及早拒绝

  • Fast Fail

  • 前端保护后端

如何实现漏斗型系统

漏斗型系统需要从产品策略/客户端/接入层/逻辑层/DB 层全方位立体的设计。

产品策略

  • 轻重逻辑分离,以秒杀为例,将抢到和到账分开;

  • 抢到,是比较轻的操作,库存扣成功后,就可以成功了

  • 到账,是比较重的操作,需要涉及到到事务操作

  • 用户分流,以整点秒杀活动为例,在 1 分钟内,陆续对用户放开入口,将所有用户请求打散在 60s 内,请求就可以降一个数量级

  • 页面简化,在秒杀开始的时候,需要简化页面展示,该时刻只保留和秒杀相关的功能。例如,秒杀开始的时候,页面可以不展示推荐的商品。

客户端

  • 重试策略非常关键,如果用户秒杀失败了,频繁重试,会加剧后端的雪崩。如何重试呢?根据后端返回码的约定,有两种方法:

  • 不允许重试错误,此时 ui 和文案都需要有一个提示。同时不允许重试

  • 可重试错误,需要策略重试,例如二进制退避法。同时文案和 ui 需要提示。

  • ui 和文案,秒杀开始前后,用户的所有异常都需要有精心设计的 ui 和文案提示。例如:【当前活动太火爆,请稍后再重试】【你的货物堵在路上,请稍后查看】等

  • 前端随机丢弃请求可以作为降级方案,当用户流量远远大于系统容量时,人工下发随机丢弃标记,用户本地客户端开始随机丢弃请求。

接入层

  • 所有请求需要鉴权,校验合法身份

  • 如果是长链接的服务,鉴权粒度可以在 session 级别;如果是短链接业务,需要应对这种高并发流量,例如 cache 等

  • 根据后端系统容量,需要一个全局的限流功能,通常有两种做法:

  • 设置好 N 后,动态获取机器部署情况 M,然后下发单机限流值 N/M。要求请求均匀访问,部署机器统一。

  • 维护全局 key,以时间戳建 key。有热 key 问题,可以通过增加更细粒度的 key 或者定时更新 key 的方法。

  • 对于单用户/单 ip 需要频控,主要是防黑产和恶意用户。如果秒杀是有条件的,例如需要完成 xxx 任务,解锁资格,对于获得资格的步骤,可以进行安全扫描,识别出黑产和恶意用户。

逻辑层

  • 逻辑层首先应该进入校验逻辑,例如参数的合法性,是否有资格,如果失败的用户,快速返回,避免请求洞穿到 db。

  • 异步补单,对于已经扣除秒杀资格的用户,如果发货失败后,通常的两种做法是:

  • 事务回滚,回滚本次行为,提示用户重试。这个代价特别大,而且用户重试和前面的重试策略结合的话,用户体验也不大流畅。

  • 异步重做,记录本次用户的 log,提示用户【稍后查看,正在发货中】,后台在峰值过后,启动异步补单。需要服务支持幂等

  • 对于发货的库存,需要处理热 key。通常的做法是,维护多个 key,每个用户固定去某个查询库存。对于大量人抢红包的场景,可以提前分配。

存储层

对于业务模型而言,对于 db 的要求需要保证几个原则:

  • 可靠性

  • 主备:主备能互相切换,一般要求在同城跨机房

  • 异地容灾:当一地异常,数据能恢复,异地能选主

  • 数据需要持久化到磁盘,或者更冷的设备

  • 一致性

  • 对于秒杀而言,需要严格的一致性,一般要求主备严格的一致。

实践——微视集卡瓜分系统

微视集卡瓜分项目属于微视春节项目之一。用户的体验流程如下:

架构图

  • 客户端主要是微视主 app 和 h5 页面,主 app 是入口,h5 页面是集卡活动页面和瓜分页面。

  • 逻辑部分为分:发卡来源、集卡模块、奖品模块,发卡来源主要是任务模块;集卡模块主要由活动模块和集卡模块组成。瓜分部分主要在活动控制层。

  • 奖品模块主要是发钱和其他奖品。

瓜分降级预案

为了做好瓜分时刻的高并发,对整个系统需要保证两个重要的事情:

  • 全链路梳理,包括调用链的合理性和时延设置

  • 降级服务预案分析,提升系统的鲁棒性

如下图所示,是针对瓜分全链路调用分析如下图,需要特别说明的几点:

  • 时延很重要,需要全链路分析。不但可以提高吞吐量,而且可以快速暴露系统的瓶颈。

  • 峰值时刻,补单逻辑需要关闭,避免加剧雪崩。

我们的降级预案大概如下:

  • 一级预案,瓜分时刻前后 5 分钟自动进入:

  • 入口处 1 分钟内陆续放开入口倒计时,未登录用户不弹入口

  • 主会场排队,进入主会场以 100wqps 为例,超过了进入排队,由接入层频控控制

  • 拉取资格接口排队,拉取资格接口 100wqps,超过了进入排队,由接入层频控控制

  • 抢红包排队,抢红包 100wqps,超过了进入排队,由接入层频控控制

  • 红包到账排队,如果资格扣除成功,现金发放失败,进入排队,24 小时内到账。异步补单

  • 入口处调用后端非关键 rpc:ParticipateStatus,手动关闭

  • 异步补单逻辑关闭。

  • 二级预案,后端随机丢请求,接入层频控失效或者下游服务过载,手动开启进入

  • 三级预案,前端随机丢请求,后端服务过载或者宕机进入。手动开启

综上,整个瓜分时刻体验如下所示:

回顾下漏斗模型,总结下整个实践:

如何设计一个高可用、高并发秒杀系统相关推荐

  1. 高并发秒杀系统如何设计?

    前言 秒杀大家都不陌生.自2011年首次出现以来,无论是双十一购物还是 12306 抢票,秒杀场景已随处可见.简单来说,秒杀就是在同一时刻大量请求争抢购买同一商品并完成交易的过程. 从架构视角来看,秒 ...

  2. (更新时间)2021年5月28日 商城高并发秒杀系统(.NET Core版) 01-系统设计介绍

    秒杀项目 目标:从0到1构建一个高并发的秒杀系统 三个阶段 从0到1构建一个电商系统 从0到1构建秒杀系统 从0到1构建高并发秒杀系统 为了完成这个目标,我们需要知道几个前提 什么是电商 什么是秒杀 ...

  3. java商品详情页设计_java高并发秒杀系统3-2节商品详情页上.mp4

    本Java商城秒杀系统视频教程目录如下:    java高并发秒杀系统1-1节java高并发商城秒杀优化学习指引.mp4 java高并发秒杀系统1-2节项目环境搭建(Eclipse)-节.mp4 ja ...

  4. 分布式系统 概念 高可用 高并发 学习笔记

    分布式系统 概念 高可用 高并发 学习笔记 0. 分布式系统基本概念 0.1 背景 分布式系统是由一组通过网络进行通信.为了完成共同的任务而协调工作的计算机节点组成的系统.分布式系统的出现是为了用廉价 ...

  5. 【在线网课】Java高性能高并发秒杀系统方案优化实战

    java教程视频讲座简介: Java高性能高并发秒杀系统方案优化实战 Java秒杀系统方案优化 高性能高并发实战 以"秒杀"这一Java高性能高并发的试金石场景为例,带你通过一系列 ...

  6. SpringBoot、Redis轻松实现Java高并发秒杀系统笔记

    秒杀项目 优极限[完整项目实战]半天带你用SpringBoot.Redis轻松实现Java高并发秒杀系统 文章目录 秒杀项目 技术栈 课程介绍 学习目标 如何设计一个秒杀系统 项目搭建 分布式会话 登 ...

  7. 9种高性能高可用高并发的技术架构

    9种高性能高可用高并发的技术架构 每一个模式描述了一个在我们周围不断重复发生的问题及该问题解决方案的核心.这样,你就能一次又一次地使用该方案而不必做重复工作. 所谓网站架构模式即为了解决大型网站面临的 ...

  8. SpringBoot实现Java高并发秒杀系统之DAO层开发(一)

    SpringBoot实现Java高并发秒杀系统之DAO层开发(一) 秒杀系统在如今电商项目中是很常见的,最近在学习电商项目时讲到了秒杀系统的实现,于是打算使用SpringBoot框架学习一下秒杀系统( ...

  9. 高可用高并发的 9 种技术架构!

    高可用高并发的 9 种技术架构! 1.分层 分层是企业应用系统中最常见的一种架构模式,将系统在横向维度上切分成几个部分,每个部分负责一部分相对简单并比较单一的职责,然后通过上层对下层的依赖和调度组成一 ...

  10. 亿级流量网站架构核心技术 跟开涛学搭建高可用高并发系统

    亿级流量网站架构核心技术 跟开涛学搭建高可用高并发系统 1.高并发原则 1.1 无状态 1.2 拆分 1.3 服务化 1.4 消息队列 1.5 数据异构 1.6 缓存银弹 1.7 并发化 2 高可用原 ...

最新文章

  1. 21个UI设计必会的设计技巧
  2. Android NDK开发篇(一):新版NDK环境搭建(免Cygwin,超级快)
  3. 单靠MySQL进了字节,高端玩法才是王道!
  4. InnoDB Master Thread I/O Rate详解
  5. PHP执行批量mysql语句
  6. win32汇编定时器简单Demo
  7. Qt之QThread用法
  8. 大数据可视化有哪些优势
  9. SecureCRT中解决乱码的问题
  10. C++中常引用的注意事项以及常引用和非常引用之间的转换
  11. 翻译: TensorFlow 2.0 中的新功能
  12. LAN7500 Mac OS X Device Driver
  13. 解决”企业证书打包的ipa,点击app提示未受信任的企业级开发者“的问题
  14. 过招多家大厂提炼的iOS面试心经(答案版)
  15. LeetCode,无它,唯手熟尔(三)
  16. win8.1系统自带微软拼音输入法卸载教程
  17. mysql授权不管用_MySQL_MySQL授权问题总结,我用localhost的root帐号不能连 - phpStudy...
  18. JVM垃圾回收说为学日益,为道日损
  19. 怎么将mov格式的视频转换成MP4?
  20. 2023年安徽省职业院校技能大赛“网络空间安全”A模块

热门文章

  1. 《数字短片创作(修订版)》——第一部分 剧本创作 第1章 数字短片创意技法 剧本创作的构思...
  2. 将计算机退出域 脚本
  3. CodeForces - 1491E Fib-tree(模拟)
  4. HDU多校1 - 6756 Finding a MEX(分块+二分+树状数组)
  5. linux没有jre文件夹,linux上配置jdk时,java命令提示没有此文件或文件夹的解决方法...
  6. 机器学习-Logistic回归原理及实战
  7. 停止oracle执行session,Oracle 强制中止正在执行的SQL语句
  8. HDU4532(组合DP)
  9. poj1743(后缀数组+二分--不可重叠最长重复子串)
  10. HDU1066--高精度求阶乘最后非零位