写点什么

1 号店 11.11:秒杀排队系统设计理念

2015 年 11 月 11 日

1、秒杀的场景

电商中为了吸引顾客、聚集人气,经常会策划一些秒杀活动。活动中售卖的商品,要么价格远低于市场价格,要么比较稀缺(如一些新发布的商品)。这些商品电商一般都会限量、限时销售。无疑这些商品对消费者的诱惑力是巨大的,消费者蜂拥而来,往往几秒钟就可以将商品抢购一空。而对于电商系统来说可能更多的是考验。

2、传统秒杀系统的痛点

首先,秒杀的场景决定了秒杀是一场速度的比拼,也就是俗话说的“手快有、手慢无”。大家都争着在活动开始后,第一时间将商品抢到,完成下单。因此秒杀活动开始的一瞬间会有大量的流量涌入,几倍、甚至于十几倍的流量对系统的冲击不可谓不大。如果系统没有足够的 capacity 或应对措施,很可能就被瞬时高流量给压垮了。

其次,突如其来的高流量,给系统各个模块都来了一连串的压力,系统可能会因此变慢,而且可能会彼此影响,影响可用性。比如:数据库更新同一个商品库存,需对同一行记录加锁,随着并发的压力逐渐增大,数据库更新的性能是逐渐下降的。从而引起提供库存 service 的应用服务性能下降,连锁的影响到下单 service 的性能,最终反馈到消费者的可能就是整个网站购物流程性能差、响应慢。而面对响应慢的系统,很多消费者可能采取反复刷新,多次尝试,这无疑又增大了对系统的压力。

还有,上述种种给消费者带来的往往是体验上的痛苦。如:网站响应慢,点击抢购按钮没反应。好不容易可以操作了,却发现秒杀活动已经结束,消费者的参与感比较差。久而久之,可能就对此类活动失去了兴趣。

3、1 号店秒杀系统的设计理念

基于以上秒杀场景下的痛点,1 号店的秒杀排队系统在设计时主要考虑以下几点:

  1. 限流:当秒杀活动开始后,只有少部分消费者能抢购到秒杀商品,意味着其实大部分用户的流量传达到后台服务后都是无效。如果能引导这大部分的流量,不让这大部分的流量传达到后台服务,其实对我们系统的压力就很小了。因此设计思路之一就是,仅让能成功抢购到商品的流量(可以有一定余量)进入我们的系统。
  2. 削峰:进入系统的有效流量虽然总量不一定是很大的,但却是在很短的时间内涌入的,因此会存在很高的瞬时流量峰值。总量相同的流量在 1 秒钟进入系统,和在 10 分钟均匀地进入系统,对系统的冲击是相差很大的。高峰值的流量往往能将系统压垮。因此另一个设计思路是,如何将进入系统的瞬时高流量拉平,使得系统可以在自己处理能力范围内,将所有抢购的请求处理完毕。
  3. 异步处理:传统的系统对于请求是同步处理的,即收到请求后立即处理并把结果返回给用户。我们的系统有了削峰的设计后,请求不是被立刻处理的,因此就要求我们能将同步的服务改造成异步的。
  4. 可用性:我们设计时始终把系统的可用性放在重要的位置,针对系统可能出现的各种状况,都尽最大程度地保证高可用。
  5. 用户体验:系统设计一定要充分考虑用户体验。消费者点击抢购按钮后,无论是否能抢到商品,期望是能得到及时的反馈。系统上发生任何故障也要尽可能的保证用户体验的损害减到最小。

4、系统架构简介

现在来简单介绍下我们秒杀排队系统的架构,从大的方面来说分为三个主要模块:

  1. 排队模块:负责接收用户的抢购请求,将请求以先入先出的方式保存下来。每一个参加秒杀活动的商品保存一个队列,队列的大小可以根据参与秒杀的商品数量(或加点余量)自行定义。排队模块还负责提供一系列接口,如:给已进入队列的用户查询下单状态的接口,给调度模块拉取请求的接口,服务模块回写业务处理状态的接口等。
  2. 调度模块:负责排队模块到服务模块的动态调度,不断检查服务模块,一旦处理能力有空闲,就从排队队列头上把用户访问请求调入服务模块。并负责向服务模块分发请求。这里调度模块扮演一个中介的角色,但不只是传递请求而已。它还担负着调节系统处理能力的重任。我们可以根据服务模块的实际处理能力,动态调节向排队系统拉取请求的速度。作用有点类似水坝的闸门,当下游干旱时就打开闸门多放些水,当下游洪涝时,就放下闸门少放些水。
  3. 服务模块:是负责调用真正业务处理服务,并返回处理结果,并调用排队模块的接口回写业务处理结果。我们设计这个模块,是为了和后面真正的业务处理服务解耦。目前我们的系统不只支持秒杀抢购这种业务场景,后续有其他适用于排队系统的业务都可以接入,如:领取抵用券等等。同时我们也可以针对后面业务系统的处理能力,动态调节服务模块调用后面业务处理服务的速度。

5、容错处理

