低调的12306:中国软件技术难度之最

Python学完工作不好找?看看数据分析可视化都可以做什么 大概一年多以前,和几个小伙伴均认同一个趋势:觉得通过技术手段获取网上越来越丰富的数据,并基于这些数据做分析及可视化,必能产生有价值的结果,帮助大家改善生活。(大数据被叫烂了,所以用低调的方式来解释我们的初心) 第一步:开工,为基金服务 恰巧和几个基金的朋友(包括对冲基金和VC/PE基金)聊到这个趋势,他们非常认同这个观点并愿意付费,认为可以用这种实时且定量的方式来跟踪一些上市公司或者私有公司旗... 阅读详情
AI摘要

本文围绕抢票热潮展开,介绍了12306在旅游热和开学季应对多线程工作的方式,回顾其发展历程及面临的计算和流量压力。详细解读12306出票机制,还对比了12306与文娱票务系统在技术实施、座位机制和商业模式上的差异。

01

“旅游热”+开学季:流动高峰的抢票热潮

“我定了三个闹钟,提前填好预购信息只等放票,结果到点一秒售罄。”来自南京的陈女士很早就规划好了自己的出游行程,虽然对暑期的高峰抢票做足了心理准备,但看准的车次开票秒空还是让她倍感沮丧,“不敢相信一下子所有车票都卖光了,这又不是五一、十一或者春运。”而这样的情形在前一天的试抢中已经上演过一遍,她无奈之下只好提交候补申请。

暑假向来是旅游高峰期,随着开学季临近,各大院校学生的入学报到又为繁忙的铁路系统增加不少运作压力。作为中国铁路客户服务中心推出的官方购票渠道,应对高频的流动高峰已成为12306的常态,它不仅需要面对总量庞大且类别不同的用户群体,协调不同的车次路线和乘车区间,还要在线上线下不同渠道同步余票信息,并保持高效运转。那么12306究竟如何处理多线程工作,并保持复杂而精密的系统运转呢?

图片

“旅游热”+开学季:流动高峰的抢票热潮 

事实上,我们所看到的一秒售空大多是因为12306系统的“区间限售锁票”。放票即售罄并不是真的卖光了,而是系统为了运力最大化,需要先保证长途旅客的席位,让从始发站坐到终点站的全程旅客先买票,在一段时间后,中间站的车票才会按照区间由长到短的先后顺序一一放出。

如果还未轮到短区间放票,长区间旅客已经满席,那么后面的旅客确实无法再抢票,但若尚有余票,短区间的旅客就能通过候补排队的方式顺利订到票,而候补则是按申请的先后顺序处理,因此及时提交候补申请也是抢票的关键。

此外,对于学生返校抢票难的问题,经验丰富的国铁集团也已出台应对之策。8月24日,国铁集团在官网宣布推出“学生预约购票服务”和“学生出行需求采集”两项新功能。 

图片

“学生预约购票服务”入口

“学生预约购票服务”功能是对学生用户提供预售期外预约购票的专用入口,即8月20日至9月8日每日5时至23时,学生用户可以通过该入口预约乘车日期为9月5日至23日的车票。为了满足陪同出行的需求,同一账户除学生本人以外,还可添加最多两位同行人的购票需求。

“学生出行需求采集”功能则是面向学生用户提供出行需求提报服务,即自8月20日至9月23日,学生用户在购票界面输入信息后,若查询结果显示没有购票所需车次、没有中转推荐方案,可点击“中转”页面的“学生出行需求采集”进行需求填报。铁路部门会根据提报的出行需求进行研判,再统筹运力资源来保障需求。    

不仅能在庞大的流量压力下分区间处理需求,还能根据特定情况定制方案和接口,12306的系统究竟有多复杂?    

02

曾被IBM、阿里拒绝的12306

回顾12306的发展历程,其实并非一帆风顺。比起其他软件精美的UI界面和交互设计,12306的单调和古板总给人一种充满“年代感”的印象。2010年春运,12306 网站首次开通并试运行,然而庞大的流量需求远超系统的承受能力,网站随即出现多次瘫痪,随后推出的App客户端也并未逃脱频频崩溃的命运。这一问题虽然在此后几年间有所缓解,但并未得到根治,因此12306一直遭受着诸多吐槽和批评。

