为了账号安全,请及时绑定邮箱和手机立即绑定
慕课专栏

目录

索引目录

如何设计一个Java秒杀系统

限时优惠 ¥ 46.00

原价 ¥ 58.00

12月19日后恢复原价

限时优惠
立即订阅
03 秒杀系统的技术挑战
更新时间:2019-11-20 18:31:47
青年是学习智慧的时期,中年是付诸实践的时期。

—— 卢梭

在上一节中,我们从业务角度梳理了秒杀活动的具体流程。本节会站在技术的角度,分析秒杀系统将会面临的挑战,以及重点需要解决的问题。

在秒杀活动期间,海量的请求会依次涌向系统的前台、后台服务器和数据库服务器,三者都会面临巨大的性能挑战,接下来进行具体的分析。

1 前台

在秒杀系统中,前台主要面对的问题是“静态资源”和“未处理的海量请求”。

  • 静态资源

    秒杀活动的目的是促销。为了控制成本,大型秒杀活动的频次是很低的,有的商家可能一年只搞一两次。因此,为了一次备受瞩目的秒杀,商家都会做好充分的准备:认真准备文案、精心设计高清图片、给商品拍摄视频短片……然而,这些图片、视频等静态资源却给系统带来了存储的负担。在秒杀期间,这些静态资源会被大量的用户访问,从而会导致网络带宽出现瓶颈,因此还需要考虑网络带宽的负载能力。

    如何存储秒杀活动时的大量静态资源?如何解决静态资源造成的网络宽带问题?

  • 未处理的海量请求

    前台是整个秒杀系统第一次直面海量请求的部位。因此,前台遇到的请求数是“原汁原味”的,是没有经过任何处理的。并且在全部的用户请求中,除了正常的请求以外,还可能存在各种无效或非法请求,举例如下:

    • 用户在等待秒杀开始的前几秒,可能会反复刷新页面;
    • 抢单机器人甚至会进行毫秒级的轮询抢单。

    可见在整个秒杀活动期间,实际的请求数量要远远大于潜在的用户数量。前台页面就是整个秒杀系统承受流量的第一道防线。

如何在前台限流,尽力守卫后台服务器和数据库服务器?

说明:本段文字以及本节的后续内容,在描述时使用了很多的疑问句,例如:“如何存储秒杀活动时的大量静态资源?”。这些提问是为了让大家先思考秒杀系统面临的技术挑战,相关问题的答案会在本专栏的后续为大家介绍。

2 后台服务器

即使在前台进行了限流,也仍然会有大量合法请求涌到后台服务器。因此,后台服务器就需要解决高并发造成的各种问题,举例如下。

  • 数据的准确性。例如超卖问题、并发一致性问题等。

    • 超卖问题。即如何避免“用户成功下单的数量 > 秒杀商品的库存数量”?在处理超卖时,还要考虑一些不良的恶意行为。例如,如果竞争对手故意将商品抢到手但却不付款,该如何处理?
    • 并发环境下的一致性问题。如果使用了缓存,如何保证缓存的一致性?如果使用了分布式,如何保证分布式事务的一致性?
  • 数据的时效性

    除了要在并发环境下保证数据的准确性以外,秒杀系统还要控制数据的时效性。例如,用户在下单后,系统务必要在几秒内返回结果,保证用户体验。

  • 系统的可用性

    为了防止单节点故障,保证系统的高可用性,就需要将秒杀系统部署在由多个节点组成的集群上。集群如何搭建?应该依据什么将海量请求分流到集群中的不同节点上?在机房部署集群时,应该如何具体划分?

  • 系统的稳定性

    除了高可用以外,我们也应当尽力提高集群中各个节点的性能。高并发会导致部分节点的性能下降,甚至造成某些节点的崩溃。我们如何在有限的硬件条件下,提高单节点的性能,从而提高整个集群系统的稳定性?

    提示:以上描述的“系统的可用性”是指搭建集群,“系统的稳定性”是指提高集群中每个节点的性能。

作为系统的设计者,我们还应当思考:即使我们尽力准备了一切,但如果秒杀服务在极端情况下仍然无法满足海量请求的冲击,是否会对电商平台中物流、客服等其它服务造成影响?即,秒杀服务只是整个电商系统中的一个子系统,我们应该在为秒杀服务做好充足准备的同时,再为整个系统留一条退路。

高并发问题一直是后端开发的难点之一,而秒杀又是高并发的极致体现。因此,秒杀系统的后端设计,也是后端开发者的最大挑战之一。

3 数据库服务器

数据库作为整个系统的存储末端,是系统的最后一块阵地。前台没了,可以重写;后台没了,可以重造。但如果数据库垮了,数据就彻底没了(暂不考虑数据恢复技术)。你能想象银行数据库垮掉带来的后果吗?

在秒杀等高并发问题中,数据库面对的核心问题是“并发量”、“并发访问”和“存储容量”。

  • 并发量

    对于一般的单节点关系型数据库来说,仅仅能够稳定的支撑千位数的并发量。因此在高并发环境中,往往最先遇到并发瓶颈的就是数据库。简言之,数据库是整个系统最重要的一环,但同时又是并发能力较弱的一层。

  • 并发数

    当海量请求经过了前台和后台的重重拦截抵达数据库时,必然会产生并发问题。那么,应该如何既避免并发带来的问题,又能高效进行数据存储呢?

  • 存储容量

    一个关系型数据库的存储容量有限。对于大型电商平台而言,是无法将全部的数据保存到同一个数据库中的。那么,数据应该如何存储?存储后,如何保证数据库的高可用?

小结

本节分析了秒杀活动给电商系统带来的巨大挑战。系统的前台,一方面会承受秒杀带来的全部流量冲击,另一方面需要对这些原始流量进行过滤,为后台和数据库减压。前台过滤后的流量会抵达后台服务器,后台作为整个系统的逻辑处理核心,既要保证请求数据的准确性、时效性,也要顾及系统的可用性和稳定性。通过后台处理的流量最终会冲向数据库,数据库要在自身并发数和存储容量都较低的情况下,御敌高并发量的冲击。

综上,秒杀系统的设计贯穿了前台、后台和数据库等各个层面设计,并且对每个层面都拥有极限的考验。因此,对秒杀系统的设计也一直都是考验全栈开发者的一块验金石。

通过本节的学习,我们了解了秒杀活动给系统各个层面带来的技术挑战,同时也积攒了很多问题。如果把这些问题都搞清楚了,设计一个秒杀系统就会变得像顺水推舟一样简单。从下一节开始,本专栏就会陆续介绍如何去应对这些挑战,上面的疑问也将一一得到解答。

}
限时优惠 ¥ 46.00 ¥ 58.00

你正在阅读课程试读内容,订阅后解锁课程全部内容

千学不如一看,千看不如一练

手机
阅读

扫一扫 手机阅读

如何设计一个Java秒杀系统
限时优惠 ¥ 46.00 ¥ 58.00

举报

0/150
提交
取消