打造千万级流量秒杀系统第一课 功能需求:秒杀业务背景及前端需求是怎么产生的?

发布于:2023-01-18 ⋅ 阅读:(394) ⋅ 点赞:(0)

你好,我是易乐天,到 2020 年,我在软件行业已经 10 年了。

我曾经做过 Linux 系统编程相关的工作,积累了许多性能优化方面的经验。后来,我开始做分布式系统的架构设计和实现,特别是项目当中涉及的“三高”架构——高可用、高性能、高并发。

其间,我越来越体会到“三高”架构对业务系统的长期稳定运行起着非常重要的作用。

为什么要重视“三高”架构?

记得那是 2016 年初,我做 IM 云核心服务开发。当时我们的核心服务是个大的单体应用,每到客户做活动的时候,系统的 CPU 负载都会超过 90%,请求错误率超 10%。

更可怕的是,高负载导致已建立的连接因心跳超时而断开,而连接断开后客户端又尝试建立连接,最终导致雪崩,服务被压垮重启,整个集群不可用。当时许多客户都来投诉我们,威胁着要退钱,我们整个团队都面临巨大的压力。

在后面的工作中,我们暂停了功能开发,转而寻找事故原因。最后发现,主要是因为系统功能没拆分,从而导致业务处理逻辑跟连接管理功能抢夺资源;也缺乏熔断和限流,没有预防 DDoS 攻击的能力;热点数据缓存设计也不合理,系统堆积大量请求,等等。

为什么会出现这些问题?就是因为在做架构设计的时候,没考虑到高可用、高性能、高并发的问题!

还有一次,那时我进入小米没多久,遇到了小米国际电商举办 2017 年印度 Diwali 节秒杀活动。当时运营和客服就收到了许多米粉的投诉。原来活动期间秒杀系统因为并发压力大,CPU 被打满,大量用户点了秒杀按钮后不能下单,一直提示“系统繁忙,请稍后再试”。

活动不能停,也不能直接在线上系统排查和调试,我和同事急得像热锅上的蚂蚁,最后紧急扩容了一半的机器,才扛过这场秒杀活动。

正是经历了这些事故,我才感叹,对大流量系统来说,处理好“三高”问题有多重要。

三高_大流量系统.png

比如,高可用对系统来说就是生命线,因为一个可用的系统才能产生价值;而系统的并发能力越高,则意味着它能同时服务的用户就越多,如果没有处理好,会因为并发请求抢夺资源而耗时过长或数据错乱;还有单机性能的提高,既可以提升系统稳定性,还能降低系统运行成本。

如今三四年过去了, 在工作中我也积累了丰富的经验,我曾将 IM 系统长连接服务的单机并发能力从 2 万提升到 5 万,可用性从 99.9% 提升到 99.999%;也曾将小米国际电商秒杀系统的整体性能提升了至少 30%。

与此同时,我还发现众多大厂在招聘高级工程师以上的岗位时,都要求有“三高” 架构方面的经验。比如拉勾上发布的岗位信息:

Drawing 0.png
Drawing 1.png

(以上职位信息来源:拉勾网)

为什么大厂会有这样的招聘要求呢?

因为大厂本身用户量大,或者它的某项业务的用户在迅速增长,这意味着服务器成本非常高。为了降低企业成本,大厂就需要掌握“三高”技术的高级工程师努力提升软件的性能和并发能力,最大限度压榨服务器性能,减少浪费。

还有用户量和业务达到一定程度后,意味着每次宕机都可能给公司带来巨大的经济损失,而掌握“三高”架构的高级工程师可以有效降低非人为导致的风险。

所以,如果你掌握了“三高”架构并拥有实践经验,也就意味着你应聘这些岗位的时候更具有竞争力。

还有,据我多年经验发现,初级架构师或服务端工程师不一定能接触到大流量系统。即使接触到了,他们也不一定能负责系统的“三高”架构设计。而当你随着工作经验的增长,公司会尝试给你一些很有挑战的工作,此时你怎么办呢?逃避吗?

所以,对于架构师和服务端工程师来说,学习“三高”架构还是一次获得成长和晋升的机会。另外,想要进大厂拿高薪,我们拉勾教育还有一门《Java 工程师高薪训练营》,往期已经有学员经过学习训练+面试模拟+大厂内推成功拿到 Offer,你也可以试试哦。