12306曾经尝试找企业提供解决方案,但IBM、阿里巴巴等大企业最终均退出了竞标,除了报价成本的问题,关键在于已有的解决方案都不足以应付春运购票负载,于是12306走上了漫漫自研路。

图片

作为全球最大的票务交易系统,12306的复杂程度其实远超人们的想象。在大众近几年的印象里,每年的双十一购物节是最考验系统算力的时刻,但实际上12306所要承载的压力远超购物节,关键原因在于12306的库存计算比京东、淘宝这类电商复杂得多,传统的分布式数据库、缓存、负载均衡技术,根本无法满足12306的需求。   

 一位头部电商资深工程师曾详细讲解过二者的区别,电商平台中,一个商品对应一个SKU(供应链管理中的库存单位),售出一件库存就减1,但12306上的火车票是一种动态的SKU,计算的数据量可达普通电商产品的数百倍。   

例如,始发站与终点站之间一共途经10个站点,一共分为商务座、一等座、二等座3种座位,如果按一般情况计算,这趟高铁只有3个SKU,但实际上却有135个,因为从始发站上车,到后面9个站点分别对应9种车票,从第二个站点上车,到后面8个站点分别对应8种车票,以此类推,就有9+8+7+6+5+4+3+2+1=45种票面,每种票分别对应3种座位,一共就有135种商品。

这只是库存的统计,售出一张票还不能单纯减1,因为短途票旅客可能会在中间站点下车,那么减掉这个SKU后,还要增加这个站点到以后各站的车票库存。在此基础上,再叠加选座功能,以及退票、改签环节的处理,计算数量会再翻倍,而这些复杂的过程还需要在短短数秒内完成。

中国铁道科学研究院集团有限公司首席研究员、12306科创中心副主任单杏花曾指出:“铁路客票系统的余票计算非常复杂,包括客票管理、票价计算、径路计算等,票面信息压缩、加密、存储和读取……网络运算量、信息处理量之大超出想象。”

除了计算难度,流量压力也为12306的技术优化带来不小的挑战。互联网的普及为12306的推广奠定了基础,官网资料显示,目前约九成车票都是通过互联网渠道售出。单杏花曾在采访中提到,2020年春运期间,12306在高峰日网络点击量高达1495亿次,相当于平均1秒就要承受170多万次点击。    

2024年春运,全国铁路日均开行旅客列车较2019年同期增长18.5%,客运能力投放创春运历史新高,全国铁路单日最高加开旅客列车2256列,12306系统单日售票量最高达2091.6万张,页面浏览量最高898.3亿次。其所承受的流量压力可想而知,由此看来,“12306天天都在过双十一”绝非一句戏言。

经过漫长的迭代升级,如今的12306已经鲜有“崩溃”,这主要得益于算法的改进、云端技术的发展、大数据的引入,以及人工智能技术的突破。那么,12306的系统究竟是如何运作的,又是如何一步步进化的呢?这或许得从技术层面来拆解。 

03

年复一年抢票难,12306出票机制解读

从技术上来说,12306整体的系统设计原理是通过分布式集群部署、多层负载均衡和高效容灾手段来保证在极高并发情况下提供正常、稳定的服务,而且12306作为全球最大规模的票务交易系统,其架构设计充满了挑战与创新——不仅要处理日常的海量请求,还要应对特殊日期,比如春节、国庆的运输高峰时段秒杀抢购的场景,因为在这些特殊时期,全国上下几亿人可能会同时在线尝试抢票,给系统带来前所未有的压力。            

为了应对这种高并发流量,12306采用了大型高并发系统架构,系统上层部署了多层负载均衡,包括OSPF、LVS和Nginx等多种技术,这些技术确保了用户请求能够均匀分配到不同的服务器上,避免单点故障和流量拥堵。

其中在负载均衡方面,Nginx起到了重要作用,通过其高性能的HTTP代理和反向代理功能,实现了高效的请求分发,比如Nginx可以根据服务器的性能和负载能力进行加权轮询,从而优化请求的分配,不同服务器按照权重接收请求,确保了系统各部分的均衡负载。