任何系统都不可能一帆风顺,但我们要能在出现错误时仍旧保证系统的高用性和良好的客户体验。举几个简单的例子,比如服务模块调用后面服务时,出现调用服务超时怎么办?对此我们设计了对于超时的请求,可以重试的机制。再比如,如果后面真正的业务处理系统宕机怎么办?如果是传统系统的话,可能就面临系统无法使用的尴尬。而我们的系统已经是异步的了,因此加入排队队列的用户请求,在业务处理系统恢复后都可以得到处理。只要我们在前端给用户以友好的交互、提示,系统还是能提供一定质量服务的。

6、用户交互

因为我们的系统设计成异步的,因此消费者不再是像以前一样同步地去等待反馈。消费者需要一个途径来获取抢购的状态和进度。我们的主体流程大体上分为几个阶段:

  • 当等待人数大于 500 人,页面提示:排在您前面的人超过 500 位;
  • 当等待人数小于等于 500 人,页面提示:您已挤进第 *** 位;
  • 当等待时间大于等于 1 分钟,页面提示:剩余时间约 * 分钟。每次以分钟倒计时。
  • 当等待时间小于 1 分钟,页面提示:预计剩余 * 秒。
  • 抢购成功,后续跳转到订单支付页面

下面仅挑选 2 个 PC 端页面交互的设计供大家参考,

当然我们还提供了一些分支流程的提示与处理,如果大家感兴趣,更详细的情况可以到 1 号店亲自参与秒杀活动来体验。

7、总结

目前我们的秒杀排队系统已经应用于 1 号店的历次大促,并取得了良好的效果,受到业务运营和消费者一致的好评。优秀的系统一定是建立在对业务透彻理解的基础上,针对业务的场景与痛点,结合现有的技术有针对性的提供解决方案。同时技术上成功的系统,往往也推动着业务的发展,给业务更好的支撑和推动。


感谢郭蕾对本文的策划和审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们,并与我们的编辑和其他读者朋友交流(欢迎加入 InfoQ 读者交流群)。

2015 年 11 月 11 日 17:1220695

评论

发布
暂无评论
发现更多内容

穷人也能建个人博客了——阿里云函数计算体验

KAMI

阿里云 云服务 Faas WordPress

Python 中 \x00 和空字符串的区别,以及在 Django 中的坑

AlwaysBeta

Python django 编程

第十二周.命题作业

刘璐

自己实现一个简单的 DevOps 工具系列(后端篇)- 1

sinsy

Shell CI/CD

开篇:开机界面设置欢迎语显示IP地址

昌安古城

Linux __init__

小白读了这篇JVM,直呼真香!(长篇干货预警)

Java架构师迁哥

架构师第1课作业及学习总结

小诗

第十一周.总结

刘璐

第十三周.命题作业

刘璐

加强顶层设计 推动数字出版高质量发展

CECBC区块链专委会

区块链 数字经济 数字出版

甲方日常 19

句子

工作 随笔杂谈 日常

闪送,为何能从顺丰中杀出一条血路?

云流

学习 编程 架构师

掌握这21个Java的核心技术点,涨薪5K起步,告别上班复制粘贴!!

Java架构师迁哥

Spring 5 中文解析数据存储篇-@Transactional使用

青年IT男

spring

简述JVM垃圾回收

叶鹏

深耕边缘计算 揭秘阿里云边缘云网一体化的技术实践

阿里云Edge Plus

5G 边缘计算 视频

英特尔、阿里巴巴全方位深化技术创新 共同引领数智未来

intel001

2020年“有史以来”全网最全1309道BAT大厂java面试题(附答案分享)

云流

数据库 程序员 java面试 Java 分布式

高并发优雅的做限流

架构师修行之路

限流算法 高并发优化

虚拟币交易所搭建,数字货币永续合约平台搭建

13823153121

360视觉入局人脸识别:终结行业“裸奔”,“安全”是终极法则

脑极体

阿里面试,让我说说ThreadLocal,我一口气说了四种

java金融

Java 多线程 ThreadLocal

HashMap的7种循环姿势你都掌握了吗?

java金融

hashmap 循环效率 JDK1.8

The Way To Go --- 切片

书旅

go slice

拥抱K8S系列-08-命令行工具管理K8S集群1

张无忌

Kubernetes 运维 kubectl

社区活动 | Apache Flink Meetup·深圳站,锁定 Flink 最佳实践

Apache Flink

flink

flutter app 打开微信小程序探究

Daniel

苹果A系列芯片的三年AI进化:为何要大规模升级AI算力?

脑极体

亚马逊宣布20亿美元“气候宣言基金”首批投资企业名单

爱极客侠

坚持新媒体写作第21天了,聊聊我为什么喜欢写作

老胡爱分享

学习 写作 习惯养成 坚持 随笔杂谈 讨论写作

【性能优化】面试官:Java中的对象都是在堆上分配的吗?

冰河

面试 性能优化 JVM 性能调优 逃逸分析

1号店11.11:秒杀排队系统设计理念-InfoQ