如何设计一个秒杀系统
15
15
1.0x
00:00/00:00
登录|注册

01 | 设计秒杀系统时应该注意的5个架构原则

说起秒杀,我想你肯定不陌生,这两年,从双十一购物到春节抢红包,再到 12306 抢火车票,“秒杀”的场景处处可见。简单来说,秒杀就是在同一个时刻有大量的请求争抢购买同一个商品并完成交易的过程,用技术的行话来说就是大量的并发读和并发写。
不管是哪一门语言,并发都是程序员们最为头疼的部分。同样,对于一个软件而言也是这样,你可以很快增删改查做出一个秒杀系统,但是要让它支持高并发访问就没那么容易了。比如说,如何让系统面对百万级的请求流量不出故障?如何保证高并发情况下数据的一致性写?完全靠堆服务器来解决吗?这显然不是最好的解决方案。
在我看来,秒杀系统本质上就是一个满足大并发、高性能和高可用的分布式系统。今天,我们就来聊聊,如何在满足一个良好架构的分布式系统基础上,针对秒杀这种业务做到极致的性能改进。

架构原则:“4 要 1 不要”

如果你是一个架构师,你首先要勾勒出一个轮廓,想一想如何构建一个超大流量并发读写、高性能,以及高可用的系统,这其中有哪些要素需要考虑。我把这些要素总结为“4 要 1 不要”。
1. 数据要尽量少
所谓“数据要尽量少”,首先是指用户请求的数据能少就少。请求的数据包括上传给系统的数据和系统返回给用户的数据(通常就是网页)。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《如何设计一个秒杀系统》
立即购买
登录 后留言

全部留言(101)

  • 最新
  • 精选
  • 黄金的太阳
    希望老师可以分别从1W QPS,10W QPS ,100WQPS在架构升级前遇到的性能瓶颈做为讲解入口点,为什么这样设计之后就能解决问题的方式,为什么切分点是1万,10万和100万,瓶颈的分析方式等等,感觉效果更好,否则看到一堆架构,但并不清楚为什么要这样做还是很难平移到自己的系统设计中,一点拙见,希望老师能够解惑

    作者回复: 架构升级的逻辑要具体问题具体分析的 例如秒杀的场景来说,不同QPS量级下瓶颈也会不一样,10w级别可能瓶颈就在数据读取上,通过增加缓存一般就能解决,如果要到100w那么,可能服务端的网络可能都是瓶颈,所以要把大部分的静态数据放到cdn上甚至缓存在浏览器里 所以要做架构升级,还是主要要分析在预估的QPS下,整个系统的瓶颈会在什么地方,要针对这起瓶颈来重新设计架构方案

    3
    279
  • Mr.钧👻
    高并发系统的几大方向 1.请求数据尽量少,从而减少cpu消耗 2.访问路径尽量短,减少节点消耗 3.强依赖尽量少,减少加载时间 4.不要有单点,要有备份 5.减少额外请求,减少加载时间

    作者回复: 👍

    2
    84
  • 小喵喵
    1 .本地cache用什么实现好呢? 2. 通过什么方式往本地cache 写数据呢? 3. 秒杀系统的及时性非常高,把库存写进cache ,怎么及时更新呢?

    作者回复: 1.本地cache一般就是用内存实现,用java集合类型就行 2.用订阅的方式,在初始化时加载到内存 3.有两种方法,一是定时更新取3秒,二是,主动更新,数据库字段更新后发消息更新缓存,这个需要用到一个组件阿里叫metaq就是就是数据库字段更新会产生一条消息。另外cache里库存不需要100%和数据库一致,这个在后面的文章也有介绍

    3
    48
  • 酱了个油
    库存不会放在localcache,localcache只放静态数据。 库存是放在独立的缓存系统里,如redis,库存是采用主动失效的方式来失效缓存

    作者回复: 👍

    28
  • Edward
    数据缓存在机器内存中的话,集群内如何实现多台机器数据一致性?

    作者回复: 在内存的数据是静态数据,不会更新,没有一致性问题

    4
    26
  • 王永旺
    单点的概念是啥意思,不太明白

    作者回复: 单点就是没有备份,挂了系统没法正常服务了

    4
    17
  • MeazZa
    请问一下减库存的结果分别是如何更新到公共缓存和本地缓存的呢?

    作者回复: 缓存的更新一般都是没命中时再填充更新 没命中的原因一种是主动失效,一种是定时失效 公用缓存主动失效较多,本地缓存,定时失效更常用

    16
  • 王虹凯
    能不能给一些你认为的关键知识点在文章最后加一些对这些点的外链。这样可以更详细,当然更具系统性。 极客时间也可以考虑这样的一个功能,整个当前专栏共用这些链接。 当然,作者不加这些也没问题,只是觉得那样是不是更权威些。不过要求作者太多了!

    作者回复: 你想了解那块内容,我可以单独发给你😊

    14
  • 云飞
    老师你好,刚才说要设计时候尽量做到4要1不要,1不要就是不要用单点,也就是因为没有数据备份,想问这个单点和单点登录系统的单点有什么关系吗?希望老师有时间可以解答一下。

    作者回复: 这里的单点有两层含义 一是本身的系统是单点系统,比如你说的登录系统,所以其他系统需要验证登录状态时都需要调用他,那他就是一个单点,怎么解决?解决的办法就是尽量让这个系统简单,减少更改保持稳定。 另外一种是状态单点或者叫数据单点,也就是状态一旦丢失比较难恢复,这个就比较麻烦,比如保存登录状态的session保存在一台机器内存中,一旦这台机器挂掉,状态丢失就比较难恢复,这个单点就比较严重

    2
    12
  • 1024
    阅读5分钟,留言中回复看了半个多小时;感觉从读者讨论中收益更大,许神加油!

    作者回复: 😊

    11
收起评论
显示
设置
留言
99+
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部