图片

12306的系统构建十分复杂且精细   

此外,12306还采用了全面缓存和队列削峰的技术,缓存服务使用基于内存计算的NoSQL数据库,大幅提升了车票查询的并发能力,使得车票查询速率从一开始的不足1000次/秒,逐步提升至超过20000次/秒,查询响应时间也从1秒缩短到10毫秒。

队列削峰则通过构建交易处理排队系统,先将用户的下单请求排入队列,然后根据后端处理能力异步处理队列中的请求,这样不仅减轻了数据库的压力,也优化了用户体验。

对于订单和库存管理,12306采取了预扣库存方案,该方案首先在本地服务器的内存中扣除库存,然后再异步生成用户订单。这种方式避免了频繁操作数据库接口,提高了单机应对多并发的能力。同时,为了防止服务器宕机导致的问题,系统还在数据库中存储统一库存,并设置了余票系统,确保了高可用性。 

近年来,12306还在持续进行技术创新和架构调整,比如已经实现了异地双活和公私结合的第三代架构,进一步提升了服务的可靠性和用户的购票体验,12306目前依然在持续进化的过程中,其技术和架构的改进也为用户带来了更加稳定和高效的购票服务。

04

演唱会一票难求 技术与商业目的差异性思考

其实对于大多数人来说,对抢票的认知可能源自火车票,但亲身体验往往来自各种演唱会,相对于12306购票系统主要用于铁路客运车票的购买,大麦、猫眼、摩天轮等专注于演唱会等文娱活动的票务服务在技术实施和用户体验上有哪些区别呢?

首先,它们的技术逻辑是共通的,差别其实就是服务器能力的高低而已,这些文娱票务平台的并发处理能力不及12306,但在热门演唱会抢票时也会面临瞬间流量激增的情况,比如像周杰伦的演唱会从来都是一票难求,票务系统常常面临巨大压力。为此,这些平台也逐步优化了其服务器架构和负载均衡技术,甚至临时租用云服务器以提高数据处理效率。 

图片

央视就曾曝光这种一人操作多台设备同时抢票的黄牛手段

其次,文娱票务系统的座位机制明显更复杂,12306的座位分配机制相对简单,用户可根据车次的不同选择不同的座位类型(如硬座、软座、硬卧等),但具体的座位号不能自选,同时退票流程也比较简便。

但文娱票务系统的座位分配复杂得多,因为同一场演唱会的票价和座位位置会大大影响观众的体验,用户在选座时不仅要考虑位置的优劣,还可能遇到“柱子票”等问题,与此同时在退票政策方面,演唱会门票往往存在退票时间窗口严格、退票手续费高等问题,这导致许多消费者在退票时遇到困难。   

当然,12306和文娱票务系统最大的区别就是后者是纯商业平台,换言之它们是需要自负盈亏的,这些平台的盈利模式不仅包括直接的票务销售,还涵盖了广告收入、数据分析服务以及与演出主办方的合作分成等多种方式。三大文娱票务系统里,大麦网作为行业内的领头羊,其商业模式主要围绕官方代理票务和主办方紧密合作展开;猫眼娱乐则以电影票务起家,逐步扩展到其他类型的娱乐票务,商业模式主要包括在线票务服务、娱乐内容服务及电商和广告服务等;而摩天轮票务平台则主要定位于二级票务市场,提供一个供用户购买和销售票务的平台。 

这也让我们不得不思考:12306如果要商业化,它可以在保证基础民生项目属性的情况下,实行哪些玩法呢?

Unity 热更 之 【HybirdCLR】+【YooAsset】 [安卓 Android端] [代码 + 资源热更] 功能的 简单实现演示 Unity热更有很多方案,各种lua热更,ILRuntime等,这里介绍的是YooAsset+HybridCLR的热更方案,HybridCLR负责更新c#代码,YooAsset负责更新资源。HybridCLR是一种创新的解决方案,专为 Unity 游戏开发中的热更新需求设计。它通过结合解释执行和 Ahead-of-Time (AOT) 编译技术,为跨平台的游戏开发提供了一种高效的热更新机制。原生C#热更新体验,开发工作流与传统Unity C#开发几乎相同,零学习和使用成本。 阅读详情

