作者 | 菜v菜

来源 | 架构师修行之路(ID:jiagoushixiuxing)

头图 |  CSDN 下载自东方IC

灵魂拷问

  • 秒杀这种大并发的写场景,直接分库分表开干?

  • 应对秒杀活动的流量高峰很难吗?

  • 不要拿淘宝级别的秒杀忽悠我

秒杀活动特点

我敢说凡是做过电商的同学,都会遇到运营展开的秒杀,限时购等“高并发”的活动。市面上也有不少针对秒杀的解决方案,什么分库分表,缓存,消息队列呀,但凡能想到的技术“靓点”都基本会写上一段。我觉得应对秒杀这样的带有流量峰值的业务,还是要仔细分析业务的特性,以及根据自己系统的业务量来确定需要采用哪些技术“靓点”,假如:一个日活10万的系统,采用了分库分表,缓存,消息队列,限流,降级等等技术手段,虽然功能上达到了预期,但是其实资源上可能会有些浪费,技术上也许只需要一个限流手段就足够了。说这些不是想表达什么,我只是想说,那些上来就分库分表等“大手笔”的“优化”手段一定要根据实际业务去考察是否需要实施。

言归正传,秒杀这种业务场景其实特点很明显:

  • 带有短期流量峰值特性,即:短时间内会有大量的请求涌入

  • 请求的数据带有热点性,即:大量的请求同一数据

  • 请求的成功有效率低,即:大量的请求中可能只有少量请求会成功处理业务

  • 请求的流量峰值发生在下单之前,即:付款阶段很少存在流量峰值

静态资源

静态资源是指商品的图片,视频,音频,html页面等几乎不会变化的资源,这些资源的处理方式和缓存类似,尽量放在离用户最近的地方,比如:浏览器的本地缓存,当缓存过期的时候,优先推荐从CDN中获取,CDN是应对静态资源访问高峰的最简单粗暴,也是最有效的解决方案,如果没有CDN怎么办?那最少要把请求这些静态资源的服务器和后台业务服务器物理上分离,避免因为静态资源而影响正常的业务。比如:很早之前,我就喜欢每个项目单独一个存放图片,css,js的网站,这个网站的优势是无状态,可以做到傻瓜式横向扩展。

至于静态资源的缓存更新,我想你可以百度一下会有很多答案。

业务让步

如果负责秒杀活动的产品经理是一个优秀的产品经理的话,就不会设计出:用户点击秒杀马上给予是否下单成功,这样的系统。熟悉分布式的同学肯定会想到,想保证这样的数据一致性,在可用性上必然会有所牺牲。尤其是秒杀这样的业务,我觉得可用性要比一致性优先级要高,所以几乎所有的秒杀系统都会采用BASE理论来设计系统,一致性上采用最终一致性。在用户看来,点击秒杀按钮之后会弹出一个等待的提示,在技术上我们称之为:异步处理。异步处理对于用户最明显的感知就是不会马上得到结果,而是要等待一段时间。其实这样的设计也是在技术和业务之间的一个权衡,算是业务作出的让步。

至于秒杀之前需要输入验证码或者某些题的答案等手段,其实也可以算是业务上作出的一些让步。为什么说是让步呢?对于用户来说,最理想的秒杀场景是:一点秒杀按钮,马上给予结果,但是技术上难度太大了,所以嘛,互相让一步,大家都好过,对不对?

技术第一招:限流

对于秒杀出现的流量峰值,限流是最直接的削峰手段,被限制的请求可以直接返回,客户端提示请求中提示。可想而知,当10000/S的请求量被削成100/S的量,估计系统稍微优化一下就能抗住,至于限流的策略根据业务会有很多不同的方式,比如:

  • 针对同一个用户的请求次数限流,例如:每个用户每10秒只允许请求一次

  • 针对同一个IP的请求次数限流,例如:每个IP每10秒只允许请求一次

至于限流的算法,之前写过一篇文章来介绍,而且性能还不错哦

高并发优雅的做限流

第二招:消息队列

