这时,你面对的依旧是读请求过高,那么应对的措施有哪些呢?

优化方案


丢弃订单

最早期,量太大扛不住,直接前端随机reject一些,返回抢单失败,简

单粗暴,但是有效,比如10万人抢100个iPhone,只要能提前预测有大概1万以上的人参与(通过资格确认、报名等方式收集信息),那么直接请求进来以后随机挡回去

99%的流量都没有啥问题。

优化吞吐

中间有段时间,提前准备一大批机器,服务化、分库分表搞定后端性能,让前端业务可以加一定量的机器,然后搞稳定性,依赖关系,容量规划,做弹性,提升吞吐量。

异步队列

使用可堆积的消息队列或内存消息队列。若抢单具有强顺序,则先都进队列,然后拿前N (就是库存数)个出来平滑处理,剩下都可作为失败进行批处理,甚至还可以做一个定长队列,再往里写直接提示失败。队列把并发变成串行,从而去掉了分布式锁。

内存分配

某些业务可以考虑预热,提前在每个机器节点内存分配好库存数,然后直接在内存处理库存数。

拆分扩展

对于不同类型、不同商家、不同来源的商品,部署不同的前端促销集群,

分散压力。比如,按每个整点发起秒杀,具体到每个商家,其实量就不大了。

服务降级

越重要的抢单,大家越关心自己有没有抢到,而不是特别在意订单立即处

理完,也就是说,下单占到位置比处理完成订单要更有价值。比如12306春运抢票,只要告诉用户你抢到了票,但预计1个小时后订单才会处理完,用户有这个明确预期即可。用户不会立马使用这张票,也不会在意1min还是1h内处理完。

部分方案会导致销售不足或超卖:

  • 销售不足可以从抢购里加一些名单补发,也可以加一轮秒杀

  • 超卖比较麻烦,所以一般会多备一点货,比如抢100个iPhone,提前准备110 个

因为用户查询的是少量的商品数据,属查询热点数据,

《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》

【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享

可采用缓存将请求尽量挡在上层缓存,能被静态化的数据(比如商城里的图片和视频数据)尽量做到静态化,这就可命中CDN节点缓存,减少Web服务器的查询量和带宽负担。Web服务器比如Nginx可以直接访问分布式缓存节点,从而避免请求到达Tomcat等业务服务器。

当然,你可以加上一些限流的策略,比如对短时间之内来自某一个用户、某一个IP或者某一台设备的重复请求做丢弃处理。

通过这几种方式,请求就可以尽量挡在数据库之外了。

稍微缓解了读请求之后,00:00分秒杀活动准时开始,用户瞬间向电商系统请求生成订单,扣减库存,用户的这些写操作都是不经过缓存直达数据库的。1秒钟之内,有1万个数据库连接同时达到,系统的数据库濒临崩溃,寻找能够应对如此高并发的写请求方案迫在眉睫。这时你想到了消息队列。

理解消息队列

把消息队列看作暂时存储数据的一个容器,它是一个平衡低速系统和高速系统处理任务时间差的工具。

比如古代臣子朝见皇上陈述国家大事,等皇上决策。但大臣很多,如果同时去找皇上,皇上肯定会崩溃。后来变成臣子到午门后要原地等皇上将他们一个一个地召见进大殿商议,这就缓解皇上处理事情的压力。

可以把午门看作一个暂时容纳臣子的容器,即消息队列:

  • 在Java线程池中我们就会使用一个队列来暂时存储提交的任务,等待有空闲的线程处理这些任务

  • os中断的下半部分也会使用工作队列来实现延后执行

  • 实现一个RPC框架时,也会将从网络上接收到的请求写到队列里,再启动若干个工作线程来处理

那如何用消息队列解决秒杀场景下的问题呢?

削去秒杀场景下的峰值写流量

在秒杀场景下短时间之内数据库的写流量很高,按以前思路,应该分库分表。若已做了分库分表,则需要扩展更多数据库应对更高写流量。

但无论是分库分表还是扩充更多数据库都会很复杂,因为你需要迁移数据库中的数据,这个时间就要按天甚至周计算。

而在秒杀场景下高并发的写请求并不是持续的,也不是经常发生,而只有在秒杀活动开始后的几s或十几s时间内才存在。

为了应对这十几s瞬间写高峰,而去花费几天甚至几周扩容DB,再在秒杀之后花费几天做缩容,得不偿失!

所以思路是:将秒杀请求暂存在MQ,然后业务服务器会响应用户“秒杀结果正在计算”,释放了系统资源之后再处理其它用户请求。