相关推荐

【Unity动画系统】详解Root Motion动画在Unity中的应用(一)

什么时候勾选Bake into pose,当不希望动画带动游戏对象旋转时。在旋转的动画中一般是不用勾选的,因为就需要用它来带动我们的角色对象旋转。但在比如前进、后退、待机等动画来说,我们就可以勾选这里,以避免因动画文件本身的瑕疵而给我们带来的旋转。loop match:代表了这个动画在角度上的吻合度。如果这个动画在播放中转角过大,那么就会显示红色,告诉我们如果勾选bake into pose,则会带来不好的效果。

weixin_60154963的博客 6805

扒一扒12306的开发难度

你知道12306的开发难度到底有多大?今天本博文就来深度扒一扒。

qq_45732829的博客 2489

保姆级教程:用R包ggpicrust2搞定PICRUSt2功能预测,从差异分析到热图PCA一键出图

本文提供了一份详细的ggpicrust2使用指南,帮助用户从零开始完成PICRUSt2功能预测数据的差异分析和可视化。通过安装配置、数据导入、差异分析到高级可视化(如热图和PCA)的全流程讲解,即使是初学者也能快速掌握发表级图表的生成技巧。

weixin_33712987的博客 385

架构必看:12306抢票亿级流量架构演进(图解+秒懂+史上最全)

第一代架构:双机热备模式 2011 年 6 月 12 日,系统投入试运行,发售京津城际 列车车票;2011 年 9 月 30 日,发售全路动车组车票; 2011 年底,发售全路列车车票,互联网正式成为铁 路新的售票渠道。 互联网售票系统设计了缓存服务、用户管理、车票查询、订单及电子客票处理 等多个相对独立的业务分区,以及三级网络安全域, 分别是外网、内网和客票网,系统的体系架构如图 所示: 数据库的维度: 用户管理、车票查询采用了传统的关系型数据库。 其中车票查询业务部署了多套负载均衡工作模

作者:大头兵(kit) 6262

DDR内存条选购避坑指南:单Rank vs 双Rank性能实测对比(附2024年颗粒推荐)

本文深入解析了内存条中单Rank与双Rank设计的原理与性能差异。通过实战测试对比,揭示了双Rank内存在高负载场景(如3D渲染、视频剪辑)中凭借Rank Interleaving技术带来的显著性能优势,并提供了2024年针对不同用户需求的DDR4/DDR5内存选购策略与避坑指南。

ik678901的博客 1130

OmniDrive(3):逐行代码详解

模型效果: 端到端联合规划与推理 接下来,简单介绍下训练的配置 1.1 模型配置 模型基于sparse query based的3D Bev感知框架StreamPetr ,用query来编码动态目标(如车辆、行人)和静态地图元素(如车道线)。(1) tran、test和val数据配置 指定真值的文件路径: ann_file 指定输出处理的pipeline: 训练使用, test 和val使用 指定是否需要时序训练seq_mode (2)数据处理pipeline 自定义的Dataset 通过类实现,训

@bangbang的博客 719

12360抢票java代码

12306是中国铁路客户服务中心提供的订票服务平台,每逢节假日、热门线路或者新上线车票的时候,往往一票难求。本文将使用Java编写一个12306抢票程序,帮助大家提高抢票效率。

qq_31532979的贺公子之数据科学与艺术博客,致力于科技向善,拥抱开源,要用技术的影响力来领导团队,而不是威权和职位! 1521

LVGL misc timer 定时器(lv_timer.c)

定时器机制是LVGL中非常重要的一项功能,它承载了LVGL的延时任务执行,周期任务执行,时序任务执行等,可以说理解定时器的设计就一定程度上理解发LVGL的任务调度机制。

Bigan(安)的博客 4730

12306抢票系统!最新版

思路就介绍到这里,主要是利用splinter框架,模拟浏览器,自动刷新抢预订票,然后发送飞书通知,提醒付款,欢迎大家一起来讨论,并且提出更好的想法。

