当前位置: 首页 > java >正文

三高架构杂谈

我们的秒杀请求到了tomcat之后,我整个请求到了后端,我们怎么抗住高并发
也就是让他1s抗住10w的订单量,该怎么做
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
一般来说秒杀系统都是需要单独部署的,因为它的并发压力很大他跟我们正常微服务或者web系统都是需要 单独剥离开的

在这里插入图片描述

这就是我们秒杀商品最简单的代码,假设我现在就只剩下一个库存了.我几十个请求同一时刻调用了查询db的方法,呢它都查到还有一个库存 ,都会减1 操作 意味着严重超卖update(product)----->意味着减1 操作超卖的问题如何解决 此时必然不能加sy锁,因为加了锁之后我们的并发就抗不到10w以上了如果要求并发不高可以加锁我们可以利用 update stock -1 where shock >0    利用行锁
我其实是用数据库来帮我们解决并发 超卖的问题

在这里插入图片描述

我们其实是用数据库的乐观锁的方式来更新我们的e库存  解决超卖的问题
我就不用在整个代码逻辑上加锁了
这样来做性能会高一些有什么好的优化方案,让我这个系统的并发继续上升。
我们一般会用redis+mq
====================================>>>>>>>>>>>>>>>>>>>>>>>>>

在这里插入图片描述

 我们秒杀走缓存得方案,我们秒杀得商品库存 提前放到缓存中  这个叫做缓存预热然后我们真正减少db,然后我们真正减库存的时候 不是直接db干的,db并发太低了,我们一般在缓存中扣减库存

在这里插入图片描述

所以我们的秒杀系统,会提前预热商品缓存缓存
然后我们真正做秒杀的时候,从redis查商品库存一般mq下单,慢慢去消费。我异步创建订单.也就是前端下单链路 没有操作db的 
性能很高得因为redis 的并发本身就可以支撑很高  如果用kafka 或者mq ,它得并发也很高
我前端给用户返回一个抢购成功前端 给用户一个缓冲   我可以每过2到3s中 往后台发一个查询订单的请求
看下你这个订单有没有下成功 如果你没有下成功
我继续再重发请求 又过2到3s 再去发  当你后端mq消费完毕 被下单成功后
我这个时候再去查询的时候 下单成功  转到支付页面
redis理论上每秒能抗10w的并发,但是实际上没有  而且一般是读的时候才可以
我们的redis是有读有写,也就是说redis既有查询又有写的时候 是支撑不了10w并发的
########>>>>>>>>>>>>>>>>>>>>>..所以我们用 redis的集群架构
redis集群架构 
正常用redis单节点 有单节点问题 如果用redis集群架构
我们服务端的redis集群  我们数据在redis集群中是分片存储的比方说我线上有10个商品 这10个商品实际上是分布式在不同的redis节点上
真正的redis节点它的数据是分片存储的

在这里插入图片描述

根据它的hash 分片算法
redis集群 他会帮我们把数据进行分片来存储
我一个redis节点读写并发 就2w左右
假设现在我有10个商品  我按照334 的拆分

在这里插入图片描述

我每秒 都能抗接近10w 的并发了
redis做集群架构 让你的所有的秒杀 活动 的商品均匀的分配在redis的节点
#############>>>>>>>>>>>>>>>>>>>>>>>...
但是没有呢么理想  很有可能10 个商品 按照hash分片算法  都落在在了第一个节点
呢这套系统只能抗3w的并发  
### redis集群架构的数据倾斜怎么解决
你的商品的key 都落在同一个节点上,导致我们所有的请求 都打在同一个节点上针对我们秒杀商品说白了,要缓存预热的时候 你这个商品在那个节点上,你自己肯定要知道的我预热的时候就得解决,我们通过一些redis命令,吧倾斜的商品进行移动,
或者我们可以用hashTag 把我们的商品进行分片

在这里插入图片描述

也就是说{1,2} 在一个节点上 {3,4} 在一个节点上
其实说白了,我现在有10个秒杀商品.我其实来的10w并发  甚至更高的并发 都集中在1个商品上
我所有请求都只抢一个商品 呢意味着  你现在所有请求 又打到了某一个节点上
此时就不能支撑10w的并发了热点商品问题 怎么提升它的并发
一个商品的并发请求就很高
怎么让它扛到10w 的并发 有什么好的方案
我做秒杀的时候 我应该有一些预设  就不能把他的库存放在一个redis节点上
我在做缓存预热的时候 我就的要拆开了
就算此时都是抢茅台,我自己做一个负载均衡的策略 第一个请求 抢第一个 第二个请求抢第二个节点的100个

在这里插入图片描述

http://www.xdnf.cn/news/18119.html

相关文章:

  • 软件定义汽车---创新与差异化之路
  • Jenkins全链路教程——Jenkins调用Maven构建项目
  • Kafka文件存储机制
  • 深入浅出决策树
  • (二十)深入了解 AVFoundation-编辑:使用 AVMutableVideoComposition 实现视频加水印与图层合成(下)——实战篇
  • Google 的 Opal:重新定义自动化的 AI 平台
  • Git版本控制与协作
  • 4.9 配置 开发服务器 和 请求代理
  • 汽车之家联合HarmonyOS SDK,深度构建鸿蒙生态体系
  • 使用Idea安装JDK
  • 从零开始,系统学习AI与机器学习:一份真诚的学习路线图
  • 容器化 Android 开发效率:cpolar 内网穿透服务优化远程协作流程
  • Baumer高防护相机如何通过YoloV8深度学习模型实现网球运动员和网球速度的检测分析(C#代码UI界面版)
  • WPF中BindingList<T>和List<T>
  • Conda技巧:修改Conda环境目录,节省系统盘空间
  • 学习:各种不同类型的for循环遍历,forEach/map/filter/every/some/includes/reduce的详细用法(1)
  • 【项目】分布式Json-RPC框架 - 项目介绍与前置知识准备
  • [Linux]学习笔记系列 --[mm][list_lru]
  • Redis-缓存-穿透-布隆过滤器
  • 测试Windows10IoT系统是否可以正常运行KingSCSDA3.8软件
  • Transformer架构的数学本质:从注意力机制到大模型时代的技术内核
  • 蓝凌EKP产品:JSP 性能优化和 JSTL/EL要点检查列表
  • Excel 表格数据自动填充
  • C语言私人学习笔记分享
  • Canny边缘检测
  • pyecharts可视化图表组合组件_Grid:打造专业数据仪表盘
  • python pandas库 series如何使用
  • 电脑上搭建HTTP服务器在局域网内其它客户端无法访问的解决方案
  • 【Tech Arch】Hive技术解析:大数据仓库的SQL桥梁
  • 【从零开始学习Redis】项目实战-黑马点评D2