“三高”架构对秒杀系统的意义

秒杀系统对电商来说是流量大杀器。每年春节、情人节、618、双十一等大促节日,各大电商平台都会有秒杀活动,好几亿的用户会参与进来。而对小米来说,每年双十一也有超过百万人来参加。

在小米工作期间,我发现秒杀系统的业务逻辑其实很简单,它的难点就是保障系统的高可用、高并发、高性能。

难点在三高.png

为什么这样说呢?

秒杀的核心业务主要是配置秒杀活动,让用户在活动页上抢购特价商品并下单。这个看似简单的功能,其背后需要做大量工作来支撑庞大流量,以免系统在巨大的压力下宕机,既影响用户体验又会造成巨大经济损失。

而那次 2017 年的印度 Diwali 节秒杀活动,就是没有处理好这方面的事情。在那之后,我发现小米国际电商的秒杀系统在高并发下 CPU 容易超过 90%,Redis 请求量也非常高。而第二年,也就是 2018 年参与米粉节秒杀活动的用户量和并发 QPS 预计在百万以上。通过评估,我发现如果要扛住这次活动,要么增加机器,要么优化秒杀系统并发性能,否则系统会被流量压垮。

怎么办?当然是迎难而上。在机器成本不变的前提下,基于以前 IM 云“三高”架构的优化经验,我对小米国际电商的秒杀系统做了一系列优化,让它的并发性能提升了 30%,最终保障了这次米粉节秒杀系统稳定运行。

正是因为我实际经历过秒杀系统的“三高”问题,而它确实对所有涉及 ToC 端的交易业务非常重要。所以,我想以秒杀系统为例,在典型场景下为你详细介绍“三高”架构。我也希望能对想要了解秒杀、抢购、抢票等涉及“三高”场景的架构师和服务端开发工程师有所帮助。

课程设计

在这里,我将会以一个完整的项目流程形式,从需求分析、架构设计、代码实现、性能测试这四大部分,渐次带你设计出符合“三高”要求的秒杀系统,真正搞懂“三高”架构及其实现。

整个专栏的设计思路如下图所示:

Drawing 2.png

第一部分,需求分析(模块一):我将从电商发展史和秒杀系统的业务背景入手,介绍秒杀系统的前后端功能需求和非功能需求,特别是如何通过思想实验来分析非功能需求中的“三高”并计算其指标。通过学习这块内容,我希望你能掌握“三高”架构的需求分析,不至于在开始之初就手忙脚乱。

第二部分,架构设计(模块二 ~ 五):这部分我将为你分享秒杀系统的总体架构设计及其具体的高可用、高性能、高并发原理和方法。这部分,你将学到如何通过领域驱动设计(DDD)来设计秒杀系统,如何利用云计算基础设施设计高可用架构,如何利用池化技术、漏斗模型、熔断和限流等技术手段提升并发能力和稳定性。

第三部分,代码实现(模块六 ~ 九):我将介绍秒杀系统的代码实现细节,希望你能学到如何利用热更新、池化技术、缓存技术、漏斗模型等高级编程技巧,提升服务的并发性能和稳定性。

第四部分,性能测试(模块十):我将介绍项目落地的最后环节——如何做好验收工作,希望你能学会用压力测试来做性能调优,以及了解项目上线后需要注意的事情。

讲师寄语

一直以来秒杀系统的难点在“三高”上,如果你学完这个专栏的内容,我相信有关它的稳定性、缓存穿透、库存超售、反黄牛等问题,将迎刃而解。

而且课程中还有占 40% 的“三高”架构设计原理,再加上代码实现部分,我希望通过这个典型的业务场景,能让你真正搞懂“三高”架构,在涉及其他系统架构时也能举一反三、融会贯通,进而在工作中享受成就的乐趣,并拥有更宽广、顺畅的职业发展。

“三高”架构的学习之旅已然开始,我也在留言区期待你的声音。有效的学习,永远是“学”和“习”两重动作的合力成效,希望我们的交流过程更好地促成进步,也希望你记得,这里有众多和你一样在努力的同好,一起钻研、前行。


你好,欢迎来到第 01 讲。

先问你一个问题:为何我们要在项目开始前要先了解业务背景和需求?

