秒杀系统的常用架构是什么?怎么设计?
架构
秒杀系统需要单独部署,如果说放在订单服务里面,秒杀的系统压力太大了就会影响正常的用户下单。

常用架构:

Redis 数据倾斜问题
第一步扣减库存时
假设现在有 10 个商品需要秒杀,正常情况下,这 10 个商品应该均匀的分布在 Redis 集群的每个主节点上。商品是通过下图的算法通过商品 id 计算出自己应当在哪个分片并定位到 Redis 的,但是可能由于分片算法不太均匀,导致这 10 个商品都落到了某一个节点上去。
解决:因此我们需要给 Redis 的 key 加一个 hashtag:{redis1},这样 Redis 计算分片时就会用 {} 里的数据来计算。

依旧会有问题(热点 key 问题):假设商品 1 非常火爆,10w 个请求都去秒杀商品 1 ,就会导致其对应的 Redis 扛不住压力。
解决:像这种热门商品应当有预判(如:原价 2000 的商品现在只要 500),提前将该商品的库存均匀的分片在多个 Redis 主节点上。当第一个请求进入时,先判断该商品是不是热点商品,如果是,请求第一个分片。当第二个请求进入时,先判断该商品是不是热点商品,如果是,请求第二个分片。
MQ 消息丢失问题
第二步,扣减库存后,将订单消息发送到 MQ
不同的 MQ 解决方案不同,一个简单通用的方案是:加一张消息发送表,先在消息发送表中记录“待处理”然后再给 MQ 发消息,消费者(下单服务)收到消息生成完订单后,回调发送者(抢购服务)将记录改为“已处理”。
设置一个定时任务,隔一段时间去扫描消息发送表,如果发现有消息一直没有被处理,消息很有可能丢失了,那就重发该消息。但是这种方案可能导致消息的重复发送,消费者需要做幂等处理。
分布式事务方案 – 最终一致性,seata 比较重,很多中小型公司采用这种方案
分布式事务方案 – 最终一致性,seata 比较重,很多中小型公司采用这种方案
消费者如何做幂等处理?
- 如果消费者收到消息时,订单号已经生成了,那只需要判断一下该订单号是否存在即可
- 如果消费者收到消息时没有订单号,订单号是消费者处理消息时通过一些算法(雪花)生成的,就不能直接判断订单号是否存在。
- 可以生成一个标识唯一消息的业务 id
- 可以在下单逻辑处理的第一行代码加上一把分布式锁。直接用 Redis 实现,执行 setnx 命令,关键在于 key 的设计。setnx(userId + productId, value),同一个用户秒杀同一件商品 key 是一样的。
MQ 消息积压怎么解决?
生产者的生产速度远远大于消费者的消费速度,就会导致 MQ 消息积压。
- 增加消费者数量
- 增加消息队列的容量
依旧有可能消息积压,因为 Redis 扣减库存的速度比数据库高几个量级。
解决:假设消费者拿到一条消息,先判断消息的发送时间,如果这条消息的发送时间和当前时间已经超过了一个阈值(1 分钟),那么就认为出现了消息积压,则将这些消息直接放入 Redis。用户查询订单信息会先查 Redis,再查数据库,在 Redis 查到就可以直接返回了。
该消息最终还是得同步到数据库中生成订单,同步完后再从 Redis 里面删除。

如果说超时了太久依旧没有被处理,就直接丢弃掉该消息,提示用户下单失败。
Redis 集群崩溃了如何保证高可用?
- 操作 Redis 时网络不稳定出现瞬断 – 降级
在减库存代码上套一层 try-catch,在 catch 里面重试 1、2 次

- 如果网络瞬断比较长或者 Redis 集群真的崩溃了 – 本地缓存
解决:在抢购服务设置一个本地高速缓存 rocksDB,将下单请求临时存到 rocksDB 里面。然后设置一个定时任务定时去扫描这个缓存,将下单请求重新发送到 Redis 里面。(前提是 Redis 集群能够快速恢复)