gerouhsius的博客 2732

第三章-python基础语法

有C语言基础应该这样学 Python。

qq_46187594的博客 1176

【unity实战】Unity游戏开发:如何用ScriptableObject与序列化多态实现可复用的模块化效果系统?

本文介绍了两种实现卡牌游戏效果系统的模块化设计方案。方案一使用ScriptableObject创建独立的效果资产,通过组合实现不同效果,优点是数据可复用、可视化编辑,缺点是同类不同参数效果需创建大量SO文件。方案二利用SerializeReference特性直接嵌套效果实例,避免SO文件过多,但需要插件支持编辑器多态显示。两种方案都将效果与卡牌解耦,提高了代码复用性和扩展性,解决了硬编码带来的重复、维护困难和扩展不便等问题。开发者可根据项目需求选择合适方案,或结合两者优势构建更灵活的系统。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 436

特朗普出手了!甲骨文微软等“抢购” TikTok

↓推荐关注↓据美国国家公共广播电台(NPR)周六“爆料”,特朗普政府正在捣鼓一个“拯救 TikTok 大计划”,主角是甲骨文(Oracle)和一帮外部投资者,目标是“接管”TikTok 的全球运营大权。NPR 透露,根据白宫正在谈判的交易,TikTok 的中国老东家字节跳动虽然还能保留点“小股份”,但 TikTok 的算法、数据收集和软件更新都得听甲骨文的指挥。甲骨文可不是新手,它早就为 TikT...

程序员的那些事 450

华为OD机试真题 新系统 2026-06-10 C++ 实现【设备重排SN】

通信设备SN一般是包含:字母、数字,用'-'(破折号)进行分组分割,例如:8F-3T-1G-2n是一个有效的SN地址。 现在要对已经存在的SN 按照新的规则进行重排:

MISAYAONE的博客 129

突发!Tiktok 没“凉”到 12 小时,又“满血复活”了

↓推荐关注↓0、Tiktok 有点“凉”美国时间 1 月 18 日晚上,TikTok 用户一打开 App,突然蹦出个弹窗,大意是:“哎,真遗憾,美国法律从 1 月 19 日起就要封杀 TikTok 了,我们正在拼命想办法尽快恢复服务,大家别急哈!”结果没过多久,用户们再点开 TikTok 时,发现这 App 有点“凉凉”了。又弹出一条新消息,大意是:“抱歉啊,TikTok 现在用不了了,法律不让咱...

程序员的那些事 561

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

python能做什么工作-Python学完工作不好找?看看数据分析可视化都可以做什么

大概一年多以前,和几个小伙伴均认同一个趋势:觉得通过技术手段获取网上越来越丰富的数据,并基于这些数据做分析及可视化,必能产生有价值的结果,帮助大家改善生活。(大数据被叫烂了,所以用低调的方式来解释我们的初心)第一步:开工,为基金服务恰巧和几个基金的朋友(包括对冲基金和VC/PE基金)聊到这个趋势,他们非常认同这个观点并愿意付费,认为可以用这种实时且定量的方式来跟踪一些上市公司或者私有公司旗下的产品...

q6q6q的专栏 335

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

python可以干什么工作-Python学完工作不好找?看看数据分析可视化都可以做什么...

大概一年多以前,和几个小伙伴均认同一个趋势:觉得通过技术手段获取网上越来越丰富的数据,并基于这些数据做分析及可视化,必能产生有价值的结果,帮助大家改善生活。(大数据被叫烂了,所以用低调的方式来解释我们的初心)第一步:开工,为基金服务恰巧和几个基金的朋友(包括对冲基金和VC/PE基金)聊到这个趋势,他们非常认同这个观点并愿意付费,认为可以用这种实时且定量的方式来跟踪一些上市公司或者私有公司旗下的产品...

weixin_37988176的博客 249

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

上一篇: 亲自上阵!C++ 大佬深度“剧透”:C++26 将如何在代码生成上对抗 Rust?
下一篇: 淘宝程序员是不是没活硬整?
IT界那些事儿
博客等级 码龄6年 2万+粉丝 22原创
评论 8
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值