说到消息队列,每个程序员都不陌生,它相当于一个快速的数据容器,可以作为一个缓冲层来应对流量高峰。如果从它的使用场景上来看,它可以算是低速设备和高速设备之间的平衡者,使用消息队列来进行削峰是一个很明显的异步流程。

应用到秒杀的场景下,大量的请求会先进入消息队列,它不仅削平了流量的峰值,而且把秒杀下单的这个流程异步化,只要把请求都暂存入队列,消费端慢慢消费即可,但是这里要注意,如果消费的速度远远慢于消息的投递速度,可能会影响整个系统性能。

除了削峰之外,我始终认为消息队列的最大作用是系统解耦,它把下单和支付解耦,下单和支付业务可以随着自身系统的承载量来单独扩容。

第三招:缓存

为什么要加入缓存这个选项呢?别忘了,除了大量的用户下单这个写操作之外,还有更大量的用户请求下单结果这个读操作。当用户点击秒杀按钮之后,系统会弹出等待的提示框,很多系统是不停的去轮训用户的下单结果,我之前也写过缓存的文章,曾经提到过缓存最大的作用是提供读操作的快速响应。整个秒杀系统可以这样做:

  • 用户点击下单按钮,请求经过限流组件,如果成功,则进入下单环节(这里可以进入消息队列,异步下单)

  • 服务端无论是采用redis缓存,还是其他缓存组件,存放着下单成功的用户信息(也可以包括订单信息)

  • 客户端采用轮训的方式去查询缓存,如果查询到信息说明下单成功,进入支付环节,未查询到则说明下单还未成功

  • 服务端下单成功,往缓存中写入数据,当用户下次再次查询的时候会提示下单成功。

虽然过程很简单,但是其实整个过程中有很多细节需要注意,比如:缓存的过期时间怎么设置?能否引入下单中的状态?怎么保证缓存数据和数据库数据的一致性?

谈了千百遍的缓存数据的一致性问题

除了以上的信息数据缓存,商品的信息数据也可以放在缓存中,由于读的请求量比较大,可以考虑采用缓存副本的方式来提高整体的吞吐量。

写在最后

其实很多系统应用上消息队列+限流之后,针对秒杀业务已经足够了,其余的分库分表等方案可以根据自己的业务量来确定。每个系统在满足功能性的需求下,也在满足非功能性需求的前提下越简单越好,不是每个系统都需要淘宝的架构。

更多精彩推荐
☞独家对话华为王成录:手机 HarmonyOS 开发者 Beta 版将如约而至
☞对话指令集创始人兼CEO潘爱民:面向未来的新型物联网操作系统 | 人物志
☞@程序员,什么才是“2020-1024”的正确打开姿势?☞最新!百度首发 OCR 自训练平台 EasyDL OCR☞SQL分页查询方案的性能对比
☞2021年,很可能是以太坊的“高光之年”
点分享点点赞点在看

