常见系统设计

秒杀系统

  • 前端层:
    静态资源缓存:通过CDN缓存商品图片、页面静态HTML,减少回源请求。
    请求合并:合并用户频繁刷新的请求(如10秒内仅允许一次真实请求)。
    端侧限流:通过JS或APP端限制用户高频点击(如倒计时按钮禁用、点击后置灰)。
  • 接入层:
    负载均衡:使用LVS/Nginx实现流量分发,结合IP Hash或一致性哈希减少后端压力。
    请求队列:引入Kafka/RocketMQ缓冲瞬时流量(削峰填谷),按后端处理能力消费。
    边缘计算:在CDN边缘节点拦截非法请求(如未登录用户、IP黑名单)。
  • 服务层:
    服务拆分:将核心功能(库存扣减、订单创建)与非核心功能(日志、通知)解耦。
    读写分离:读服务(查询库存)与写服务(扣库存)独立部署,避免相互影响。
    热点隔离:为秒杀商品分配独立资源池(专用集群、线程池、数据库连接池)。
  • 存储层:
    缓存抗压:库存预加载至Redis集群(使用Lua脚本实现原子化扣减)。
    分库分表:订单库按用户ID分片,库存库按商品ID分片,降低单点压力。
    最终一致:通过MQ异步同步缓存与数据库,允许短暂不一致但最终收敛。

问题处理

  • 超卖
    • 预扣库存:采用预扣除而非实时扣减(例如Redis原子化操作lua)
local stock = tonumber(redis.call('GET', KEYS[1]))
if stock > 0 thenredis.call('DECR', KEYS[1])return 1  -- 扣减成功
elsereturn 0  -- 库存不足
end
//库存要>0
UPDATE stock SET quantity = quantity - 1 
WHERE item_id = #{itemId} AND quantity >= 1;
  • 热点数据竞争
    缓存预热:在秒杀开始前将库存数据加载到Redis并禁止直接访问DB。
    Key分片:将热点商品的库存拆分为多个Key(如item_stock_1, item_stock_2),分散访问压力。
    本地缓存+延迟双删:在服务节点本地缓存库存数据,结合延迟删除策略减少Redis访问。

  • 异步订单处理
    扣库存成功 → 发送消息到MQ → 订单服务消费并生成预订单。
    支付服务异步回调确认,更新订单状态并扣减数据库库存。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/pingmian/84510.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

git撤回commit

最常见的几种撤回方式: 目标使用命令是否保留修改撤回最后一次 commit,但保留代码修改git reset --soft HEAD~1✅ 保留撤回最后一次 commit,并丢弃修改git reset --hard HEAD~1❌ 丢弃撤回某个 commit,但保留后续提交git revert …

docker 安装运行mysql8.4.4

先前一直使用mysql5.7,最新公司新项目,无意翻阅看下5.x版本mysql官方已经不再支持,于是准备选用MySQL8,官方8.4版本是个长期支持版本,选则最新版本8.4.4,如下是MySQL官方对版本支持计划 MySQL版本下载查看地…

[java八股文][MySQL面试篇]索引

索引是什么?有什么好处? 索引类似于书籍的目录,可以减少扫描的数据量,提高查询效率。 如果查询的时候,没有用到索引就会全表扫描,这时候查询的时间复杂度是On如果用到了索引,那么查询的时候&a…

低代码平台的版本管理深度解析

引言 在当今快速发展的软件开发领域,低代码平台凭借其可视化界面和拖拽功能,极大地减少了手动编码的工作量,显著提高了开发效率和质量。它提供了丰富的预构建模块、组件和服务,让开发者能够根据业务需求和逻辑进行组合与配置&…

Springboot项目由JDK8升级至JDK17全过程教程【文末附源码】

1. 前言 最近一直想把我的开源项目maple-boot升级到jdk17版本,然后接入Spring AI。拖延症犯了一直拖拖拖,最近时间空闲较多,开始陆续着手升级。 整个升级过程 计划分为3步。 step1:先将项目升级到jdk17,使用正常ste…

同步与异步:软件工程中的时空艺术与实践智慧-以蜻蜓hr人才系统举例-优雅草卓伊凡

同步与异步:软件工程中的时空艺术与实践智慧-以蜻蜓hr人才系统举例-优雅草卓伊凡 概念解析:时空维度的编程范式 在软件开发的宇宙中,同步(Synchronous)与异步(Asynchronous)是两种根本不同的执行模式,它们塑造了程序与时间和空间…

TF-IDF算法的代码实践应用——关键词提取、文本分类、信息检索

