如何设计一个秒杀系统
许令波
前阿里巴巴高级技术专家
立即订阅
23218 人已学习
课程目录
已完结 9 讲
开篇词 | 秒杀系统架构设计都有哪些关键点?
免费
01 | 设计秒杀系统时应该注意的5个架构原则
02 | 如何才能做好动静分离?有哪些方案可选?
03 | 二八原则:有针对性地处理好系统的“热点数据”
04 | 流量削峰这事应该怎么做?
05 | 影响性能的因素有哪些?又该如何提高系统的性能?
06 | 秒杀系统“减库存”设计的核心逻辑
07 | 准备Plan B:如何设计兜底方案?
08 | 答疑解惑:缓存失效的策略应该怎么定?
如何设计一个秒杀系统
登录|注册

03 | 二八原则:有针对性地处理好系统的“热点数据”

许令波 2018-10-03
假设你的系统中存储有几十亿上百亿的商品,而每天有千万级的商品被上亿的用户访问,那么肯定有一部分被大量用户访问的热卖商品,这就是我们常说的“热点商品”。
这些热点商品中最极端的例子就是秒杀商品,它们在很短时间内被大量用户执行访问、添加购物车、下单等操作,这些操作我们就称为“热点操作”。那么问题来了:这些热点对系统有啥影响,我们非要关注这些热点吗?

为什么要关注热点

我们一定要关注热点,因为热点会对系统产生一系列的影响。
首先,热点请求会大量占用服务器处理资源,虽然这个热点可能只占请求总量的亿分之一,然而却可能抢占 90% 的服务器资源,如果这个热点请求还是没有价值的无效请求,那么对系统资源来说完全是浪费。
其次,即使这些热点是有效的请求,我们也要识别出来做针对性的优化,从而用更低的代价来支撑这些热点请求。
既然热点对系统来说这么重要,那么热点到底包含哪些内容呢?

什么是“热点”