拿到一个项目,你也许能从技术层面上做出来,但你真的知道为何要做这个项目吗?如果没有充分了解业务背景和需求,你能确保自己理解项目的业务价值吗?能确保自己开发的产品符合要求吗?所以,为了避免后期设计走偏,这一讲我先和你聊聊秒杀的业务背景和前端需求。

什么是“秒杀”?

“秒杀”对经常网购的人来说应该不陌生吧?它是商家通过少量库存和超低价格的方式吸引用户的一种营销手段。但你知道它为何叫“秒杀”吗?又是在什么背景下诞生的呢?接下来我们就从电商发展史讲起。

电商发展史

问你个问题:中国最早的电子商务公司是哪一年诞生的?

1997 年,当时有两家 B2B 公司——中国商品交易中心和中国化工网,它们分别在这一年诞生。之后到了 1999 年,携程网、易趣网、当当网陆续上线。此时电商处于萌芽期,中国网民占比非常低。

时间进入 2000 年,伴随互联网泡沫,大批互联网公司倒闭,而阿里巴巴也在这一年拿到了软银投资;2003 年非典,因为城市全员隔离,线下交易暂停,线上电商便迎来了新的机遇,京东和淘宝就是在这一年出现的。

2005 年苏宁网上商城一期面世,2008 年淘宝网在商品详情里推出竞拍秒杀功能。同年,京东在网站上以秒杀的形式第一次推出了“618”活动。

2009 年 9 月 25 日,为庆祝成立 6 周年,淘宝网在首页推出“一元秒杀”活动,蜂拥而来的流量让商品详情功能瘫痪好几分钟。也就是这一年,淘宝“双11”活动上线。

可以说,2000 年到 2009 年,是电商发展的波动期、酝酿期,在经历了互联网泡沫和非典的重新洗牌,电商进入高速发展阶段。特别是 2010 年双十一的价格大战和 2013 年小米 816 大狂欢。前者苏宁易购、京东、淘宝三大电商争相通过降价、秒杀等方式进行大型促销活动,后者 10 万件商品 1 元秒杀。

如今,电商已经从一线二线城市拓展到农村和海外,农村电商和跨境电商也成为常态。

Drawing 0.png

中国电商发展史图

下图是中国电商发展史和淘宝历年双十一成交额图。从我们的实际感受和淘宝双十一成交额看,伴随着互联网迅速发展,中国网民数量也在快速增加。 2019 年,仅淘宝参与双十一的用户就达到了 5 亿。

Drawing 1.png

淘宝历年双十一成交额图

秒杀业务背景

看完了电商发展史你有什么发现没有?秒杀系统在其中充当了一个什么样的角色?

首先,“秒杀”第一次出现是在 2008 年淘宝推出的“竞价秒杀”功能,当时淘宝看到营销效果非常喜人,第二年在办 6 周年庆时,又推出了“一元秒杀”活动。虽然 2008 ~ 2009 年“秒杀”已经出现了,但它真正火起来还是在经历淘宝、苏宁、京东双十一价格大战之后的 2011 年。

这是秒杀系统的第一个业务背景:电商大环境营销模式形成秒杀活动在 2011 年后流行起来

其次,伴随着互联网用户、电商用户量爆发式增长,商家低价促销已成为获客的重要方式之一。试想一下,一件原价 100 块的畅销商品,你可能会犹豫;而标价变成 1 块钱的时候,你不会心动吗?

正是利用这种占便宜、省钱划算的心理,商家用很少量的库存,获取成千上万甚至几十万用户的关注。特别是在大型促销活动中,当某个商家推出低价促销后,为了抢夺平台上的用户,竞争对手也会推出类似手段。

这就是秒杀系统的第二个业务背景:电商用户爆发式增长,竞争激励,各大电商纷纷低价促销抢夺用户

最后,在秒杀系统出现之前,这种低价促销的方式都是直接在商品详情页改商品价格。由于普通的商品详情页本身并不具备处理大流量的能力,一旦遇上大型促销活动,它很可能就抗不住而崩溃。

以小米网为例,2012 年 1 月,小米手机在官网第二轮开售,用户访问量直接把小米网挤瘫痪了。2013 年 1 月,MIUI 用户突破 1000 万,高性价比和粉丝经济,给小米网带来了极大的承受压力。

每年小米网都会有几场大型促销活动:米粉节、618 大促、816 大促、双十一大促、年终大促等。你可以想象下这样一个场景:每逢大型促销,作为米粉的你打开小米网,守着心仪商品降价或释放库存的那一刻,到关键时刻系统却崩溃了,你心里是什么感觉?

