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

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

发现动态热点数据
发现静态热点数据
隔离
限制
优化
发现动态热点数据
发现静态热点数据
动态热点数据
静态热点数据
处理热点数据
发现热点数据
什么是“热点”
为什么要关注热点
总结
处理热点数据
发现热点数据
热点数据
热点操作
热点对系统的影响
热点数据处理

该思维导图由 AI 生成,仅供参考

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

为什么要关注热点

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

什么是“热点”

热点分为热点操作热点数据。所谓“热点操作”,例如大量的刷新页面、大量的添加购物车、双十一零点大量的下单等都属于此类操作。对系统来说,这些操作可以抽象为“读请求”和“写请求”,这两种热点请求的处理方式大相径庭,读请求的优化空间要大一些,而写请求的瓶颈一般都在存储层,优化的思路就是根据 CAP 理论做平衡,这个内容我在“减库存”一文再详细介绍。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了处理系统中的热点数据的方法和思路。针对热点数据的优化、限制和隔离提出了具体的解决方案,包括缓存热点数据、一致性Hash限制、业务、系统和数据层面的隔离等。文章还介绍了如何发现热点数据,包括人工标识、大数据统计计算和实时热点发现方案。通过对热点数据的处理和隔离,可以有效优化系统性能,减少请求量和路径,对高性能分布式系统具有重要价值。整体而言,本文内容丰富,涉及技术实现和系统优化,对处理系统中的热点数据具有一定的指导意义。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《如何设计一个秒杀系统》
立即购买
登录 后留言

全部留言(44)

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

    作者回复: 😏

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

    作者回复: 微博我没做过,但是我觉得大体思路应该是通用的 微博的内容基本是静态数据,发了就不能修改,所以cache应该没问题,而微博的热点比较明显,所以发现热点和对热点数据进行针对性的优化比较重要 至于要怎么进行优化还要看看微博的数据结构是怎么设计的,微博内容和评论的关系已经发微博的人和关注的人关系等

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

    作者回复: 😉

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

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

    2018-10-04
    3
    8
  • 诗泽
    但是,缓存热点数据更多的是“临时”缓存,即不管是静态数据还是动态数据,都用一个队列短暂地缓存数秒钟,由于队列长度有限,可以采用 LRU 淘汰算法替换。 为什么选择用队列来缓存数据呢,队列如何做到快速读取缓存数据的呢?

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

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

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

    2018-11-05
    4
  • Mr.钧👻
    虽然这个热点可能只占请求总量的亿分之一,但是可能占用服务器90%的资源 这句话是什么意思呢?可以详细解释一下吗?

    作者回复: 亿分之一是指热点商品指占商品用量的比例很小 占用服务器资源是指一台服务器秒杀商品的qps占了大部分请求比例

    2018-10-03
    4
  • 这节的重点感觉是加深对二八原理的认识,这个原理不知为何好像具有普适的感觉,各个领域都有它的用武之地。

    作者回复: 😉

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

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

    2018-10-28
    2
    3
  • 热点数据-我们之前做过一个系统也用到热点数据,我们的思路比较简单,对于仓库生产,仓库的范围是有限的,具体到仓,从业务的角度出发北上广的仓库基本属于比较热的数据,于是就有了定时和手动往缓存中刷新热点数据的处理方式了。

    作者回复: 虽然土点,但是有效😉

    2018-11-13
    1
收起评论
显示
设置
留言
44
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部