回顾:TF-IDF算法详解与实践总结 上一篇文章我们深入剖析了TF-IDF的原理与细节,但实践才是检验真理的唯一标准!今天,我们将从“纸上谈兵”转向“实战演练”:通过纯Python手写实现与调用sklearn工具包两种方式&#xff0…

前端面试宝典---事件循环面试题

浏览器进程模型与 JavaScript 执行机制 现代浏览器采用多进程架构,包含浏览器进程、渲染进程、网络进程等多个核心进程。每个标签页会独立创建一个渲染进程,负责页面内容的解析、渲染和执行脚本代码。 JavaScript 的单线程特性 JavaScript 采用单线程…

postman调用接口报错401, Unauthorized, Invalid Token. null解决办法

1、先登录系统,F12找到token并复制 2、postman里选中Authorization,下拉选中选择Bearer Token,把复制好的token黏贴到右侧输入框,如下所示: 3、如果是json格式的参数拷贝到Body中,如下所示: 4、 接口调用成功

C++----剖析list

前面学习了vector和string,接下来剖析stl中的list,在数据库中学习过,list逻辑上是连续的,但是存储中是分散的,这是与vector这种数组类型不同的地方。所以list中的元素设置为一个结构体,将list设计成双向的&…

为什么已经有 Nginx 了,还需要服务网关?

在当前微服务架构中,虽然 Nginx 是一个高性能的反向代理和负载均衡服务器,但在实际使用中仍然存在诸多局限性。为了满足运维效率、功能统一治理以及与微服务生态集成的需求,通常会在 Nginx 和业务服务之间引入一层基于 Java 实现的服务网关&a…

Kendo UI 中,ViewModel、DataSource 和 Grid的关系。Kendo 框架发起 HTTP 请求

Kendo UI 中,ViewModel、DataSource 和 Grid的关系 在 Kendo UI 中,ViewModel、DataSource 和 Grid 是构建动态数据应用的核心组件,三者协同工作实现数据的绑定、管理和展示。 一、三者关系图解 #mermaid-svg-3lWxu2zWB23wDYEz {font-family…

宇树开源 Qmini 双足机器人,可通过 3D 打印动手制作,使用树莓派作为主控制器

Unitree Qmini 是一款由宇树科技设计并开源的低成本双足机器人,开发者可以完全通过 3D 打印进行复刻。Qmini 专为业余爱好者、教育工作者和研究人员设计,使用户能够快速上手,并以类似乐高的模块化方式组装自己的机器人。该项目为机器人技术提…

解决华为云服务器无法ping通github问题

在push代码到github上的时候,发现显示22端口无法连接,在已经开放了端口,防火墙关闭的情况下仍然无法连接到GitHub。 发现是服务器和github断连,选择 sudo vim /etc/hosts 添加一下代码 # GitHub Start140.82.121.4 gith…

关于electron-vite koffi 读取 dll 打包等问题得记录

koffi const koffi require(‘koffi’) import iconv from ‘iconv-lite’;const libPath path.resolve(__dirname, ‘…/…/resources/dll/sss.dll’) const yktLib koffi.load(libPath) const ret yktLib.func(‘string sss(string Url, string Data, string OutData)’…

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容

目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…

通过关键字批量抓取淘宝商品数据实现方法途径分享--API

item_search 按关键字搜索淘宝商品item_search_tmall 按关键字搜索天猫商品item_search_pro 高级关键字搜索淘宝商品item_search_img 按图搜索淘宝商品(拍立淘)item_search_shop 获得店铺的所有商品 一、引言 在电商领域,获取淘宝商品数据对…

用 Lazarus IDE 写一个邮件客户端软件,能收发邮件,编写邮件

下面是一个使用Lazarus IDE开发的基本邮件客户端实现方案,包含收发邮件和编写邮件的核心功能。我们将使用Synapse库(跨平台的网络通信库)来处理邮件协议。 步骤1:安装依赖 安装Synapse库: 下载地址:https:…

第二部分-IP及子网划分

目录 一、什么是IP? 1.1.IP地址的由来 1.2.IP地址的表示 1.3.IP地址的构成 1.4.IP地址的分类 1.5.IP地址类型 1.6.IP地址的计算 1.7.私网IP地址 1.8.特殊IP地址 二、子网划分 2.1.什么是子网划分及为什么要进行子网划分? 2.2.如何进行子网划分? 实例: …

【javascript】泡泡龙游戏中反弹和查找匹配算法

引言 泡泡龙游戏的核心玩法依赖于物理碰撞与颜色匹配的算法实现。反弹效果需要模拟泡泡与边界或障碍物的弹性碰撞,确保轨迹符合物理规律;匹配算法则需快速检测相邻同色泡泡,触发消除逻辑。高效的处理方式直接影响游戏流畅度和玩家体验。 以…