如何设计一个高可用高并发秒杀系统

腾讯技术工程 腾讯技术工程     2022-11-28     712

关键词:




作者: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,手动关闭

  • 异步补单逻辑关闭。

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

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

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

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


    如何设计一个秒杀系统----学习总结

    第一章学习总结——概览https://time.geekbang.org/column/article/401531.秒杀主要解决问题——并发读和并发写。并发读的核心优化理念是尽量减少用户到服务端来读取数据,或者让他们读更少的数据。并发写的处理原则是在数据库层面独... 查看详情

    高并发系统的设计及秒杀实践

    一个大型网站应用一般都是从最初小规模网站甚至是单机应用发展而来的,为了让系统能够支持足够大的业务量,从前端到后端也采用了各种各样技术,前端静态资源压缩整合、使用CDN、分布式SOA架构、缓存、数据库加索引、读... 查看详情

    高并发系统设计:系统设计目标②系统怎样做到高可用?

    ...。可用性的度量可用性是一个抽象的概念,你需要知道要如何来度量它,与之相关的概念是:MTBF和MTTR。MTBF(MeanTimeBetweenFailure)是平均故障间隔的意思,代表两次故障的间隔时间,也就是系统正常运转的平均时间。这个时间越... 查看详情

    高并发高可用架构设计之简介

    ...就多加几台服务器来分担了。用了集群化部署,就要考虑如何将流量分发到集群,这就用到了负载均衡技术,目前流行的是LVS和Nginx。常用的负载算法有轮询法、随机法、源地址哈希法、加权轮询法、加权随机法、最小连接数法... 查看详情

    高并发高可用架构设计之简介

    ...就多加几台服务器来分担了。用了集群化部署,就要考虑如何将流量分发到集群,这就用到了负载均衡技术,目前流行的是LVS和Nginx。常用的负载算法有轮询法、随机法、源地址哈希法、加权轮询法、加权随机法、最小连接数法... 查看详情

    如何设计一个能抗高并发的秒杀场景(代码片段)

    ...#xff1a;秒杀场景中有许多需要考虑的问题,这里只是将如何设计一个能抗高并发的秒杀设计的主流程进行分析!!!一、秒杀的特点商品库存总量固定先到先得,瞬时并发极大商品数量和库存数量有限二、如何... 查看详情

    秒杀系统设计方案

    秒杀系统设计方案一、秒杀系统架构设计关键点1.两个问题,一个备选方案(1)秒杀其实主要解决两个问题一个是并发读,并发读的核心理念是尽量减少用户到服务端来“读”数据,或者读更少的数据。一个是并发写,并发写... 查看详情

    2017-5-26/描述一个高性能高可靠的网站架构——如何设计一个秒杀系统

    一、秒杀的应用场景电商网站的抢购活动、12306网站的抢票、抢红包。 二、秒杀的特点1、秒杀时大量用户会在同一时间同时进行抢购,网站瞬时访问流量激增。2、数据库的并发读写冲突以及资源的锁请求冲突非常严重。3、... 查看详情

    「绝密档案」“爆料”完整秒杀架构的设计到技术关键点的“八卦追踪”

    ...介绍高性能:涉及高并发读和高并发写的支持,如何支撑高并发,如何抵抗高IOPS?核心优化理念其实是类似的:高并发读就尽量"少读"或"读少",高并发写就数据拆分,以便减少并发写出现... 查看详情

    成为架构师课程系列高并发系统设计的三大目标:高性能高可用可扩展

    系统设计目标1:如何提升系统性能?提到互联网系统设计,你可能听到最多的词儿就是 三高,也就是 高并发、高性能、高可用,它们是互联网系统架构设计永恒的主题。在前两节课中,我带你了解了高并发系统设计的... 查看详情

    如何设计一个秒杀系统?

    ...–>高性能:涉及大量秒杀的并发读和并发写,如何支持高并发?1.设计数据动静分离2.热点的发现与隔离3.请求的削峰与分层过滤4.服务端的极致优化一致性:核心:如何设计秒杀减库存方案高可用:planB... 查看详情

    李智慧·高并发架构实战课课程大纲

    ...方法:面对高并发,怎么对症下药?504|网页爬虫设计:如何下载千亿级网页?605|网盘系统设计:万亿GB网盘如何实现秒传与限速?706|短视频系统设计:如何支持三千万用户同时在线看视频?807|海量数据处理技术回顾:为什么分... 查看详情

    十万级低成本超详细的秒杀高并发设计,快收藏起来(代码片段)

    ...秒杀,小米手机的秒杀,那么秒杀系统的后台是如何实现的呢?我们如何设计一个秒杀系统呢?对于秒杀系统应该考虑哪些问题?如何设计出健壮的秒杀系统?本文我们就来探讨一下这个问题。秒杀应该考... 查看详情

    实战高并发大流量秒杀系统

    目录php的视频go视频数据库层:案例:秒杀系统的设计和分层介绍:第一个版本秒杀模块的划分秒杀接入层核心功能php的视频学习地址:https://ke.qq.com/course/1586364?tuin=30289dc0go视频学习地址:https://ke.qq.com/course/314678?taid=219870972325407... 查看详情

    如何设计一个秒杀系统

    ...高可用的分布式系统。高并发环境下的系统稳定性:如何保证系统在面对巨大的流量情况下,不被打崩?两个问题并发读核心优化理念:减少用户到服务端来读数据。或者让他们读取更少的数据。并发写核心优化... 查看详情

    如何设计一个秒杀系统

    ...高可用的分布式系统。高并发环境下的系统稳定性:如何保证系统在面对巨大的流量情况下,不被打崩?两个问题并发读核心优化理念:减少用户到服务端来读数据。或者让他们读取更少的数据。并发写核心优化... 查看详情

    实战高并发大流量秒杀系统

    目录php的视频go视频数据库层:案例:秒杀系统的设计和分层介绍:第一个版本秒杀模块的划分秒杀接入层核心功能php的视频学习地址:https://ke.qq.com/course/1586364?tuin=30289dc0go视频学习地址:https://ke.qq.com/course/314678?taid=219870972325407... 查看详情

    京东高并发秒杀解决方案

    ...间流量峰值。高峰值流量是压垮系统很重要的原因,所以如何把瞬间的高峰流量变成一段时间内的平稳流量是设计秒杀系统很重要的思路,实现削峰的常用的方法是利用缓存和消息中间件等技术。超卖设计:库存数量有限,如何... 查看详情