热点分为热点操作热点数据。所谓“热点操作”,例如大量的刷新页面、大量的添加购物车、双十一零点大量的下单等都属于此类操作。对系统来说,这些操作可以抽象为“读请求”和“写请求”,这两种热点请求的处理方式大相径庭,读请求的优化空间要大一些,而写请求的瓶颈一般都在存储层,优化的思路就是根据 CAP 理论做平衡,这个内容我在“减库存”一文再详细介绍。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《如何设计一个秒杀系统》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(28)

  • A星空之夜
    如果是微博的热点数据,应该怎么优化读操作呢

    作者回复: 微博我没做过,但是我觉得大体思路应该是通用的

    微博的内容基本是静态数据,发了就不能修改,所以cache应该没问题,而微博的热点比较明显,所以发现热点和对热点数据进行针对性的优化比较重要

    至于要怎么进行优化还要看看微博的数据结构是怎么设计的,微博内容和评论的关系已经发微博的人和关注的人关系等

    2018-10-03
    12
  • 放羊大王
    思路大概是通过日志和数据分析判断,某商品是热点,即将有大量请求到来。把商品请求移交给另外的秒杀系统,秒杀系统动静分离出html页面,和ajax请求。

    作者回复: 😏

    2018-10-04
    8
  • 爱我曲
    例如对被访问商品的 ID 做一致性 Hash,然后根据 Hash 做分桶,每个分桶设置一个处理队列,这样可以把热点商品限制在一个请求队列里
    -----------------------
    作者,您好,这个分桶设置处理队列是怎么实现的?可以讲下实现过程吗?

    作者回复: 例如对每个请求的商品id取模,让后根据取模的结果分别设置多个linkedhashmap,每个map当做一个队列

    2018-10-04
    6
  • 诗泽
    但是,缓存热点数据更多的是“临时”缓存,即不管是静态数据还是动态数据,都用一个队列短暂地缓存数秒钟,由于队列长度有限,可以采用 LRU 淘汰算法替换。

    为什么选择用队列来缓存数据呢,队列如何做到快速读取缓存数据的呢?

    作者回复: 不一定非要用队列,也可以用其他内存集合如hashmap都行
    缓存数据,一般静态数据可以提前加载到内存,如通过配置系统推送的方式。动态数据可以在远程调用时零时缓存在本机中。

    2018-10-08
    4
  • qingbusheng
    解决快速发现热点数据的另一个思路:1.在前端nginx 通过商品、下单、购物车URI 做数据镜像 2 通过nginx+lua+redis 根据不同的业务key 做计数,如果超过设定阈值则采用redis 发布订阅机制或消息中间件 通知下游Cache 模块缓存数据。感谢老师点评

    作者回复: 😉

    2018-11-10
    3
  • rango
    你好,想问一下通过异步采集日志的形式获取热点数据这方面的话,我想知道日志如何存储,是不是加一些特定字符串以便收集,采集的方法等技术,有没有思路或者推荐的文章等。

    作者回复: 日志收集和存储的技术现在都比较成熟了,有很多开源的组件,例如zabbix可以学习一下他是如何实现的

    2018-11-05
    2
  • 重案组之虎
    关于隔离层次的一个小问题:想了下数据隔离好像不太好实现吧?如果都是只读的,那么还好办一些,开一些只读实例专用就好,但是这样的场景肯定会有写请求,但是写的记录要和其他数据互通,最后不还得打到数据库集群里么?这好像和“启用单独的 MySQL”相悖了......请老师具体指教下,多谢!

    作者回复: 是不好做,隔离数据是按照一个纬度隔离的,例如隔离秒杀商品,是按照商品纬度,就是把一部分商品数据单独放到另外一个数据库,这样只要把一部分商品路由到新的隔离数据库就行了。

    2018-10-28
    1
    2
  • Mr.钧👻
    虽然这个热点可能只占请求总量的亿分之一,但是可能占用服务器90%的资源

    这句话是什么意思呢?可以详细解释一下吗?

    作者回复: 亿分之一是指热点商品指占商品用量的比例很小

    占用服务器资源是指一台服务器秒杀商品的qps占了大部分请求比例

    2018-10-03
    2
  • halo
    图1 热点发现系统: 中间件nginx cache rpc 为什么不是后台服务的一部分呢 ? 还是说中间件构成的异步监控系统用来日志记录?

    作者回复: 也可以把他当成后台系统的一部分,但是中间件本身就一直存在,并不是因为热点发现系统才加入的。

    中间件记录热点大部分是记录到日志里面的,但也不绝对

    2018-10-06
    1
  • 小喵喵
    发现动态热点中的第二点,建立一个热点上报。。
    怎么判断数据是不是热点呢?是一个具体的算法没有写出来吗?这个地方看了好几遍都看不明白,请指点。

    作者回复: 热点的统计可以很简单的对访问的商品进行访问计数,然后排序
    还有就是用通常的队列的淘汰算法如lru等都可以实现

    2018-10-03
    1
    1
  • iWill
    缓存数据,LRU淘汰算法,那么缓存的这些数据会不会频繁的移动、删除,并发比较大的时候会不会成为性能的瓶颈,想了解下。

    作者回复: 对秒杀这个场景,商品基本是固定的,基本都会一直在内存中

    2018-10-03
    1
  • 杨晓维
    请问老师,异步读取日志具体怎么实现?
    2019-07-17
  • 张祎
    热点请求会大量占用服务器处理资源,虽然这个热点可能只占请求总量的亿分之一,然而却可能抢占 90% 的服务器资源
    这个怎么理解,请求量少为什么还会大量占用资源呢?
    2019-07-07
  • Jefung
    分桶限制还是无法理解, 这么处理才能把热点请求和正常请求区分开
    2019-04-21
  • WL
    请问下老师缓存数据,LRU淘汰算法的实现可不可以用redis加一个过期时间,如果可以的话是否需要动态的判断过期时间,如果不可以的话是什么原因不可以?

    作者回复: 加过期时间也是一个好思路

    2019-04-20
  • 威猛小茂然
    写的挺好的

    作者回复: :)

    2019-03-18
  • 李白
    再来说说限制。限制更多的是一种保护机制,限制的办法也有很多,例如对被访问商品的 ID 做一致性 Hash,然后根据 Hash 做分桶,每个分桶设置一个处理队列,这样可以把热点商品限制在一个请求队列里,防止因某些热点商品占用太多的服务器资源,而使其他请求始终得不到服务器的处理资源。
    这个具体怎么操作呢?nginx可以处理吗?
    2019-02-28
  • 冉博哲(Free_Mason )
    DB 层,如何对热点数据进行优化呢?比如:a 表的某一行的库存,是热点更新?除了把数据拦在 DB 层之外的,进入 DB 层的热点更新请求,要如何给 DB 减压呢?想到给热点行的库存分成多个减压,当缺点太多,而且对于动态热点没用。其它方案都还有那几种?

    作者回复: 数据库层深层优化我不是专家,建议可以参考一下MySQL的优化书籍😁

    2019-02-27
  • williamcai
    热点发现系统,通过日志分析出热点数据,有没有判断标准说明该数据是热点,比如搜索次数达到多少,能不能给出具体的指标

    作者回复: 这个具体的指标要看情况,不一定就是多少次就判定是热点,也可能根据top多少来设置,到底设置多少合理,要根据其他一些因素来综合考虑,例如缓存这些热点的cache空间大小以及你对这些热点的处理方式(例如可能会限流)都会影响。

    2019-01-27
  • Andy_Claire
    你好, 看到你处理热点数据的思路, 其中限制和隔离让我有点混淆, 感觉区别不大. 你给出限制的做法是根据id做hash, 然后用单独的队列处理. 我理解这也是一种维度(请求)的隔离.

    作者回复: 从效果上来说,都是为了达到保护的作用。限制是防止你越界,而隔离是不让你越界 :)

    2019-01-21
收起评论
28
返回
顶部