12306购票如何做到限流的,什么技术方案,mq吗,提示排队过多,请稍微重试,提示库存不足。具体实现细节是怎么样的
12306(中国铁路客户服务中心)的购票系统是一个典型的高并发、高流量的系统。在春运和节假日等高峰期间,购票需求量极大,用户的请求频繁且集中,系统必须通过多种技术手段来进行 限流 和 负载均衡,确保购票服务的稳定性与可靠性。以下是12306购票系统实现限流的技术方案和细节。
1. 限流与排队
12306的购票系统通过一些方式来管理用户请求,避免因过多的并发请求导致系统崩溃或响应过慢。以下是主要的限流机制:
1.1 用户排队机制
当大量用户同时访问12306时,为了避免系统过载,12306采用了排队机制。用户在访问购票系统时,如果请求量超过了系统处理能力,用户会被引导到一个虚拟的“排队页面”。这个页面展示了排队人数和预计等待时间。
- 排队逻辑:当请求到达12306时,系统根据请求的并发量和当前系统负载,决定是否将该请求加入排队队列。系统会按照排队顺序逐一处理请求,确保每个请求都能获得处理,但不会让过多请求直接打到后台数据库和核心服务上。
- 动态调整排队人数:根据系统的实时负载,排队页面的提示信息会不断调整,给用户实时反馈。例如,如果负载较高,系统可能会提示排队人数过多,建议稍后重试。
1.2 令牌桶与漏桶算法
为了控制请求的流量,12306可能会使用流行的 令牌桶算法(Token Bucket)和 漏桶算法(Leaky Bucket)等限流算法。这些算法能够控制单位时间内进入系统的请求数量,防止瞬时流量过大。
- 令牌桶算法:请求进入系统前,先要从桶中获取令牌。如果令牌桶为空,则请求会被延迟或者丢弃,避免系统过载。令牌桶有固定的速率生成令牌,从而控制系统的负载。
- 漏桶算法:类似于令牌桶,漏桶算法也有流量限制的作用。它规定每秒能够处理的请求量,如果超过了设定的速率,超出的请求将被丢弃或者延迟,确保系统在高并发时能够平稳运行。
1.3 滑动窗口
12306也可能使用 滑动窗口算法,这是另一种限流的常用手段。它允许系统在一定时间窗口内处理一定数量的请求,超出部分会被限制。
- 实现方式:例如,系统可能允许每个IP或每个用户在10秒内最多发起5个请求,10秒后,窗口会重新计算,清除过期的请求,允许新的请求进来。
2. 消息队列(MQ)
为了处理高并发场景,12306可能会使用 消息队列(MQ) 来解耦前端请求和后台业务处理。通过引入消息队列,系统可以将一些非实时的业务处理异步化,避免过多的并发请求直接打到数据库和核心服务上。
-
具体流程:
- 当用户提交购票请求时,前端系统将请求放入消息队列(如 RabbitMQ 或 Kafka)中。
- 后端系统从消息队列中异步获取请求,按照队列中的顺序逐一处理。这种方式避免了直接对数据库和核心系统进行高并发访问,减轻了系统压力。
- 消息队列通常配合 消费者 和 生产者 模式,消费者按一定速率消费消息,避免过度消费。
-
优势:
- 解耦:前端系统与后端系统通过消息队列解耦,避免了直接通信导致的性能瓶颈。
- 流量削峰:消息队列能有效分散请求负载,在高并发时能将请求缓存在队列中,平缓流量波动。
- 异步处理:部分购票业务(如发票生成、支付验证等)可以通过异步方式处理,避免阻塞主流程。
3. 库存校验与“库存不足”提示
购票时,12306需要实时查询票务库存并做库存校验。在高并发下,系统会面临 库存不足 的情况,这时会向用户显示“库存不足”的提示。其具体实现细节如下:
3.1 分布式锁与数据一致性
为了确保多个用户在同一时刻不会同时购买到同一张票,12306通常会使用 分布式锁 来保证同一时刻只有一个请求能够修改库存。
- 分布式锁的实现:12306可能使用 Redis、ZooKeeper 等分布式存储系统来实现分布式锁。每次用户请求购票时,系统会首先获得锁,确保在锁释放之前其他请求无法修改库存信息。
- 锁粒度:为了提高并发效率,分布式锁的粒度通常会做得比较精细,可能会按照车次、时间段等维度来进行锁定,而不是整个库存。
3.2 库存同步与实时更新
12306系统需要实时更新票务库存信息,并且保持高并发下的数据一致性。系统通常使用 缓存(如 Redis)来存储票务信息,减少数据库查询压力。
- 库存缓存:在高并发请求下,Redis等缓存系统能迅速提供库存数据,避免数据库成为瓶颈。
- 异步更新:当库存发生变化时,系统会异步更新数据库中的真实数据,保证数据库的最终一致性。Redis的缓存会有过期机制,确保库存信息的准确性。
3.3 最终一致性
在高并发情况下,库存的实时更新可能会存在一定的延迟或数据不一致问题,因此12306需要使用 最终一致性 的策略。在实际操作中,票务的库存减少是通过一系列异步处理和检查机制来保证的,确保最终的库存状态准确。
4. “排队过多,请稍后重试”
当用户在排队过程中,系统发现用户请求的并发量已经过高,无法继续处理时,可能会提示“排队过多,请稍后重试”。
- 具体原因:这种情况通常发生在系统的并发请求达到极限时,服务器通过限流策略控制系统流量。此时,用户请求被暂时拒绝,提示用户稍后再试,减少系统的压力。
- 技术实现:这种提示通常与 滑动窗口 或 令牌桶 算法等限流策略密切相关。当流量过高时,用户的请求会被暂时拒绝,给出排队信息,等待流量恢复后再进行请求。
总结
12306购票系统的限流和流量控制是一个复杂的技术体系,结合了多种技术来保证系统的高并发处理能力,避免系统崩溃或性能瓶颈。主要包括:
- 排队机制:将用户请求排队处理,避免高并发直接冲击后台。
- 限流算法:令牌桶、漏桶和滑动窗口等算法控制系统流量,避免过载。
- 消息队列:使用消息队列异步处理购票请求,减轻系统压力,平滑流量。
- 库存校验与分布式锁:确保库存的实时更新和一致性,避免超卖情况。
- 最终一致性:在高并发时确保数据的一致性,使用缓存和异步处理策略提高效率。
通过这些技术手段,12306系统能够有效应对大量用户的并发访问,保证购票流程的稳定性和准确性。
相关文章:
12306购票如何做到限流的,什么技术方案,mq吗,提示排队过多,请稍微重试,提示库存不足。具体实现细节是怎么样的
12306(中国铁路客户服务中心)的购票系统是一个典型的高并发、高流量的系统。在春运和节假日等高峰期间,购票需求量极大,用户的请求频繁且集中,系统必须通过多种技术手段来进行 限流 和 负载均衡,确保购票服…...
[irisctf 2025] kittycrypt knutsacque
作了俩题还有一个不对。 KittyCrypt 题目给了加密代码,样例和密文。密钥通过样例求出。 package mainimport ("crypto/rand""encoding/hex""encoding/json""fmt""math/big""os""strings"…...
数据结构(1~10)
(1)双栈 #include <iostream> #include <algorithm> using namespace std; // 定义栈元素的类型 typedef int SElemType;// 定义双栈数据结构 typedef struct {int top[2];int bot[2];SElemType *V;int m; } DblStack;// 初始化双栈 void I…...
Solidity合约编写(一)
Solidity IDE地址:Remix - Ethereum IDE 点击进入后在contract文件夹下创建合约 合约代码如下: // SPDX-License-Identifier: MIT pragma solidity ^0.8.26;contract SimpleStorage{bool hasFavorNumtrue;uint256 favorNum5;string favorNums"fiv…...
基于氢氧燃料电池的分布式三相电力系统Simulink建模与仿真
目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于氢氧燃料电池的分布式三相电力系统Simulink建模与仿真,仿真输出燃料电池中氢氧元素含量变化以及生成的H2O变化情况。 2.系统仿真结果 3.核心程序与模型 版本…...
【C/C++】nlohmann::json从文件读取json,并进行解析打印,实例DEMO
使用 json::parse 函数将JSON格式的字符串解析为 nlohmann::json 对象。这个函数支持多种输入源,包括字符串、文件流等。 #include <iostream> #include <nlohmann/json.hpp> #include <fstream>using json nlohmann::json;int main() {// 解析…...
鸿蒙Flutter实战:15-Flutter引擎Impeller鸿蒙化、性能优化与未来
Flutter 技术原理 Flutter 是一个主流的跨平台应用开发框架,基于 Dart 语言开发 UI 界面,它将描述界面的 Dart 代码直接编译成机器码,并使用渲染引擎调用 GPU/CPU 渲染。 渲染引擎的优势 使用自己的渲染引擎,这也是 Flutter 与其…...
华为交换机---自动备份配置到指定ftp/sftp服务器
华为交换机—自动备份配置到指定ftp服务器 需求 交换机配置修改后及时备份相关配置,每次配置变化后需要在1分钟后自动进行保存,并且将配置上传至FTP服务器;每隔30分钟,交换机自动把配置上传到FTP服务器。 1、定时保存新配置的时间间隔为*分钟(1天=1440),默认为30分钟(…...
dns网址和ip是一一对应的吗?
DNS网址和IP地址是一一对应的吗?我们在上网时,为什么总是使用网址而不是一串数字?这些问题其实涉及到互联网的基本运作原理。DNS(域名系统)是我们日常上网过程中一个不可或缺的部分,它帮助我们将人类易于记…...
Couchbase 和数据湖技术的区别、联系和相关性分析
Couchbase 和数据湖技术(如 Delta Lake、Apache Hudi、Apache Iceberg)分别是两类不同的数据存储与管理系统,但它们也可以在特定场景中结合使用,以下是它们的区别、联系和相关性分析: 区别: 1. 核心用途&a…...
微信小程序提示 miniprogram-recycle-view 引入失败
npm i --save miniprogram-recycle-view 安装需要使用的页面的json文件中配置 {"usingComponents": {"recycle-view": "miniprogram-recycle-view/recycle-view","recycle-item": "miniprogram-recycle-view/recycle-item"…...
RAG_Techniques合集
Github 專案RAG_Techniques 列出了所有想得到的RAG最佳實踐和技巧!以下是完整的目錄,內容豐富到不行!💡 Simple RAG 🌱Context Enrichment Techniques 📝Multi-faceted Filtering 🔍Fusion Ret…...
泊松融合 实例2025
目录 例子1: 实现代码: 原作者代码: 本博客直接给出来最好的效果和源代码 参数说明: 效果不好,不推荐的参数:MONOCHROME_TRANSFER,NORMAL_CLONE 例子1: 目标图: 原图: 效果图: 实现代码: 坐标是要目标图上中心点坐标: import cv2if __na...
反直觉导致卡关-迫击炮谜题
这个谜题,在两周目中先后卡了我至少三个小时,先后缓慢装填并发射迫击炮弹尝试了数百次。 一周目卡了很久,稀里糊涂的过了,想不到二周目还会卡那么久。 研究了很多播主的攻略,但还是一头雾水, 直到分析其…...
Vue2
前几篇和大家分享了Vue2基础篇,现在和大家分享一下Vue2的进阶篇 普通组件的注册: 局部组件:只能在注册的组件内使用 1.创建vue文件 三部分组成 2在使用的组件内部导入并且注册 全局组件:所有组件内部都可以用 组件的三大组成部分 结构&…...
PDF文件提示-文档无法打印-的解决办法
背景信息 下载了几个签名的PDF文件,想要打印纸质版,结果打印时 Adobe Acrobat Reader 提示【文档无法打印】: 解决办法 网上的方案是使用老版本的PDF阅读器, 因为无法打印只是一个标识而已。 PDF文件不能打印的五种解决方案-zhihu 这些方…...
C语言进阶(3)--字符函数和字符串函数
本章重点 重点介绍处理字符和字符串的库函数的使用和注意事项 目录 0.前言 1.函数介绍 1.1 strlen - 计算字符串长度 1.2 strcpy - 复制字符串 1.3 strcat - 追加字符串 1.4 strcmp - 字符串比较 1.5 strncpy - 受限制复制 1.6 strncat - 受限制追加 1.7 strncmp - 受限制比…...
英文词汇解析:“Arguably“ 的用法与含义
中文版 英文词汇解析:“Arguably” 的用法与含义 在英语中,“arguably” 是一个常用的副词,用来表达某种观点可能是正确的,尽管它可能存在争议或需要进一步讨论。它通常用于陈述观点或看法时,给出一种有依据但又留有…...
Win 11 拷贝文件失败,错误0x800704C8: 请求的操作无法在使用用户映射区域打开的文件上执行。
手机拷贝照片到电脑,再把电脑的照片拷贝到移动硬盘的过程报错。 一个意外错误使你无法移动该文件。如果你继续收到此错误,可以使用错误代码来搜索有关此问题的帮助。 错误 0x800704C8: 请求的操作无法在使用用户映射区域打开的文件上执行。 解释…...
SpringBoot原理分析-1
SpringBoot原理分析 作为一个javaer,和boot打交道是很常见的吧。熟悉boot的人都会知道,启动一个springboot应用,就是用鼠标点一下启动main方法,然后等着就行了。我们来看看这个main里面。 SpringBootApplication public class E…...
我用Ai学Android Jetpack Compose之Button
答案来自 通义千问,代码同样需要到Android Studio里实践,才能学会。 我要学Button,麻烦介绍一下 当然可以!Button 是 Jetpack Compose 中用于创建可点击按钮的 Composable 函数。它提供了丰富的配置选项来定制按钮的外观和行为。…...
《量子比特:解锁人工智能并行计算加速的密钥》
在科技飞速发展的今天,量子计算与人工智能的融合正成为一股强大的力量,为诸多领域带来变革性的突破。量子比特作为量子计算的核心要素,其独特的叠加和纠缠特性为人工智能算法实现并行计算加速提供了前所未有的机遇。 量子比特的叠加特性&…...
【SpringBoot】当 @PathVariable 遇到 /,如何处理
1. 问题复现 在解析一个 URL 时,我们经常会使用 PathVariable 这个注解。例如我们会经常见到如下风格的代码: RestController Slf4j public class HelloWorldController {RequestMapping(path "/hi1/{name}", method RequestMethod.GET)publ…...
用QT实现 端口扫描工具1
安装在线QT,尽量是完整地自己进行安装,不然会少包 参考【保姆级图文教程】QT下载、安装、入门、配置VS Qt环境-CSDN博客 临时存储空间不够。 Windows系统通常会使用C盘来存储临时文件。 修改临时文件存储位置 打开系统属性: 右键点击“此电…...
基于单片机的肺功能MVV简单测算
肺功能MVV一般是指肺部每分钟的最大通气量。 MVV本身是最大值的英文缩写,在临床上,肺功能MVV表示肺部每分钟最大通气量,用以衡量气道的通畅度,以及肺部和胸廓的弹性、呼吸肌的力量。 肺部每分钟的最大通气量的参考值男性与女性之…...
入手STM32单片机学习指南
目录 引言 一、基础概念 1.1 STM32单片机简介 1.2 ARM Cortex-M系列处理器 1.3 微控制器的基本组成 二、开发环境搭建 2.1 选择开发板 2.2 安装开发软件 2.3 配置开发环境 三、编程入门 3.1 GPIO编程 3.2 UART编程 3.3 ADC编程 引言 STM32单片机是基于ARM Cortex…...
无法定位软件包cuda
无法定位软件包cuda 如果你在使用 sudo apt install cuda 命令安装 CUDA 时遇到“无法定位软件包cuda”的问题,这可能是由于你的系统没有正确配置 CUDA 的安装源。以下是一些可能的解决方案: 更新 Ubuntu 软件源并升级到最新版本的软件包。你可以选择使…...
GWAS数据和软件下载
这部分主要是数据获取,以及软件配置方法。 一、配套数据和代码 数据和代码目前在不断的更新,最新的教程可以私信,我通过后手动发送最新版的pdf和数据代码。发送的压缩包,有电子版的pdf和数据下载链接,里面是最新的百度网盘的地址,下载到本地即可。然后根据pdf教程,结合配套的…...
SpringBoot3-深入理解自动配置类的原理(尚硅谷SpringBoot3-雷神)
文章目录 目录了解自动配置 一、导入对应场景的Mean依赖:1、引入依赖**找到自动配置类的所有配置都存放在哪里** 二、编写主程序:SpringBootApplication观察源码时所需要知道的几个核心注解:1、观察SpringBootApplication源码都做了什么 三、…...
MOE怎样划分不同专家
MOE怎样划分不同专家 目录 MOE怎样划分不同专家MOE划分不同专家的方法LLM模型拆分的方法**子模块拆分法**:**多头拆分法**:**层间拆分法****基于功能的拆分法**Python代码实现MOE划分不同专家以及LLM模型拆分的方法及举例如下: MOE划分不同专家的方法 ffn前馈神经网络 独立…...
NLP CH3复习
CH3 3.1 几种损失函数 3.2 激活函数性质 3.3 哪几种激活函数会发生梯度消失 3.4 为什么会梯度消失 3.5 如何解决梯度消失和过拟合 3.6 梯度下降的区别 3.6.1 梯度下降(GD) 全批量:在每次迭代中使用全部数据来计算损失函数的梯度。计算成本…...
Pyecharts SVG 标记使用笔记
Pyecharts SVG 标记使用笔记 在数据可视化中,图表的标记点常常用于突出显示重要数据点。Pyecharts 提供了丰富的标记点配置选项,其中使用 SVG 路径来自定义标记点的样式是一个非常强大的功能。本文将详细介绍如何在 Pyecharts 中使用 SVG 路径来定制标记…...
C++ 文件操作
文件操作 // 文件操作 // 程序运行时产生的数据都属于临时数据,程序结束后临时数据会被操作系统释放 // 通过文件操作可以将数据持久化 // c 中文件操作需要包含头文件 <fstream>// 文件类型分为两种: // 文本文件: 文件以文本的ASCII…...
享元模式详解
享元模式详解 一、定义 享元模式(Flyweight Pattern)是一种结构型设计模式,旨在通过共享对象来尽量减少内存的使用。它通过将重复使用的对象分离成共享和非共享部分,达到复用的目的,从而有效节省内存。具体来说&#x…...
数据库中的并发控制
并发操作带来的数据不一致性 1、并发控制:为了保证事务的隔离性和一致性,数据库管理系统需要对并发操作进行正确调度 并发控制的主要技术有:封锁、时间戳、乐观控制法、多版本并发控制等 并发操作带来的数据不一致性: ① 丟失修改:两个事务 T1 和 T2 读入同一数据…...
【软考网工笔记】计算机基础理论与安全——计算机硬件知识
计算机分级存储体系 计算机分级存储体系目前最常用的是三级存储体系。 CPU——CaChe(高速缓存)——主存——辅存 其中 Cache 是用于解决存取速度不够快,辅存是用于解决存储容量不够大,二者结合可在容量和速度实现提升的情况下尽可…...
SpringBoot 多种生产打包方式详解
Springboot 多种生产打包方式简介 生产上发布 Spring Boot 项目时,流程颇为繁琐且低效。但凡代码有一丁点改动,就得把整个项目重新打包部署,耗时费力不说,生成的 JAR 包还特别臃肿,体积庞大。每次更新项目,…...
WebSocket 安全实践:从认证到加密
在前三篇文章中,我们深入探讨了 WebSocket 的基础原理、服务端开发和客户端实现。今天,让我们把重点放在安全性上,看看如何构建一个安全可靠的 WebSocket 应用。我曾在一个金融项目中,通过实施多层安全机制,成功防御了多次恶意攻击尝试。 安全挑战 WebSocket 应用面临的主要安…...
实现单例模式的五种方式
如何实现一个单例 1、构造器需要私有化 2、提供一个私有的静态变量 3、暴露一个公共的获取单例对象的接口 需要考虑的两个问题 1、是否支持懒加载 2、是否线程安全 1、饿汉式 public class EagerSingleton {private static final EagerSingleton INSTANCE new EagerSi…...
【Go学习】-01-6-数据库泛型新特性
【Go学习】-01-6-数据库泛型新特性 1 数据库操作1.1 操作mysql1.1.1 Insert1.1.2 Select1.1.3 Update1.1.4 Delete1.1.5 sql事务 1.2 go操作Redis 2 泛型2.1 非泛型函数2.2 泛型函数2.3 泛型类型2.3.1 泛型结构体2.3.2 泛型接口 2.4 泛型约束2.5 泛型切片和映射2.5.1 泛型切片2…...
算法学习(22)—— BFS解决最短路问题
关于最短路问题 最短路问题是“图论”里非常重要的一类问题,涉及的内容非常多,在这个专题里,我们主要讲“边权为1的最短路问题”,因为这个比较基础比较简单而关于啥是“边权为1的最短路问题”,我们通过下面的例子来讲…...
【双层模型】考虑供需双侧的综合能源双层优化模型
目录 主要内容 内容研究 1.模型简介 2 程序释义 部分代码 运行结果 下载链接 主要内容 该程序实现一个综合能源系统的优化调度双层模型,上下层分别采用差分进化算法和规划算法进行求解。模型考虑了多种能源设备,包括燃气轮机、燃气锅炉、风电…...
【读书笔记/源码】How Tomcat Works 笔记- c11~c13
chapter11: standardwrapperchapter12: 无程序 第十章 安全性 servlet容器是通过一个名为验证器的阀来支持安全限制的。当servlet容器启动时,验证器阀会被添加到Context容器的管道中。 验证器阀会调用Context容器的领域对象的authenticate()方法,传入…...
Electron快速入门——跨平台桌面端应用开发框架
个人简介 👀个人主页: 前端杂货铺 🙋♂️学习方向: 主攻前端方向,正逐渐往全干发展 📃个人状态: 研发工程师,现效力于中国工业软件事业 🚀人生格言: 积跬步…...
Vision Transformer模型详解(附pytorch实现)
写在前面 最近,我在学习Transformer模型在图像领域的应用。图像处理任务一直以来都是深度学习领域的重要研究方向,而传统的卷积神经网络已在许多任务中取得了显著的成绩。然而,近年来,Transformer模型由于其在自然语言处理中的成…...
中国区域创新创业指数IRIEC数据(省级、地市级)1990-2020年-社科数据
中国区域创新创业指数IRIEC数据(省级、地市级)1990-2020年-社科数据https://download.csdn.net/download/paofuluolijiang/90028728 https://download.csdn.net/download/paofuluolijiang/90028728 中国区域创新创业指数(IRIEC)…...
Elasticsearch:减少 Elastic 容器镜像中的 CVE(常见的漏洞和暴露)
作者:来自 Elastic Maxime Greau 在这篇博文中,我们将讨论如何通过在 Elastic 产品中切换到最小基础镜像并优化可扩展漏洞管理程序的工作流程来显著减少 Elastic 容器镜像中的常见漏洞和暴露 (Common Vulnerabilities and Exposures - CVEs)。 基于 Chai…...
webpack02
webpack中常用loader postcss-loader 在css-loader之前,对css进行一些操作,,,比如统一加前缀,,或者是重置样式,,, 这个postcss-loader会自己去找 postcss工具࿰…...
腾讯云更改用户为root
最近买了台99元一年的2核的云服务器,方便学习一些java开发中间件,以及部署一些项目。 1.设置root用户密码 sudo passwd root 2.修改配置文件 ll /etc | grep ssh cd /etc/ssh/ ls vim sshd_config 输入/PasswordAuthentication 寻找 输入:set nu 再按下…...
Excel导入导出-若依版本
最终效果 1、导出 1、在实体类上加注解 Excel(name “客户类型名称”) ToString AllArgsConstructor NoArgsConstructor public class UserType extends BaseEntity2 implements Serializable {Excel(name "客户类型ID", cellType Excel.ColumnType.NUMERIC…...