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

04 | 流量削峰这事应该怎么做?

许令波 2018-10-04
如果你看过秒杀系统的流量监控图的话,你会发现它是一条直线,就在秒杀开始那一秒是一条很直很直的线,这是因为秒杀请求在时间上高度集中于某一特定的时间点。这样一来,就会导致一个特别高的流量峰值,它对资源的消耗是瞬时的。
但是对秒杀这个场景来说,最终能够抢到商品的人数是固定的,也就是说 100 人和 10000 人发起请求的结果都是一样的,并发度越高,无效请求也越多。
但是从业务上来说,秒杀活动是希望更多的人来参与的,也就是开始之前希望有更多的人来刷页面,但是真正开始下单时,秒杀请求并不是越多越好。因此我们可以设计一些规则,让并发的请求更多地延缓,而且我们甚至可以过滤掉一些无效请求。

为什么要削峰

为什么要削峰呢?或者说峰值会带来哪些坏处?
我们知道服务器的处理资源是恒定的,你用或者不用它的处理能力都是一样的,所以出现峰值的话,很容易导致忙到处理不过来,闲的时候却又没有什么要处理。但是由于要保证服务质量,我们的很多处理资源只能按照忙的时候来预估,而这会导致资源的一个浪费。
这就好比因为存在早高峰和晚高峰的问题,所以有了错峰限行的解决方案。削峰的存在,一是可以让服务端处理变得更加平稳,二是可以节省服务器的资源成本。针对秒杀这一场景,削峰从本质上来说就是更多地延缓用户请求的发出,以便减少和过滤掉一些无效请求,它遵从“请求数要尽量少”的原则。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《如何设计一个秒杀系统》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(43)

  • 胡镇华
    用消息队列实现的话,处理结果无法立即知晓,用户体验不真实,有没有更实时的方案?

    作者回复: 就是实时处理,每个请求过来实时处理,先过来先处理

    2018-10-04
    1
    33
  • 烛火下的乌托邦
    MD5说成加密又怎么样?本来MD5的存在不就是为了加密吗?至于原理大家明白就可以了,真的是。。。
    2018-12-26
    30
  • wj
    纠正一下,作为P8把Md5理解为加密算法,太不应该了,这个仅仅是单向散列,不可逆..

    作者回复: 呵呵,感谢指正

    2018-10-06
    3
    24
  • 無忘
    很无奈,关键的下单通过消息队列接收,但是如何及时将用户是否抢成功的结果反馈给前端用户,这个没有说明!

    用户是下单成功页面停留?间隔刷新去获取最后的抢购结果吗?还是说单独给个页面让用户查询自己是否抢购成功!

    其实不少人问得是这个问题!

    消息队列只能返回给你消息是否投递成功,不能告诉你抢购是否成功!😪

    反而令牌桶的方式比较靠谱,预先生成一定数量令牌,取到令牌放入队列,返回抢购成功!不做后续处理,及时返回!
    2019-05-19
    2
    10
  • Lost In The Echo。
    请求入队列后怎么给用户“交代”?

    作者回复: 参考一下nero的回答哈

    2018-10-04
    9
  • Ballontt
    可不可以前端直接按照1%的概率去请求后台接口。请数量一下就下降了100倍

    作者回复: 光从减少请求的角度可以,但是体验会很差😃

    2018-10-04
    8
  • 看不到de颜色
    看完本篇文章,有几点疑问还想请老师解答一下。
    1.使用消息队列削峰的话,可以知道消息是否被消费,但是是否真的秒杀成功该如何向用户返回。
    2.看到老师提到削峰的方式,之前有看过到诸如令牌桶,漏桶之类的算法。是否也可以在此引入呢?
    3.如果并发请求过大的话是否可以在每个服务上加入信号量来控制,数量为库存大小。每当处理一个请求就减一下,归零不再向下处理呢。

    作者回复: 大家对请求队列这块问的比较多,疑问也多,后面相关的问题我找个时间统一回答一下吧。

    2018-10-15
    7
  • Nero
    请问徐老师,当请求被丢进消息队列以后,是就直接返回给用户吗? 那用户怎么知道请求是否成功了呢?

    作者回复: 如果是同步的就要等待消息被正确投递后才返回结果,但大部分就是异步的,寄发送后即返回,然后由消息队列保证最后最终被投递,这个要由消息队列自己来承诺sla

    2018-10-08
    7
  • 食指可爱多
    下单请求进消息队列,RocketMQ的topic个数或kafka的partition个数为消费端并发度,那么topic的个数怎么设置。看到一种说法是每个商品id对应一个topic。嗯,理论上完美了,每个商品一个队列,但是这些topic工程实践里又是如何管理的呢?

    作者回复: 你说的topic工程实践是指太多不好管理吗?

    每个商品一个topic的确太多,而且topic太多下游也不好订阅,topic不应该太多,不应该通过人为分散topic来提升性能,这样会增加维护成本,增加的成本可能比省的几台硬件成本更高,所以应该优化MQ软件本身入手

    2018-10-12
    4
  • Geek_c991e0
    大神问下,如果秒杀库存总数是10,那削峰队列大小就是10吗,如果有后面不买了,但是已经入了队列了,怎么办。还是说队列放所有请求,这样的话是不是浪费啊

    作者回复: 入了队列不处理就超时了,队列的大小不应该和秒杀商品数关联

    2018-11-05
    3
  • GrubbyLu
    徐老师看了其他同学的留言以及您的回复之后,还是有一点不能理解。就是用消息队列进行解耦之后,如何把消息队列处理秒杀请求的结果反馈给用户,有什么好的通知方式嘛?(看到有一个同学留言说用长链接异步推送结果,您说用户体验偏差,麻烦能介绍一些好的方式嘛)

    作者回复: 大家对请求队列这块问的比较多,后面相关的问题我找个时间统一、详细回答一下吧

    2018-10-14
    3
  • 大老杨
    这种答题的是不是对于秒杀场景用户体验不是很好

    作者回复: 答题是有两种效果
    一是可以防止一些秒杀器
    二是可以延长一部分答题时间
    是不是影响体验,我觉得体验和上面两条相比应该要做些妥协

    2018-10-04
    3
  • 五年
    零点大促开始了...发放优惠券怎么操作呢....我这个时候已经在指定商品这里等着了....

    作者回复: 这个地方发放优惠券这个是一个营销策略,主要是为了分散流量,例如在活动页面可以通过弹窗的方式,把一部分用户吸引到一个新的业务,让用户玩个游戏,通关了就发放一个优惠券。这个方式当然是吸引那种还没有明确下单目标的用户,如果你已经有了目标商品了,就等着时间一到来下单了,那么优惠券对你也没有吸引力,其实优惠券也不是要吸引所有的用户,那样也起不到分流的目的了

    2018-10-11
    2
  • Lee
    有两个小问题请教一下:
    生产者将用户请求放入队列后,用户的请求就结束了,但是消费者还未处理,这时生产者给用户返回什么呢?
    队列的消费者处理完用户的请求后,怎么返回结果给用户呢?

    作者回复: 参考下我给nero的回答哈

    2018-10-10
    2
  • 落雪飞花
    增加答题之后,答题系统应该也有性能瓶颈,是提前预热还是怎么处理?

    作者回复: 可以提前预热

    2018-10-05
    2
  • 潘政宇
    队列被打满了,直接丢包吗?

    作者回复: 有多种处理方式,一种是丢弃
    还有可以把队列序列化到文件,然后再慢慢消化

    2018-10-04
    2
  • LionHeart
    有个奇怪的想法,比如10万个人12:00秒杀10个商品,系统在12:00前在10万个人中挑选10个用户id放缓存,真正秒杀时直接判断用户id在不在缓存中,在缓存就进入后面的逻辑,最差的情况就是缓存中的10个用户最终没有来秒杀,那再走正常的秒杀逻辑

    作者回复: 😂

    2019-05-17
    1
    1
  • 王宝
    我来晚了,老师还在吗?给老师点个赞!

    作者回复: 感谢

    2019-03-17
    1
  • func
    许大神你好,请求入队列后怎么给用户 反馈结果?

    作者回复: 你可以了解一下rocketmq是怎么做的😃

    2018-10-08
    1
  • 小喵喵
    1.分层过滤,既然是请求,为什么有些是无效呢?
    2.将动态请求的读数据缓存(Cache)在 Web 端,过滤无效的数据读。这个cache是动态的呀,是不是经常需要更新cache呢?能举例一下,到底什么样子的动态数据缓存(Cache)在 Web 端??
    3.限流保护具体怎么做?谢谢。

    作者回复: 1.无效请求是针对没发再抢到商品的人来说的
    2.例如库存数据
    3.限流保护回来最后一章有介绍

    2018-10-06
    1
收起评论
43
返回
顶部