在后台启动若干个队列处理程序消费MQ中的消息,再执行校验库存、下单等逻辑。因为只有有限个队列处理线程在执行,所以落入后端DB上的并发请求有限。而请求是可以在MQ被短暂堆积,当库存被消耗完后,消息队列中堆积的请求就可以被丢弃了。

这就是MQ在秒杀系统中主要作用:削峰填谷,可以削平短暂流量高峰,虽说堆积会造成请求被短暂延迟处理,但只要我们时刻监控MQ中的堆积长度,在堆积量超过一定量时,增加队列处理机数量来提升消息处理能力即可,而且秒杀用户对于短暂延迟知晓秒杀的结果也有一定容忍度。

注意是“短暂”延迟,若长时间没有给用户公示秒杀结果,则用户会怀疑秒杀活动有黑幕。所以在使用MQ应对流量峰值时,需要对队列处理的时间、前端写入流量的大小、数据库处理能力做好评估,然后根据不同的量级来决定部署多少台队列处理程序。

比如你的秒杀商品有1000件,处理一次购买请求的时间是500ms,那么总共就需要500s的时间。这时你部署10个队列处理程序,那么秒杀请求的处理时间就是50s,也就是说用户需要等待50s才可以看到秒杀的结果,这是可以接受的。这时会并发10个请求到达数据库,并不会对数据库造成很大的压力。

通过异步处理简化秒杀请求中的业务流程

其实在大量的写请求“攻击”你的电商系统的时候,消息队列除了发挥主要的削峰填谷的作用之外,还可以实现异步处理来简化秒杀请求中的业务流程,提升系统的性能。

你想,在刚才提到的秒杀场景下,我们在处理购买请求时需要500ms。这时你分析了一下整个的购买流程,发现这里面会有主要的业务逻辑,也会有次要的业务逻辑:比如说,主要的流程是生成订单、扣减库存;次要的流程可能是我们在下单购买成功之后会给用户发放优惠券,会增加用户的积分。

假如发放优惠券的耗时是50ms,增加用户积分的耗时也是50ms,那么如果我们将发放优惠券、增加积分的操作放在另外一个队列处理机中执行,那么整个流程就缩短到了400ms,性能提升了20%,处理这1000件商品的时间就变成了400s。如果我们还是希望能在50s之内看到秒杀结果的话,只需要部署8个队列程序就好了。

经过将一些业务流程异步处理之后,我们的秒杀系统部署结构也会有所改变:

解耦实现秒杀系统模块之间松耦合

除了异步处理和削峰填谷以外,消息队列在秒杀系统中起到的另一个作用是解耦合。

比如数据团队对你说,在秒杀活动之后想要统计活动的数据,借此来分析活动商品的受欢迎程度、购买者人群的特点以及用户对于秒杀互动的满意程度等等指标。而我们需要将大量的数据发送给数据团队,那么要怎么做呢?

一个思路是:使用HTTP或者RPC的方式来同步地调用,也就是数据团队这边提供一个接口,我们实时将秒杀的数据推送给它,但是这样调用会有两个问题:

整体系统的耦合性比较强,当数据团队的接口发生故障时,会影响到秒杀系统的可用性。

当数据系统需要新的字段,就要变更接口的参数,那么秒杀系统也要随着一起变更。

这时,我们可以考虑使用消息队列降低业务系统和数据系统的直接耦合度。