即便网页顺利打开,结果却被许多“黄牛”利用“秒杀器”工具一下子将原本不多的库存刷走了,你的心情会怎样?

这是秒杀系统的第三个业务背景:在大型促销活动中,老系统面临并发性能、可用性、公平性等问题的挑战

以上就是秒杀系统的业务背景分析,它是电商发展到一定规模后必然出现的产物,只有了解了秒杀系统诞生的业务背景以及需要解决的问题,我们才好进行准确的需求分析。

业务背景.png

前端需求分析

接下来,让我们从前端开始,看下秒杀系统的需求都有哪些。

你可能会问:为何我们要从前端需求分析开始呢?想一想,当用户登录电商网站,先看到的是什么?对,是首页!首页对用户来说就是查看网站主要信息的入口,对我们来说就是前端。

前端是一个系统中离用户最近的部分,为用户提供信息展示、交互逻辑等。当前端的需求基本决定,一个系统的功能需求也就随之产生。 所以,接下来,我们重点分析一下秒杀系统前端的需求。

前端需求.png

1. 秒杀详情页

在小米网上,一个用户是如何进入秒杀系统的前端页面呢?

首先,作为电商的子功能模块,秒杀通常不会直接出现在首页上,而是有一个单独的秒杀详情页,首页作为它的流量入口。用户会先打开平台首页,从首页秒杀入口进入到秒杀功能模块的页面。

当用户通过首页入口进入到秒杀页面后,他希望看到什么信息呢?应该是有关这场秒杀活动的详细信息,比如活动场次、秒杀商品、秒杀价格,活动规则等。对我们来说,这就是秒杀详情页。

详情页会展示多场秒杀活动信息以及每场秒杀活动的商品信息,让用户选择自己感兴趣的活动场次。比如今天 9:00 ~ 10:00 是小米手机专场,10:00 ~ 11:00 是红米手机专场,11:00 ~ 12:00 是生态链产品专场。

因此,秒杀详情页需要划分两个展示区:活动场次信息区活动商品列表区。活动场次信息区里可以点击场次按钮切换场次;活动商品列表区里可以点击某个商品的按钮查看商品详情。

2. 查看商品列表

接下来,用户可能会点击活动场次信息区的某个场次,查看该场次的商品列表。像点击“出行穿戴”专场,就可以查看所有参与秒杀活动的穿戴商品,比如小米手环 4 NFC 版,大屏彩显,可刷公交和门禁,原价 229,活动价 179,库存剩余 8%等信息。

对应到前端需求当中,就是商品列表区的商品信息——商品图片、商品名称、广告语、库存信息、原价、活动价、秒杀按钮。

接下来,用户可能直接点击商品按钮,这里会出现 3 种情况:

  1. 活动已开始,对于已登录用户来说,按钮提示“立即抢购”,点击后会跳转到商品详情页;

  2. 活动已开始,对于未登录用户来说,按钮提示“登录后抢购”,点击后会跳转到登录页;

  3. 活动未开始,按钮则会提示“提醒我”,点击后就会订阅活动通知。

最后,当用户进入到商品详情页,可能希望看到诸如“原价 229,活动价 179,距离结束还剩 15 分钟”的活动信息;“全新 AMOLED 大屏彩显,手环刷公交卡、门禁卡,能用支付宝抬手支付……”的商品描述信息;“黑色”“白色”等规格选项;“北京朝阳区”“上海浦东区”等配送区;是否有货的库存信息。这些就是商品详情页的前端需求。

以上就是用户参加秒杀活动时,在前端页面出现的行为及需求,具体落实到前端设计,主要包括 UI 设计和交互逻辑。

3.UI 设计

UI 设计主要包含秒杀系统各个功能页面的内容和布局,大致有 3 类:首页入口、秒杀活动页、商品详情页。

首页入口主要是秒杀广告位。

Drawing 2.png

小米秒杀首页入口图

秒杀活动页包括活动场次区和场次详情区。其中活动场次区,包括进行中的活动和未进行的活动;场次详情区,包括商品列表、商品信息(比如商品图片、名称、广告语、原价、活动价、库存信息、秒杀按钮)。