程序员过关斩将——搞定秒杀,只需要这几步!!相关推荐

  1. 程序员过关斩将--搞定秒杀,只需要这几步!!

    " 灵魂拷问 秒杀这种大并发的写场景,直接分库分表开干? 应对秒杀活动的流量高峰很难吗? 不要拿淘宝级别的秒杀忽悠我 秒杀活动特点 我敢说凡是做过电商的同学,都会遇到运营展开的秒杀,限时购等 ...

  2. 程序员如何搞定前端高频面试难题?附答案汇总 | 技术头条

    作者 | 木易杨 责编 | 伍杏玲 第 1 题:简单讲解一下 HTTP2 的多路复用 在 HTTP/1 中,每次请求都会建立一次TCP连接,也就是我们常说的3次握手4次挥手,这在一次请求过程中占用了相 ...

  3. 程序员过关斩将--从未停止过的系统架构设计步伐

    " 首先,这篇文章肯定会得罪一些人 " 其次,此文只代表我个人的意见,仅供参考 从分层说起 谈到系统架构的分层和系统领域边界的划分,每个架构师,每个技术经理,甚至每个程序员都有自己 ...

  4. 程序员过关斩将--你的面向接口编程一定对吗?

    菜菜哥,出大事啦 怎么了,你和男票分手了?很正常,谁让你男票是产经经理呢 不是啦,是我做的一个小游戏,需求又变了,程序我快改不动了 说来让我欢乐一下? 菜菜哥,咱两还能不能好好相处了 玩笑 玩笑,sh ...

  5. 程序员过关斩将--从每秒6000写请求谈起

    点击上方"蓝字"关注我们 菜菜哥,紧急求助呀 怎么回事?产品经理砍你了? 没有,只是写了个新项目,上线就被压垮了 什么功能,这么强悍? 一个记录用户观看视频进度信息的功能 那如果用 ...

  6. 程序员过关斩将--自定义线程池来实现文档转码

    背景 我司在很久之前,一位很久之前的同事写过一个文档转图片的服务,具体业务如下: 1. 用户在客户端上传文档,可以是ppt,word,pdf 等格式,用户上传完成可以在客户端预览上传的文档,预览的时候 ...

  7. 程序员过关斩将--少年派登录安全的奇幻遐想

    " 据说,这篇也是快餐,完全符合年轻人口味 说到登录,无人不知无人不晓.每一个有用户体系的相关系统都会有登录的入口,登录是为了确认操作人的正确性.说到登录安全,其实是一个很伟大的命题,不过常 ...

  8. 程序员过关斩将--请不要误会redis 6.0 的多线程

    " 你对redis的单线程是不是有点误会? " 你对redis 6.0的多线程是不是也有点误会? " redis多线程一定可以提高性能吗? redis官方刚刚发布的6.0 ...

  9. 程序员过关斩将--应对高并发系统有没有通用的解决方案呢?

    " 灵魂拷问: 应对高并发系统有没有一些通用的解决方案呢? 这些方案解决了什么问题呢? 这些方案有那些优势和劣势呢? 对性能孜孜不倦的追求是互联网技术不断发展的根本驱动力,从最初的大型机到现 ...

最新文章

  1. PyTorch中模型的可复现性
  2. 关于Yii2中CSS,JS文件的引入心得
  3. 将一个数组中的字符串用指定字符分割开,分别放到另一个数组中
  4. 试从微型计算机的硬件组成角度谈谈单片机,单片机原理及应用课后习题参考答案1~6章...
  5. 一篇文章梳理完虚拟现实相关的核心技术 | 收藏
  6. [Leedcode][JAVA][第820题][字典树][Set]
  7. 行货好还是水货好?详解苹果iPhone5版本选购 --国行、港行、水货、合约机
  8. Metropolis Hastings MCMC when the proposal and target have differing support
  9. 管理账目的计算机软件有哪些,最好的记账软件哪个好
  10. 使用mentohust解决ubuntu下校园网无法连接
  11. matplotlib的imshow函数显示灰度图像要设置vmin和vmax2个参数
  12. html图片加水印元素,使用HTML5 Canvas给图片加水印效果
  13. 中文情感极性词典 NTUSD
  14. matlab画图窗口显示中文乱码,全是方框的解决方法
  15. 6-1 数一数每个数据出现多少次,挑出出现次数最多的那一个
  16. selenium源码通读·4 |webdriver/common分析
  17. 如何保护您的数据免遭未经授权的访问
  18. Keil uVision5 MDK(ARM)软件的介绍、下载、安装与注册
  19. 关于国家计算机二级C程序设计考点
  20. 起底飞书:在产品背后,看见现代管理哲学

热门文章

  1. Web Performance Test: 如果使用Plugin过滤Dependent Request
  2. 重置Mysql自增列的开始序号
  3. 安装mysql connector odbc后在控制面板 数据源下没有找到mysql的驱动
  4. Python学习(三十七)—— 模板语言之自定义filter和中间件
  5. 5月25日-js操作DOM遍历子节点
  6. strong和weak 细节
  7. Head First Python 学习笔记(第二章:分享你的代码)
  8. RedHat中squid简易配置
  9. 实现弹出窗口并转到另一个页面
  10. EVC编程经验点滴(一)