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

05 | 影响性能的因素有哪些?又该如何提高系统的性能?

许令波 2018-10-05
不知不觉,我们已经讲到第五篇了,不知道听到这里,你对于秒杀系统的构建有没有形成一些框架性的认识,这里我再带你简单回忆下前面的主线。
前面的四篇文章里,我介绍的内容多少都和优化有关:第一篇介绍了一些指导原则;第二篇和第三篇从动静分离和热点数据两个维度,介绍了如何有针对性地对数据进行区分和优化处理;第四篇介绍了在保证实现基本业务功能的前提下,尽量减少和过滤一些无效请求的思路。
这几篇文章既是在讲根据指导原则实现的具体案例,也是在讲如何实现能够让整个系统更“快”。我想说的是,优化本身有很多手段,也是一个复杂的系统工程。今天,我就来结合秒杀这一场景,重点给你介绍下服务端的一些优化技巧。

影响性能的因素

你想要提升性能,首先肯定要知道哪些因素对于系统性能的影响最大,然后再针对这些具体的因素想办法做优化,是不是这个逻辑?
那么,哪些因素对性能有影响呢?在回答这个问题之前,我们先定义一下“性能”,服务设备不同对性能的定义也是不一样的,例如 CPU 主要看主频、磁盘主要看 IOPS(Input/Output Operations Per Second,即每秒进行读写操作的次数)。
而今天我们讨论的主要是系统服务端性能,一般用 QPS(Query Per Second,每秒请求数)来衡量,还有一个影响和 QPS 也息息相关,那就是响应时间(Response Time,RT),它可以理解为服务器处理响应的耗时。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《如何设计一个秒杀系统》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(27)

  • 公号-代码荣耀
    除了本文提供的方式外,还可从考虑从以下方面进行调整:
    1 提升硬件条件:CPU核数、主频、内存、磁盘I/O、SSD、网卡等
    2 JVM性能调优
    3 缓存

    作者回复: 👍

    2018-10-05
    13
  • godtrue
    很棒,如醍醐灌顶!

    性能优化的核心就一个字-减

    如果还继续减的
    1:异步化-减少等待响应的时间
    2:降日志-减本地磁盘的交互
    3:多级缓存-再减少获取数据路径
    4:减功能-非核心功能或后补功能去掉

    作者回复: 👍

    2018-11-13
    8
  • 饭粒
    自己道行浅,看这有点泛啊..

    作者回复: 还是要自己去实践:)

    2018-12-17
    4
  • speedfirst
    能否再具体解释下“合并部署”如何避免序列化的?我的理解是不管在不在一个tomcat都要走一次http,所以总要序列化。tomcat提供某种机制可以跨进程非序列化通信?

    作者回复: 这个里面实现比较复杂,几句话很难讲清楚,《架构演进与性能优化》有专门一章介绍了实现方案

    2018-10-07
    4
  • Sven
    我也刚发现原来大神是java技术内幕作者本尊>o<
    2018-12-22
    3
  • One day
    想问下有dubbo相关的书籍推荐一下吗?在网上没找到。。。

    作者回复: Dubbo专门的书籍我也没看到过,不过可以去看看他的官方文档,再结合他的源码,相信你能够搞明白😉

    2018-11-01
    2
  • Schelor
    许老师行文流畅,文章有层次。
    部分文字如统一接入层,Tair等还是可以看出,阿里技术还是渗透很深的。

    作者回复: 😉

    2018-10-05
    2
  • 跃然
    通过减少序列化提高性能,合并部署时为什么不能走本机的socket呢
    2019-09-27
    1
  • 张祎
    一个办法就是看当 QPS 达到极限时,你的服务器的 CPU 使用率是不是超过了 95%,如果没有超过,那么表示 CPU 还有提升的空间,要么是有锁限制,要么是有过多的本地 I/O 等待发生。

    如果cpu使用率不到95%,说明此时cpu不是瓶颈?因为我理解如果cpu是瓶颈,需要优化的话,应该是cpu先到达了阈值而其他的诸如iops ,带宽使用没有到达阈值,希望老师能够指点一下
    2019-07-09
    1
  • ailei
    这个老师比讲linux的刘老师响应留言多,超赞👍
    2019-03-31
    1
  • linx
    千兆带宽下 10KB 数据的极限 QPS 为 1.25 万 QPS=1000Mbps/8/10KB
    不太明白这个8 是指什么呢?

    作者回复: 大B和小b的区别

    2019-02-18
    1
  • Hana
    拜读过您的 《深入分析 Java Web 技术内幕》 这一本书,讲解非常通俗易懂,也不失深度,今天才反应过来作者跟您是同一个人🤥

    作者回复: 😉

    2018-10-23
    1
  • 看不到de颜色
    看完这章内容有一点跟之前了解到不一致的地方。就是通常设置线程数大小会根据任务类型进行区分。通常会划分为IO密集型和CPU密集型。印象中CPU密集型的任务通常线程数建议就是 CPU核心数+1。那么老师在文中提到的 2*CPU核心数+1指的是IO密集型任务的通常线程数设置嘛?
    看完这章内容还有一个感受就是设置JSF(类似于Dubbo的一个RPC框架)线程池大小时是否也可以先从接口的QPS入手。之前都是凭感觉设置,线上出问题了再扩大😂

    作者回复: 关于线程数的设定我给出的是一个经验公式,不是所有的线程池都要根据这个设置,那肯定也不合理,例如,一个Java系统里可能都很多线程池,如果每个线程池都设置这个值,那会有很多的线程。

    我说的这个设置,其实主要是想把最重要处理用户请求的线程池设置这个数,或者是系统中最核心的处理用户请求的线程池建议按照这个来设置,另外像Dubbo中的线程池的数量还要根据每个请求的rt以及并发数来综合考量,例如如果每个请求的rt比较长,那么并发数一多的话,很容易就满了,这时你为了提升并发请求数,肯定要多设置一些线程数,否则很容易请求失败。当然你也可以增加机器来解决,总之你还是要有个平衡。

    2018-10-15
    1
  • 吴浩
    读的场景可以允许一定的脏数据,导致少量原本无库存的下单请求被误以为有库存,可以在写数据的时候再保证最终一致性



    想问下,这里在写的时候保证是该如何保证了?库存量大于1么?

    作者回复: 嗯,写的一致性主要是通过数据库来保证

    2018-10-08
    1
  • SpoutAndBolt
    如果让前端无效请求数降低 能否可以使用Nginx的配置 limit_connect来控制

    作者回复: 可以到是可以,就是比答题的方式更暴力一点,呵呵

    2018-10-06
    1
  • 黄金的太阳
    老师,总QPS那个公式不是很理解,请问是如何推导出来的?1000ms指的是1000毫秒的意思?
    正常的公式不应该是QPS=总请求数/(线程数*响应时间)嘛?

    作者回复: 是1000毫秒

    单线程是1000毫秒/每个请求的rt
    所以多线程就近似等于单线程的qps乘以线程数了

    2018-10-06
    1
  • wuhulala
    有个疑问:比如dubbo默认线程池大小是200 这个线程配置 其实在我们的机器往往是8c的 并且是计算密集型 那么就过于大了吧 默认配置这么大是因为大部分机器都是64c+么?

    作者回复: Dubbo的线程池的大小还要看看你的远程调用的rt是多少,如果rt比较长,那线程数就要多一点,不然你的系统连接很容易就满了,就拒绝服务了。

    2018-10-05
    1
  • 李瑞
    请问老师,线程CPU时间及线程等待时间如何计算呢?
    2019-12-04
  • yang11111
    老师 一台机器一般qps能到多少 很想知道
    2019-11-01
  • 美美
    缓存秒级别的被动更新---是不是会出现秒杀在几秒钟都结束了,缓存还没更新?
    2019-10-17
收起评论
27
返回
顶部