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

电商项目_秒杀_架构升级

1. 秒杀当前架构设计

  • nginx节点和订单服务都可以方便的扩容(增加机器)
  • redis扩容需则需要考虑架构设计

当前架构面临的痛点:

        秒杀系统redis是单节点(主从)部署,读redis时并发量会成为瓶颈。

        所以考虑将增加redis从节点个数。秒杀系统为提交读库存的性能,将redis从节点和nginx节点部署在一起的, 如果升级成redis集群, nginx读哪个从节点呢?-》考虑将nginx也水平扩展。

(nginx可以扩容原因:商品详情页的静态页面发布到OpenResty上, 那么就可以考虑将不同商品的页面发布到不同的openResty上)

2. redis增加从节点 + nginx水平扩展

  • 1个redis主节点n个redis从节点
  • 不同的商品详情页发布到不同的nginx

        当前架构面临的痛点:

        秒杀商品比较多时, 单个主redis节点更新库存、主redis节点同步从节点数据,会成为性能瓶颈。所以考虑将Redis升级成集群。

3. Redis垂直拆分

  • nginx读取的redis从节点,就可能不在一个机器了。
  • Redis 的集群化部署,多个 SKU 的数据,会分散到各个 Redis 节点当中,就可以解决 Redis 数据量太⼤的问题。并且,基于 Redis 集群的⽅式,Redis 服务的可⽤性也得到了提⾼。我们可以通过再加⼊哨兵机制等⽅式,保证少量 Redis 节点挂了后,整个 Redis 集群不会出现问题。        

当前架构面临痛点:

  • 采⽤集群部署 Redis 后,因为⼤部分的 Redis 客户端都是通过连接池实现的,此时Redis 的连接数就会逐渐成为瓶颈。
  • 无法确定Redis中的数据分布,也就⽆法保证每个Nginx只读取本地的 Redis

       Redis连接池:取决于具体的客户端实现,客户端可以配置针对单节点的连接池,也可以配置集群的连接池。

通过中间件减少连接数

  1. 使⽤TwemProxy于 Redis 之间建⽴单链接交互,并通过Twemproxy实现分⽚逻辑。这样我们就可以⽔平扩展出更多的Twemproxy来增加连接数。
  2. Twemproxy实例众多,应⽤维护、配置困难,需要在这之上做负载均衡。⽐如,通过LVA/HaProxy 实现VIP(虚拟 IP),就可以做到节点切换对应⽤透明、故障⾃动转移。还可以通过实现内⽹ DNS 来做其负载均衡。

4. 库存预分配方案

        解决 无法保证Nginx只读本地 Redis的问题。同时也解决了集群redis线程池的问题。

        在很多互联⽹企业中,不会直接使⽤ Redis 的集群架构,⽽是搭建多个 Redis 节点。并通过库存预分配的⽅式,⾃⾏控制 Redis 中的数据分布。

优点:

  • 每个应用都有独立的库存数据,大大降低了并发度,另外,各个应用扣减库存的速度不一样,一定程度防止了羊毛党
  • 不同商品详情页配置到不同的OpenResty上,前端引导用户进入不同的静态页面 
  • 一定程度解决热点商品问题,因为每个二级redis中可以配置多个SKU的活动信息

缺点:

  • 前端引导用户进入不同的静态页面 ,但是如果想要多个服务承担同一个商品的秒杀服务, 前端如何进行合理的引导,需要将引导与库存进行沟通
  • 服务出现问题,库存很难回收:二级redis是单点部署(主从),如果redis在活动过程崩溃,基于这个redis的库存数据无法回滚,从而影响整体库存管理。(纯粹单节点,活动数据可以通过日志恢复,后续的返厂活动进行补救)
  • 各个服务之间无法沟通,导致有库存,但是用户秒杀不到的问题。 APP1有库存,APP2无库存,但是APP2进来的秒杀请求却无法下单。抢购多个商品也是类似问题。

5. 动态库存方案

解决不同二级redis服务之间不沟通的问题。

  1. 独立出库存分配服务
  2. 每个二级redis缓存配置个阈值,当库存低于域阈值时,通知库存分配服务,库存分配服务再访问各个Redis, 对库存进行统一分配
    • 优先从一级redis分配,这样速度更快
    • 一级redis扣减完成后,再协调二级redis进行动态库存分配
  3. 当秒杀活动快结束时或者库存快全部售完时,所以二级redis的库存都低于一个临界值,可以将所有库存回收,统一分配给某一个二级Redis。

存在问题:

  • 前端引导用户进入不同的静态页面 ,但是如果想要多个服务承担同一个商品的秒杀服务, 前端如何进行合理的引导,需要将引导与库存进行沟通
  • 服务出现问题,库存很难回收:二级redis是单点部署(主从),如果redis在活动过程崩溃,基于这个redis的库存数据无法回滚,从而影响整体库存管理。(纯粹单节点,活动数据可以通过日志恢复,后续的返厂活动进行补救)

6. 秒杀与直播带货

相同点:

  • 流量来的非常突然, 瞬间巨大流量
  • 热点数据
  • 都要处理三高问题

不同点:

  • 直播带货允许超卖
  • 直播带货持续时间更长

http://www.lryc.cn/news/598214.html

相关文章:

  • 4G手机控车模块的核心功能与应用价值
  • 告别束缚:这款“隐形心电监测仪”让心脏健康管理更自由
  • Oracle 时间处理函数和操作符笔记
  • Python-初学openCV——图像预处理(二)
  • 服务器带宽具体是指什么意思?
  • 硅基计划3.0 学习总结 贰 顺序表与链表
  • 图论:搜索问题
  • 深度分析Android多线程编程
  • Leetcode力扣解题记录--第2题(加法模拟)
  • ESP32S3 Ubuntu vscode如何使用USB-JTAG调试
  • 【开源】WPF的数据可视化大屏解决方案——WpfMap
  • C++课设实践项目:C++构建的学籍管理系统
  • Cisco 主模式配置
  • SGLang + 分布式推理部署DeepSeek671B满血版
  • JavaSE:开发环境的搭建(Eclipse)
  • Java与NLP实战:文本处理到情感分析全解析
  • 【ECharts✨】解决Vue 中 v-show 导致组件 ECharts 样式异常问题
  • [AI 生成] Flink 面试题
  • 【论文阅读】REVISITING DEEP AUDIO-TEXT RETRIEVAL THROUGH THE LENS OF TRANSPORTATION
  • 基于SpringBoot+Uniapp的健身饮食小程序(协同过滤算法、地图组件)
  • 人形机器人加快先进AI机器人开发
  • 开发避坑短篇(5):vue el-date-picker 设置默认开始结束时间
  • 实时云渲染将UE像素流嵌入业务系统,实现二维管理系统与数字孪生三维可视化程序的无缝交互
  • 小程序生命周期及页面操作执行过程详解
  • 使用phpstudy极简快速安装mysql
  • Java进阶3:Java集合框架、ArrayList、LinkedList、HashSet、HashMap和他们的迭代器
  • Android集成Google Map
  • C++中std::list的使用详解和综合实战代码示例
  • RPG64.制作敌人攻击波数四:优化
  • vue 项目中 components 和 views 包下的组件功能区别对比,示例演示