灵魂拷问

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

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

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

秒杀活动特点

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

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

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

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

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

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

静态资源

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

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

业务让步

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

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

技术第一招:限流

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

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

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

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

高并发优雅的做限流

第二招:消息队列

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

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

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

第三招:缓存

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

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

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

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

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

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

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

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

写在最后

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

END

更多精彩文章

  • ????分布式大并发系列

  • ????架构设计系列

  • ????趣学算法和数据结构系列

  • ????设计模式系列

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

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

    作者 | 菜v菜 来源 | 架构师修行之路(ID:jiagoushixiuxing) 头图 |  CSDN 下载自东方IC "灵魂拷问 秒杀这种大并发的写场景,直接分库分表开干? 应对秒杀活 ...

  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. ORACLE建表练习
  2. XML – E4X概述
  3. 在mysql控制台查询有乱码_mysql控制台显示乱码问题
  4. mx51 uboot启动感悟
  5. Hyperledger Fabric 智能合约实战 (2)软件安装Docker、 Docker-composer、go
  6. 如何用c语言验证一个定理,验证动量定理方法一
  7. appium+python+iOS 环境搭建与使用中常见问题的解决方案链接
  8. 曲线拟合的线性最小二乘法
  9. mybatis注册映射文件
  10. 某游戏中有轰炸机、直升机、重型坦克、轻型坦克、飞行兵、步兵等六大兵种
  11. QQ所有文件和目录详细分析
  12. 工业设计与钣金工艺是怎么相互相成的
  13. VB.NET 强制删除文件
  14. MongoDB 下载地址列表
  15. win10系统无法开启远程服务器配置,win10系统无法连接远程服务器的方案介绍...
  16. 介绍计算机专业说明文,描述电脑说明文600字.doc
  17. java 转化罗马数字._Java刷LeetCode:整数转罗马数字
  18. strcat_s详解
  19. 微服务A读配置中心报Could not locate PropertySource错误
  20. 14、W601之AHT10温湿度传感器

热门文章

  1. WordCount--统计输入文件的字符数、行数、单词数(java)--初级功能
  2. Shell脚本之sed的使用
  3. Map 遍历取值及jstl的取值
  4. iOS js oc相互调用(JavaScriptCore)
  5. 私有云搭建 OpenStack(centos7.3, centos-release-openstack-ocata)
  6. JsonRequestBehavior.AllowGet 方便浏览器调试
  7. 上帝的玩偶:haXe语言
  8. 设置su为不需要密码切换为root
  9. Xcode中release和debug模式
  10. 如何在已安装TMG2010服务器上安装Symantec Backup Exec 2010 Remote Agent