下面是小米秒杀活动场次UI,包括用户未登录和已登录活动进行中的图示,还有未进行的活动图。

Drawing 3.png

小米秒杀未登录用户访问进行中活动图

Drawing 4.png

小米秒杀已登录用户访问进行中活动图

Drawing 5.png

小米秒杀未进行的活动图

其中,页面顶部显示 5 场活动时间和活动状态的区域叫活动场次区,主要用来告诉用户活动什么时候开始,有哪些场次。

活动场次区下面的就是场次详情区,主要展示选中的场次有哪些商品会参加该场活动。比如抽纸、电热锅、吸尘器等就是 20:00 这个场次的商品,净水器、160L 银色对开门冰箱就是 22:00 这个场次的商品。

商品详情页主要包括基本信息和销售信息。比如下面的抽纸商品页,其中就包含了它的商品图片、商品名称、商品描述、商品规格等基本信息;还有原价和活动价、配送地区、库存信息等销售信息。

Drawing 6.png

小米秒杀商品详情页图

4.交互逻辑

介绍完 UI 设计,我们来说下交互逻辑。所谓交互逻辑,主要包括页面上各个部分对用户行为的交互方式和响应结果,它是基于 UI 设计页面来进行的。我们还是以首页入口、秒杀活动页、商品详情页来介绍。

首先来看首页入口,它的交互逻辑是“点击秒杀广告位进入秒杀活动页”。

秒杀活动页,它存在四大交互逻辑,请看下面的流程图。

Drawing 8.png

  1. 当用户进入活动页,如果当前页面显示的就是他想要的场次信息,那么他就会参与其中。

  2. 活动场次切换,如果当前显示页面不是他想要的,用户则会点击切换场次,这就是用户点击切换,还有一种是自动切换,它需要设定定时任务判断时间,到了时间则自动切换,切换后系统自动重新获取活动场次信息。

  3. 接下来,为了找到自己想买的商品,用户会点击活动详情区的商品,进入到商品详情页。

  4. 活动详情区商品的按钮。如果是活动已开始,未登录用户会提示“登录后购买”,点击则会跳转登录页;如果是已登录用户,则会提示“立即抢购”,点击后会跳转到商品详情页。如果活动未开始,则会提示“提醒我”,点击订阅活动通知。

最后,我们来介绍下商品详情页上的交互逻辑。它有三类交互,请看用户操作流程图。

Drawing 10.png

第一个交互,点击配送区修改按钮,选择配送地区;

第二个交互,点击规格按钮,选择商品对应规格;

第三个交互,点击秒杀/购买按钮。这里会出现两类状态,一类是活动进行中,一类是活动未进行。

在活动进行中,如果是未登录用户,则会提示“登录后购买”,然后点击跳转登录页;如果是已登录用户,则会提示“立即抢购”,点击后若抢购成功,将商品加入购物车,商品享受活动价。若抢购失败,根据后端返回,给出失败提示“活动已结束”或“已售罄”。

活动未进行,交互逻辑会提示“加入购物车”,点击后将商品加入购物车,商品不享受活动价。

另外,由于用户量大,页面需要采用前后端分离、动静数据分离的方式,静态资源和静态数据由 CDN(Content Delivery Network,内容分发网络)和前端缓存,尽量减少对后端的压力。

小结

这一节我们从电商的发展史中了解到了秒杀系统诞生的业务背景,然后从 B2C 电商业务模式、用户量、营销手段等方面综合分析了秒杀系统的前端功能需求。

需要注意的是:不同电商的秒杀系统,可能存在细微的差异。比如,对于用户非常熟悉的商品,有的电商是在秒杀详情页点按钮后可以直接加购物车,不用跳商品详情页;有的电商可能跳过加购物车环节,直接扣库存并生成订单。总之,具体实现要看具体的业务需求。

对于一个秒杀系统来说,这一讲的内容看上去不是核心内容,但实际上需求分析是一个项目中最关键的环节之一。只有把需求弄清楚了,在项目落地的时候方向才会有的放矢,才能设计出既满足业务需求又能稳定运行的业务系统。

思考题:如果不跳商品详情页,并跳过加购物车环节,前端该怎么设计?

这一节就介绍到这里了,下一课时我们将介绍秒杀系统的管理后台和后端功能需求,看看秒杀活动信息是如何管理的。



网站公告

今日签到

点亮在社区的每一天
去签到