库存超卖
主节点扣减库存成功了,但是在同步到从节点前主节点宕机了,从节点被选为了新的主节点,Redis 与数据库数据也不一致了。
- 将 Redis 主从异步同步改为同步同步
- 不使用 Redis 主从,只用 Redis 集群
- 数据库的数据已经为 0 了生成订单不成功
回答:
- 使用并发控制来确保扣减的原子性 — 影响性能
- 在高并发场景下,可以将库存提前预热到 Redis 中,利用 Redis 的原子操作指令扣减库存,后续对于库存的扣减只操作 Redis
- 如果某个商品的访问量比较大,我们可以对这个商品的库存进行拆分,把不同的库存放进不同的库里面,后续对单个数据加锁
相关文章:
秒杀系统的常用架构是什么?怎么设计?
架构 秒杀系统需要单独部署,如果说放在订单服务里面,秒杀的系统压力太大了就会影响正常的用户下单。 常用架构: Redis 数据倾斜问题 第一步扣减库存时 假设现在有 10 个商品需要秒杀,正常情况下,这 10 个商品应该均…...
【文件基础操作】小笔记
Step1: 现在项目文件夹(我的项目叫做RunPony)下创建一个a.txt文本文件,手动写入一些数字,保存 Step2: 现在在main.c内写一个基本的文件处理的程序 Step3: 现在已经知道如何打开关闭文件,下一步要搞懂如何读取txt内的…...
RabbitMQ系列(七)基本概念之Channel
RabbitMQ 中的 Channel(信道) 是客户端与 RabbitMQ 服务器通信的虚拟会话通道,其核心作用在于优化资源利用并提升消息处理效率。以下是其核心机制与功能的详细解析: 一、Channel 的核心定义 虚拟通信链路 Channel 是建立在 TCP 连…...
本地搭建Koodo Reader书库结合内网穿透打造属于自己的移动图书馆
文章目录 前言1. Koodo Reader 功能特点1.1 开源免费1.2 支持众多格式1.3 多平台兼容1.4 多端数据备份同步1.5 多功能阅读体验1.6 界面简洁直观 2. Koodo Reader安装流程2.1 安装Git2.2 安装Node.js2.3 下载koodo reader 3. 安装Cpolar内网穿透3.1 配置公网地址3.2 配置固定公网…...
DeepSeek R1 训练策略4个阶段解析
DeepSeek R1 训练策略解析 DeepSeek R1 训练策略解析1. 冷启动监督微调(Cold Start SFT)**该阶段的主要目标**: 2. 面向推理的强化学习(RL for Reasoning)**该阶段的主要目标**: 3. 拒绝采样和监督微调&…...
【博资考4】网安学院-硕转博考试内容
【博资考4】硕转博考试内容 - 网络安全与基础理论 写在最前面一. **21年硕转博面试内容回顾**网络、逆向、操作系统、攻防、漏洞1. **网络安全常见攻击方式及其防范措施**1.1 **DDoS攻击(分布式拒绝服务)**1.2 **SQL注入攻击**1.3 **XSS攻击(…...
30 分钟从零开始入门 CSS
HTML CSS JS 30分钟从零开始入门拿下 HTML_html教程-CSDN博客 30 分钟从零开始入门 CSS-CSDN博客 JavaScript 指南:从入门到实战开发-CSDN博客 前言 最近也是在复习,把之前没写的博客补起来,之前给大家介绍了 html,现在是 CSS 咯…...
C语言综合案例:学生成绩管理系统
C语言综合案例:学生成绩管理系统 需求 1.存储最多50名学生的信息(不使用结构体) 2.每个学生包含: 学号(字符数组)姓名(字符数组)3门课程成绩(一维数组) …...
使用python做http代理请求
有这样一个需求现在有两台A,B两台电脑组成了一个局域网,在A电脑上开发webjava应用,需要调用第三方接口做http请求,但是这个请求只能在B电脑上请求。 一种解决方案:自定义一个中间服务,在电脑B上运行一个简…...
数据库事务的基本要素(ACID)
数据库事务的基本要素(ACID) 在数据库管理系统(DBMS)中,事务(Transaction)是一个或多个数据库操作的集合,这些操作要么全部成功,要么全部失败。事务的目标是保证数据的一…...
DeepSeek R1满血+火山引擎详细教程
DeepSeek R1满血火山引擎详细教程 一、安装Cherry Studio。 Cherry Studio AI 是一款强大的多模型 AI 助手,支持 iOS、macOS 和 Windows 平台。可以快速切换多个先进的 LLM 模型,提升工作学习效率。下载地址 https://cherry-ai.com/ 认准官网,无强制注册。 这…...
大型语言模型技术对比:阿里Qwen qwq、DeepSeek R1、OpenAI o3与Grok 3
1. 引言 在人工智能(AI)领域中,大型语言模型(Large Language Models,简称LLM)近年来取得了显著的突破。从早期的GPT-3到如今的各种高级模型,这些技术不仅推动了自然语言处理(NLP&am…...
ArcGIS Pro可见性分析:精通地形视线与视域分析
在地理信息系统(GIS)的广泛应用中,可见性分析作为一项关键技术,发挥着不可替代的作用。 无论是城市规划、环境监测,还是军事侦察、景观设计,可见性分析都能提供精确的数据支持,帮助我们更好地理…...
计算机工具基础(五)——Vim
Vim MIT《Missing in CS Class(2020):Class 3》笔记 Vim是终端环境中常用的纯文本编辑器。Vim的默认配置文件位于~/.vimrc 模式 Vim有如下5种模式: 常规模式(Normal):进入Vim后的默认模式,用于阅读文件。以Esc自其他模式中退至此模式插入模…...
Android应用app实现AI电话机器人接打电话
Android应用app实现AI电话机器人接打电话 --安卓AI电话机器人 一、前言 【Dialer3.0智能拨号器】Android版手机app,由于采用蓝牙电话的方式来调用手机SIM卡发起呼叫、接听来电,并接收和处理通话的声音,通常我们以“蓝牙电话方案”来称呼它。 …...
Mobaxterm服务器常用命令(持续更新)
切换文件夹 cd path # for example, cd /gpu03/deeplearning/进入不同GPU ssh mgmt ssh gpu01 ssh gpu03寻找文件位置 find /path -name file_name #for example, find / -name lib #在根目录下搜寻名为lib文件 #for example, find /home/deeplearning -name "lib"…...
Android14窗口管理自适应投屏分辨率
环境 console:/ # cat /proc/version Linux version 6.1.57 (机密信息) (Android (10087095, pgo, bolt, lto, -mlgo, based on r487747c) clang version 17.0.2 (https://android.googlesource.com/toolchain/llvm-project d9f89f4d16663d5012e5c09495f3b30ece3d2362), LLD 17…...
Shot Studio for macOS 发布 1.0.2
Shot Studio 是一个 macOS 的 app,专门为开发者设计,主要用于各大 app 应用商店的预览图设计。 提供了非常多的模板,也预设了很多尺寸。可以直接一键使用 在 1.0.2 这个版本中新增了: 文本渐变 图层:边框、颜色、圆…...
《深度学习实战》第4集:Transformer 架构与自然语言处理(NLP)
《深度学习实战》第4集:Transformer 架构与自然语言处理(NLP) 在自然语言处理(NLP)领域,Transformer 架构的出现彻底改变了传统的序列建模方法。它不仅成为现代 NLP 的核心,还推动了诸如 BERT、…...
Starrocks入门(二)
1、背景:考虑到Starrocks入门这篇文章,安装的是3.0.1版本的SR,参考:Starrocks入门-CSDN博客 但是官网的文档,没有对应3.0.x版本的资料,却有3.2或者3.3或者3.4或者3.1或者2.5版本的资料,不要用较…...
python打卡day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...
关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...
STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
React19源码系列之 事件插件系统
事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...
Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...
鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南
1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...
JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...
[ACTF2020 新生赛]Include 1(php://filter伪协议)
题目 做法 启动靶机,点进去 点进去 查看URL,有 ?fileflag.php说明存在文件包含,原理是php://filter 协议 当它与包含函数结合时,php://filter流会被当作php文件执行。 用php://filter加编码,能让PHP把文件内容…...
libfmt: 现代C++的格式化工具库介绍与酷炫功能
libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库,提供了高效、安全的文本格式化功能,是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全:…...
