Skip to content

四火的唠叨

一个纯正程序员的啰嗦

Menu
  • 所有文章
  • About Me
  • 关于四火
  • 旅行映像
  • 独立游戏
  • 资源链接
Menu

常见分布式应用系统设计图解(十):电商秒杀系统

Posted on 11/16/202008/14/2022 by 四火

这篇是关于电商平台秒杀系统的。

首先,我觉得 “秒杀” 是一个中国色彩浓重的词,这样的概念在西方电商系统中也有,但只有在中国,本来业务量就已经如此之巨大了,还将其如此发扬开来。因此顶尖的秒杀高并发场景,还真是基本上只有在中国的电商平台系统中,才能见得到。

其次,我觉得对于系统设计的学习,电商秒杀系统这样的极致,即便再精彩,还是应当放在第二位的。扎扎实实地把常规的高并发系统设计做好,才是最重要的。因为无论秒杀系统使用怎样的特殊技巧和手段,高并发分布式系统才是一个秒杀系统工作的根基。

有了以上说明,现在再来谈论电商秒杀系统。电商秒杀系统,它首先是一个电商系统,因此一个大型的电商系统一般要至少包括这样几个功能:

  • 商品浏览
  • 商品入购物车
  • 下订单
  • 结算支付

因此,对于上面这张图,先从电商系统的角度来看。为了实现电商系统的基本功能,应该具备这样几个服务:

  • Product Service,包含产品元信息。
  • User Service,包含用户信息。
  • Storage Service,包含产品库存信息。
  • Payment Service,提供专门的支付服务。
  • Order Service,订单服务。
  • 当然还有一些没有列出来,比如搜索、陈列产品的服务等等。

流程上面:

  • 下面实线部分就是订购流程的主体,其中的多数内容,无论是不是秒杀,都是一样的。
  • 用户进行选择订购支付,订单下成功以后,会去库存里面暂时锁住货物记录,给用户时间支付,用户支付成功以后,会修改订单状态,订单系统就会相应地修改库存该货物的状态。
  • 如果超过一定时限没有支付成功,订单系统会异步修改库存状态,把该货物的状态改回 “可订购”,并关闭当前订单。

有了基本的电商系统角度对组件和流程的认知,再来看秒杀的角度。

  • 上面虚线的部分,就是秒杀活动前准备的部分。管理员会创建秒杀活动记录,这些秒杀货物会单独标记和存放,以避免被普通订购业务所涉及。在活动开始前秒杀服务器会加载相应的数据到内存中,这部分下面会提到。
  • 对于为了秒杀而进行的系统设计与优化,首先,最重要的一条,是要做到系统隔离。秒杀系统要尽可能地不要影响到主要业务,因此这里面的 web 服务,要单独使用为秒杀服务配备的服务器。
  • 其次,要尽可能地把请求拦截在流程的前部,并平滑请求量。
    • 比如,秒杀链接生成的时候,用户的请求可以不用全部放进来,对于流量特别大的情况,让大部分用户的请求从用户就近节点的 CDN 走,告知用户秒杀结束。只有少部分用户的请求放到中心节点来。
    • 比如,对于秒杀页面的加载,静态资源要尽可能在动静分离的前提下,地使用页面缓存和从 CDN 去获取,以减缓对主系统的压力。
    • 再比如,通过点击后按钮置灰、验证码、答题、token 等方式减少和延缓用户请求,也过滤掉那些脚本请求。
    • 最后,也是最重要的,是系统一定要具备成熟的流控机制,丢弃无法处理的请求。
  • 再次,系统要尽可能地减少请求处理的时间,从而增大吞吐量。
    • 比如,在 Web Server 上要引入缓存,将秒杀商品的信息加载到内存中。每台机器都分配一定量的可秒杀商品,这些商品页全部加载到内存中。秒杀防重也在内存中做。
    • 考虑下单的过程可能是一个系统开销较大的过程,可以将下单的请求放到队列中维护,Order Service 会异步处理。这些异步处理的过程,对于一致性要求高的部分,可以使用单独的锁服务来保证。

这是《常见分布式系统设计图解》系列文章中的一篇,如果你感兴趣,请参阅汇总(目录)寻找你其它感兴趣的内容。

文章未经特殊标明皆为本人原创,未经许可不得用于任何商业用途,转载请保持完整性并注明来源链接 《四火的唠叨》

×Scan to share with WeChat

你可能也喜欢看:

  1. 常见分布式应用系统设计图解(一):即时消息系统
  2. 常见分布式应用系统设计图解(八):文件同步分享系统
  3. 常见分布式应用系统设计图解(九):协同编辑系统
  4. 常见分布式应用系统设计图解(十四):日志系统
  5. 常见分布式应用系统设计图解(五):Proximity 系统