【Java每日面试题】大厂是如何设计秒杀系统的,渣本Java开发小伙如何一步步成为架构师相关推荐

  1. java毕业设计员工绩效考核系统分析与设计Mybatis+系统+数据库+调试部署

    java毕业设计员工绩效考核系统分析与设计Mybatis+系统+数据库+调试部署 java毕业设计员工绩效考核系统分析与设计Mybatis+系统+数据库+调试部署 本源码技术栈: 项目架构:B/S架构 ...

  2. java计算机毕业设计京津冀畅游网设计MyBatis+系统+LW文档+源码+调试部署

    java计算机毕业设计京津冀畅游网设计MyBatis+系统+LW文档+源码+调试部署 java计算机毕业设计京津冀畅游网设计MyBatis+系统+LW文档+源码+调试部署 本源码技术栈: 项目架构:B ...

  3. 春招高频面试题:怎样设计秒杀系统?

    前言 高并发下如何设计秒杀系统?这是一个高频面试题.这个问题看似简单,但是里面的水很深,它考查的是高并发场景下,从前端到后端多方面的知识. 秒杀一般出现在商城的促销活动中,指定了一定数量(比如:10个 ...

  4. 系统架构设计——秒杀系统架构设计

    摘要 秒杀大家都不陌生.自2011年首次出现以来,无论是双十一购物还是 12306 抢票,秒杀场景已随处可见.简单来说,秒杀就是在同一时刻大量请求争抢购买同一商品并完成交易的过程.从架构视角来看,秒杀 ...

  5. java修改数据库表结构_数据库设计(一):设计传统系统表结构(Java开发)

    以下文章来源于微信公众号 程序编程之旅 ,作者陈浩翔 此处仅供本人学习记录之用,侵删 本篇为第一篇.讲解传统系统的表结构设计(Java开发). 讲讲如何避免数据库设计的一些坑,方便后期的开发与维护. ...

  6. db2查看表结构_作为后端开发如何设计数据库系列文章(一)设计传统系统表结构(Java开发)...

    本篇为第一篇.讲解传统系统的表结构设计(Java开发). 讲讲如何避免数据库设计的一些坑,方便后期的开发与维护. 以前经常能够看到,数据库范式,现在说数据库三大范式的少了. 三大范式我以前也很严格的弄 ...

  7. 面试官系统精讲Java源码及大厂真题 - 13 差异对比:集合在 Java 7 和 8 有何不同和改进

    13 差异对比:集合在 Java 7 和 8 有何不同和改进 更新时间:2019-09-19 09:39:16 时间像海绵里的水,只要你愿意挤,总还是有的. --鲁迅 引导语 Java 8 在 Jav ...

  8. java 超卖_Java生鲜电商平台-秒杀系统如何防止超买与超卖?(小程序/APP)

    本文主要是通过实际代码讲解,帮助你一步步搭建一个简易的秒杀系统.从而快速的了解生鲜电商秒杀系统的主要难点,并且迅速上手实际项目. 我对生鲜电商秒杀系统文章的规划: 从零开始打造简易秒杀系统:乐观锁防止 ...

  9. 阿里面试官问我:如何设计秒杀系统?我给出接近满分的回答

    你知道的越多,你不知道的越多 点赞再看,养成习惯 GitHub上已经开源 https://github.com/JavaFamily 有一线大厂面试点脑图和个人联系方式,欢迎Star和指教 正文 首先 ...

  10. 关于设计秒杀系统的几个问题

    本文来说下如何设计一个秒杀系统. 文章目录 秒杀场景 第1版-裸奔 第2版-悲观锁 第3版-乐观锁 第4版-限流 漏桶算法 令牌桶算法 第5版- 细节优化 限时抢购 秒杀接口隐藏 访问频率限制 第6版 ...

最新文章

  1. CASE WHEN 高阶用法?
  2. python读程序是什么意思_0基础学Python之一:什么是程序?
  3. Exception in thread main java.io.IOException: (null) entry in command string: null chmod 0700 E:\t
  4. 7_23 day26 14min面向对象总结
  5. 细粒度权限控制 linux,FGAC(细粒度访问控制)/VPD
  6. 把编译时间加入到目标文件
  7. 网页版简书界面优化小建议
  8. php mysql 获取排名,Mysql排序获取排名的实例代码
  9. 【日本软件外包】设计书中常用到的文型
  10. 用友nc的java插件下载,用友nc插件下载|
  11. python学习手册第五版_自学笔记系列:《Python学习手册 第五版》 -写在开始之前...
  12. 如何删除Word 2010中的“向下箭头”
  13. 无线监控安ftp服务器,ftp服务器摄像头监控
  14. nginx 全局变量 以及配置
  15. vulntarget-a靶场的学习思考
  16. 学生学籍的计算机管理属于,随着计算机的飞速发展,其应用范围不断扩大,某学校学生学籍的计算机管理属于__应用领域。A.科学计...
  17. 异地多活(异地双活)实践经验
  18. Android查看手机位置,android-查找手机的位置
  19. Days 24 网络编程 正则表达式
  20. Bzoj4766 文艺计算姬

热门文章

  1. 网页局部打印以及如何设置打印机纸张大小
  2. 华为od与中软外包哪个更好_真惨!入职中软一个月(外包华为)就离职了~
  3. 如何使用 Putty 以密钥 private key 的方式登录腾讯云主机
  4. Centos7+DockerCompose部署.NetCore3.1应用
  5. python中数字转英文_python:将数字转换成用英文表达的程序
  6. CATIA二次开发—API梳理
  7. ExcelVBA:请注意!文档部分内容可能包含文档检查器无法删除的个人信息。
  8. 天地图key的申请步骤
  9. 中文现代诗歌创作项目
  10. SF授权系统V3.5开源无加密 SF授权系统V3.0开源