5 thoughts on “常见分布式应用系统设计图解(十):电商秒杀系统”

  1. Anonymous says:
    09/09/2022 at 7:48 AM

    不是先生成订单再支付么

    Reply
  2. dakuankuan says:
    06/25/2022 at 7:46 AM

    文中的 CDN 是指某种边缘计算能力吗?

    Reply
    1. 四火 says:
      07/03/2022 at 11:02 AM

      content delivery network

      Reply
  3. Jeffrey4l says:
    11/17/2020 at 8:20 PM

    求问:图是用啥软件画的?

    Reply
    1. 四火 says:
      11/17/2020 at 10:19 PM

      Balsamiq

      Reply

Leave a Reply to Anonymous Cancel reply

Your email address will not be published. Required fields are marked *

订阅·联系

四火,啰嗦的程序员一枚,现居西雅图

Amazon Google Groovy Hadoop Haskell Java JavaScript LeetCode Oracle Python Spark 互联网 前端 华为 历史 同步 团队 图解笔记 基础设施 工作 工作流 工具 工程师 应用系统 异步 微博 思考 技术 数据库 曼联 测试 生活 程序员 管理 系统设计 缓存 编码 编程范型 英语 西雅图 设计 评审 问题 面试 项目

分类

  • Algorithm and Data Structure (30)
  • Concurrency and Asynchronization (6)
  • System Architecture and Design (43)
  • Distributed System (18)
  • Tools Frameworks and Libs (13)
  • Storage and Data Access (8)
  • Front-end Development (33)
  • Programming Languages and Paradigms (55)
  • Testing and Quality Assurance (4)
  • Network and Communication (6)
  • Authentication and Authorization (6)
  • Automation and Operation Excellence (13)
  • Big Data and Machine Learning (5)
  • Product Design (7)
  • Hiring and Interviews (14)
  • Project and Team Management (14)
  • Engineering Culture (17)
  • Critical Thinking (25)
  • Career Growth (57)
  • Life Experience and Thoughts (45)

推荐文章

  • 谈谈分布式锁
  • 常见分布式系统设计图解(汇总)
  • 系统设计中的快速估算技巧
  • 从链表存在环的问题说起
  • 技术面试中,什么样的问题才是好问题?
  • 从物理时钟到逻辑时钟
  • 近期面试观摩的一些思考
  • RSA 背后的算法
  • 谈谈 Ops(汇总 + 最终篇):工具和实践
  • 不要让业务牵着鼻子走
  • 倔强的程序员
  • 谈谈微信的信息流
  • 评审的艺术——谈谈现实中的代码评审
  • Blog 安全问题小记
  • 求第 K 个数的问题
  • 一些前端框架的比较(下)——Ember.js 和 React
  • 一些前端框架的比较(上)——GWT、AngularJS 和 Backbone.js
  • 工作流系统的设计
  • Spark 的性能调优
  • “残酷” 的事实
  • 七年工作,几个故事
  • 从 Java 和 JavaScript 来学习 Haskell 和 Groovy(汇总)
  • 一道随机数题目的求解
  • 层次
  • Dynamo 的实现技术和去中心化
  • 也谈谈全栈工程师
  • 多重继承的演变
  • 编程范型:工具的选择
  • GWT 初体验
  • java.util.concurrent 并发包诸类概览
  • 从 DCL 的对象安全发布谈起
  • 不同团队的困惑
  • 不适合 Hadoop 解决的问题
  • 留心那些潜在的系统设计问题
  • 再谈大楼扔鸡蛋的问题
  • 几种华丽无比的开发方式
  • 我眼中的工程师文化
  • 观点的碰撞
  • 谈谈盗版软件问题
  • 对几个软件开发传统观点的质疑和反驳
  • MVC 框架的映射和解耦
  • 编程的未来
  • DAO 的演进
  • 致那些自嘲码农的苦逼程序员
  • Java 多线程发展简史
  • 珍爱生命,远离微博
  • 网站性能优化的三重境界
  • OSCache 框架源码解析
  • “ 你不适合做程序员”
  • 画圆画方的故事

近期评论

  • + 1.943624 BTC.NEXT - https://graph.org/Ticket--58146-05-02?hs=9a9c6f8dfe3cdbe0074006e3e640b19b& on 所有文章
  • Anonymous on 闲聊投资:亲自体验和护城河
  • 四火 on 关于近期求职的近况和思考
  • YC on 关于近期求职的近况和思考
  • mafulong on 常见分布式基础设施系统设计图解(四):分布式工作流系统
  • 四火 on 常见分布式基础设施系统设计图解(八):分布式键值存储系统
  • Anonymous on 我裸辞了
  • https://umlcn.com on 资源链接
  • Anonymous on 我裸辞了
  • Dylan on 我裸辞了
© 2025 四火的唠叨 | Powered by Minimalist Blog WordPress Theme