切换到宽版
 找回密码
 立即注册

QQ登录

只需一步,快速开始

西秦会馆

爆料、咨询:18909006163
广告、合作:13990030637
查看: 16895 | 回复: 0

[盐都杂谈] 表面是个卖票软件!12306一天1500亿次访问,真正厉害的还在后面

[复制链接]

1051

主题

1088

帖子

0

听众

Rank: 10Rank: 10

积分
6809
威望
1051 点
铜板
3619 枚
西秦金币
0 个
鲜花
0 朵

在线时间
13 小时
注册时间
2023-10-21
发表于 昨天 22:37 | 显示全部楼层 |阅读模式 | 来自四川
表面是个卖票软件!12306一天1500亿次访问,真正厉害的还在后面

大家都抢过火车票吧?春节、国庆……一到节点,提前好多天就打开软件反复刷新,甚至调好几个闹钟就为了准点抢票。

但你了解我们抢票的这个APP“12306”吗?

统计显示,它的最高日访问量超过1500亿次,相当于每秒170多万次,日售票能力达到1500万张。

可以说,它是全球规模最大、处理能力最强的铁路票务系统,没有之一。

但在十几年前,它还是中国互联网史上被骂得最惨的产品。



骂到什么程度呢?骂到被央视多平台反复报道、铁道部副部长就网站运行问题向公众致歉,整个互联网都把它当反面教材。

从“最蠢”到“最强”,这中间发生了什么?

今天,我们就来聊聊这个神奇的网站——12306。

一.它到底难在哪?

2011年6月12日,京津城际铁路开始实行网络售票,到年底,网络售票全面推行。

在那之前,中国人买火车票主要靠两种方式,要么去车站窗口排队,要么去代售点买。每到春运,全国几千个车站门口很多是绵延数百米甚至几公里的长队,有人裹着棉被在寒风中排队过夜,有人为了一张票大打出手。



铁道部上线网上售票,本意是缓解这种地狱级的购票场景。但谁也没料到,这个系统从第一天起,就变成了全民笑料。

打开网站,加载半小时;好不容易加载出来,登录不上去;登录上了,搜索不到票;搜索到了,点击购买就报错;终于付款了,订单却丢失了;订单找到了,票又出不来。每一个环节都能给你制造一个新的痛点。

最魔幻的是支付环节,有些用户付了钱,系统显示购票失败,但银行短信又显示扣款成功。

到了2012年春运,12306的崩溃达到了顶峰。春节前几天,整个网站几乎处于半瘫痪状态。每天放票时刻,系统在那两分钟里基本就是死的。无数人守着电脑、握着鼠标,对着卡死的页面欲哭无泪。

社会舆论已经不是抱怨了,是真正的愤怒。有人质疑铁道部腐败,有人怀疑系统被故意做烂以便给黄牛留生意,有人甚至给中央写信要求彻查12306的开发团队。

2012年1月,时任铁道部副部长胡亚东在国务院新闻发布会上,就12306运行不畅及春运买票难问题向公众致歉。



但有人可能会有疑问。同一个时代,淘宝双十一的时候几亿人涌进去抢购,系统没崩。后来的微信春节抢红包几十亿次的点击,系统也没崩。为什么偏偏12306做成了这个样子?

要回答这个问题,得先搞明白12306面对的,到底是个什么级别的技术怪兽。

绝大多数人对12306有一个根本性的误解,以为它就是个加了支付功能的查询网站。但实际上,12306跟淘宝、京东、包括全世界任何一个电商系统,本质上都不是一种东西。

淘宝卖一件衣服,库存100件,用户买了一件,库存就减一。系统只需要保证库存数字不出错就行。剩下的99件、98件、97件,这件衣服本身没有任何变化。

但12306卖票,每一张票背后都是一个极其复杂的运算过程。



一列从北京南站到上海虹桥站的高铁G149次,中间要经过北京南、沧州西、济南西、南京南、常州北、无锡东、苏州北等十几个站。每两个站之间都是一个独立的“商品”。同一个座位,可以卖给北京南到济南西的乘客,可以卖给济南西到南京南的乘客,可以卖给南京南到上海虹桥的乘客。这三个人坐的是同一个座位,但他们买的是三张不同的票,付的钱也不一样。

而当一个北京到上海的乘客买了全程票,这个座位就在整个旅程中都被占用了。意味着——北京到济南的余票要减一,济南到南京的余票要减一,南京到上海、北京到南京、济南到上海的余票都要减一……一辆车如果有20个停靠站,理论上能产生的票务组合是190种。每卖出一张票,系统要在毫秒之内把所有受影响的区间余票同步更新一遍。

有人可能觉得,好像这样也不是很难?

但要知道,一辆列车有十几个车厢,每个车厢上百个座位,而全国铁路网每天运行的列车有上万列。这些数据要全部实时联动,一处变动,全国同步。



这是一个被严重低估的计算难题。淘宝、亚马逊这类传统电商,都不需要解决“一次交易触发全局区段库存联动”的问题。

而更要命的,是公平性这一条。淘宝卖东西,你抢不到没关系,反正过两天还有补货,大不了改天再买。12306卖票就完全不是这个逻辑。国庆回家的票,错过这一班,后面的行程安排都要变。春节前最后一张回家的票,错过了就是错过了,今年可能就回不去了。

这种情况下,系统就要尽最大可能保证公平。不能让任何人因为系统bug优先获得资源,不能因为某条网络更快就让某个用户占便宜,不能因为服务器分区不均就让某些地区的人买不到票。当然,铁路系统也有一些政策性安排——比如军人依法优先购票——但在同一优先级内,必须做到严格的时间顺序公平。



再加上中国铁路必须实名制购票。每一笔交易背后,都需要对乘车人身份信息进行实名核验。这又是一层计算压力,而且涉及到跨部门的数据接口。

把这些因素叠加起来,12306所面对的,就是一个全球互联网工程史上极为罕见的难题。

回到那个被全民唾骂的2012年。当时的12306用的是什么技术呢?

是脱胎于传统铁路客票系统的集中式商用架构,处理确定性事务极其稳固,但放到互联网级别的并发面前,就跟拿着算盘去算航天数据一样。

当时的研发团队主要是铁道部下属的铁科院电子所。他们是铁路信息化的顶级专家,但面对互联网的高并发联动、几亿人同时点击这些难题怎么处理,他们几乎没有任何经验。网站运行中的很多BUG超出了他们的认知范围。



最典型的例子是余票查询。当时的设计是每次查询都去数据库里实时计算。一个人查一次,系统就要算几百个区间的余票。海量的人同时查,数据库直接被打爆。

还有验证码这件事,为了防止黄牛用机器刷票,12306引入了图形验证码,要求用户识别图片。结果系统压力一大,连验证码图片本身都加载不出来,用户看到的就是一片空白。

那个时期的12306工程师,每天被骂上热搜。整个团队的精神压力,外人很难想象。

但骂归骂,问题还得解决。2012年下半年,铁科院开始痛定思痛,承认传统架构搞不定这个事,必须引入互联网思维。他们开始主动接触阿里巴巴、京东等互联网公司的技术团队,开始研究淘宝双十一是怎么扛住流量的。



二.从被骂到封神,要走多远?

2013年,12306开始引入GemFire内存数据库。这个东西的核心思路其实非常朴素,既然数据库的硬盘读写跟不上,那就把所有的余票数据放到内存里。内存的读写速度远超硬盘,这一改,余票查询的速度直接起飞。

这是12306进化的第一步。但仅仅这一步,远远不够。

真正的革命发生在2015年。那一年的春运前夕,12306做了一个让所有人都意想不到的决定,把75%的余票查询业务迁移到阿里云上。



为什么要这么做?因为他们意识到了一个根本问题。12306的流量不是均匀的,它是脉冲式的。平时一天可能也就几百万次访问,但到了春运抢票开始的那一瞬间,访问量能瞬间飙升到几亿次。如果按照峰值流量来配置自己的服务器,那90%的时间里这些服务器都是闲置的,纯属浪费纳税人的钱。而如果按照平均流量来配置,又扛不住峰值的洪流。这个矛盾,自建机房永远无法完美解决。

但云计算可以。阿里云的核心能力,就是把全国所有客户的服务器需求池化。谁用得多就给谁分配多。平时的算力给淘宝用、给优酷用、给其他客户用,到了12306需要的时候,瞬间调度过去。这是一种典型的“资源共享”模式,本质上是把电网的逻辑搬到了计算领域。

这个决定在当时是需要魄力的。铁路系统是国家命脉,把核心业务放到一家民营公司的服务器上,在传统观念里是很难接受的。虽然全球范围内政府机构使用商业云已经不算新鲜事——美国CIA用AWS、国防部用Azure——但在2015年的中国,公共服务上云还是一件需要打破观念壁垒的事。铁科院做了,而且做得非常彻底。



把查询业务搬上云之后,12306的余票查询能力提升到了一个全新的量级。2015年春运,12306在单日最高近300亿次访问的强压下成功顶住,没有发生大面积崩溃。那一年的舆论开始有了微妙的变化。骂声还在,但抢到票的人开始多了,大家也开始承认这个系统“好像没那么烂了”。

2016年,12306又上线了一个全新的系统架构,把交易系统、支付系统、查询系统全部解耦。简单说就是把以前的“一锅炖”拆成了多个独立的服务,每个服务都可以独立扩展、独立崩溃、独立恢复,起到故障隔离的作用。这是互联网公司典型的“微服务架构”,铁科院学得有模有样。

2018年春运期间,12306的日访问量已经达到了惊人的1500亿次,相当于全中国人每人每天访问了票务页面100多次。高峰时每秒售票量达700张。



三.与黄牛的战争

但光是扛住流量,还不算真正的胜利。12306还有一场看不见的战争要打,那就是和黄牛的战争。

这是一个延续了几十年的灰色产业。在售票窗口时代,黄牛雇人通宵排队,从早排到晚,把好票抢光了再加价卖出去。到了互联网时代,火车票领域的“黄牛”这个概念基本上从在进站口吆喝的真人,变成了线上软件。它用机器代替人工抢票。

什么叫机器抢票?就是写一个程序,模拟人的点击行为,但比人快几千倍。一个普通人1秒钟只能手动点击几次,机器一秒可以点击几百次。一个普通人只能同时盯着一个屏幕,机器可以同时操控几万个账号。

2014年前后,抢票软件已经成为了互联网行业的一个公开产业。猎豹、360、携程、智行火车票、高铁管家,几乎所有的浏览器、出行APP,都在抢这一块流量。它们的核心卖点都是一样的,我们的服务器比你快,我们的算法比你强,给我们花点钱,帮你抢到票。



那些年还出现了一个东西叫“加速包”。本来你买票就买票,但抢票软件会告诉你,付10块钱给我们,我们给你“低速”抢票;付30块给我们,我们给你“光速”抢票;付50块,我们给你“VIP光速”抢票。一张50块的票,加速包夸张时能卖到100块。

这对12306来说是一场极大的挑战。普通人是手动操作,黄牛是机器操作。如果按照“先到先得”的原则,那票永远会被机器抢光。中国铁路想要保证的,是乘客自己能买到票,而不是让票全部流到黄牛手里再加价回来。

12306的应对方式,是打一场不断升级的攻防战。最早是图形验证码。黄牛软件搞不定,就配套了“打码平台”。把验证码截图发给印度或者东南亚的廉价劳工,让他们手动识别。一个验证码识别费用大概是0.01美元,效率极高。

12306升级,搞出了“点选验证码”。给你看9张图片,让你点出“含有自行车的图片”或者“哪些是冰激凌”。这种识别比纯文字验证码难多了,但黄牛软件很快又用上了机器学习算法,破解的成功率能达到80%以上。



12306再升级,引入了“行为验证”。分析鼠标移动轨迹、点击节奏、设备指纹,判断这次操作背后是人还是机器。黄牛软件就反过来模拟人类的鼠标轨迹,故意加入一些随机延迟、加入一些“无意义”的鼠标抖动,把自己伪装成人。

这种攻防战打了好多年,双方都把技术推到了极限。但本质上,12306始终在被动防守。

直到2019年前后,12306做了一件改变游戏规则的事。他们推出了候补购票功能。

候补购票的逻辑非常巧妙。你想买的票如果没有了,可以提交一个“候补订单”,把钱押在那里。一旦有人退票或者有新增车次,系统就会自动把这张票分配给候补队列里排在最前面的人。



这一招打出来,整个抢票软件行业的核心商业模式受到重创。以前的抢票,是看谁的网速快、谁的程序牛、谁愿意花钱买加速包。候补购票之后,所有人都是在系统里排队,黄牛软件的技术优势被大幅削弱。你机器抢票再快,票池里没票了你也抢不到。排在队伍前面的,是最先提交候补订单的人,跟你用什么设备、什么网络、什么软件的关系小了很多。

当然,黄牛软件并没有完全消失。它仍然可以用大量收集来的身份证信息批量提交候补订单,仍然可以在放票瞬间用机器抢先下单。但候补购票至少把战场从“纯速度比拼”拉回到了“排队等候”的逻辑上,普通人的胜算大大提高了。



更妙的是,候补购票还顺便解决了另一个问题,就是随机退票的问题。以前一张票如果被退了,会被重新放回票池,然后被下一波抢票的人抢走。这个过程对普通乘客非常不友好,因为退票是随机发生的,你根本不可能24小时盯着系统。但候补购票之后,退票直接进入候补队列,自动分配给等待的人,整个过程对乘客是无感的。

这一个功能改动,让12306的购票公平性发生了根本性的转变。

四.电子客票推行

2020年,12306又干了一件大事,电子客票全面推行。

以前坐火车,要先在网上买票,然后在车站取纸质票,凭票进站、凭票上车。这个流程在春运高峰期会造成一个让人非常难受的现象,取票窗口前总是排着上百米的长队。很多火车站虽然铺设了不少自助取票机,能缓解这个现象,但那个时候机器的故障率很高,有时候排了很长的队,快到自己了,突然发现前面机子卡死了,简直绝望。这也让很多人每次坐火车,要专门提前两个小时到车站排队取票,否则怕赶不上车。



电子客票推出之后,整个流程被简化到了极致。买完票直接刷身份证进站、上车、出站,纸质票不再是乘车的必需品。

这件事看起来好像只是一个流程优化,但背后是一整套基础设施的重构。每一个进站口、每一个检票口,都要配备能够实时连接12306数据库的身份证读取设备。每一次刷卡,都要在零点几秒内完成身份验证、车票查询、闸机控制三个动作。全国几千个火车站,几万个检票闸机,这是一个工程上的巨大挑战。

而12306做到了。到2025年的国庆,整个铁路系统已经基本实现了“无票化”运行。一个旅客从出发城市的进站口,到抵达城市的出站口,全程不掏出任何一张纸质票。

这种丝滑程度,是十几年前12306崩溃时代的人完全无法想象的。



五.国际对比

讲到这里,可能会有人说,12306做得再好,不也就是个售票网站吗,至于吹得这么神。那不妨看看其他国家是怎么做的。

美国最大的票务平台叫Ticketmaster,主要做演唱会、体育赛事的票。这个系统因为涉及到座次,也要解决并发的问题,但跟中国的火车票系统相比,要简单得多。

2022年11月15日,泰勒·斯威夫特Eras Tour巡演的票预售,系统直接崩溃。当时预注册的约350万人,但实际涌入系统的访问量达到1400万,网站被彻底打爆。系统崩溃后,无数粉丝被踢出队列、丢失购物车,最终公开售票被迫取消。这件事闹到了美国参议院,专门召开了一场听证会来审查Ticketmaster的垄断和运营问题。



这个案例说明了一件事:即便在技术高度发达的美国,一个头部平台面对1400万级瞬时访问就出现崩溃,而12306在春运、国庆高峰期的日访问量和并发请求量都达到千亿级,远超Ticketmaster,而且火车票的库存计算比演唱会要复杂得多。技术难度,完全不是一个级别。

同为十亿级人口、同样高度依赖铁路的印度,对比的反差会更刺眼。印度早在2000年前后就上线了网络订票,起步很早。但很多年里,它的高峰期抢票始终是“修罗场”。

最典型的是Tatkal紧急票——专门给临时出行的人预留,可一到放票时,网站经常卡死、登录失败、付款成功却拿不到座。

黄牛同样猖獗:机器人批量刷票,普通乘客还没进系统,热门车次就已经空了。印度后来被迫出重手——一次性停用上千万个可疑账号、限制每个账号每月购票数量等等,但仍难根治。



而中国的12306,用全面实名制把“谁在买”锁死,用候补排队替代“外挂先得”,用异步队列、内存计算、混合云把亿级并发变为有序分配,再用风控把黄牛脚本降速、拒之门外。

售票系统的差距,本质上是公共治理的差距。

而且,和世界上任何一个国家相比,中国除了五一、国庆这种节假日高峰之外,还有一个超集中的出行峰值——春运。

2025年春运,40天时间,全国铁路共发送旅客5.1亿人次。这个数字差不多是美国总人口的1.5倍,相当于把大半个欧洲的人口运了一次。

2026年春运,纪录再次被刷新——40天内铁路累计发送5.4亿人次。

更要命的是春运的流量分布。春节前的几天,是返乡高峰,几亿人从北上广深等一线城市往内陆、往农村流动。春节后的几天,是返工高峰,几亿人又反向流动。这种规模的潮汐式流动,对铁路运力、购票系统都是极限挑战。



为了应对这种洪峰,近年的春运车票按15天预售规则开售。从腊月二十九、除夕到正月初一、初二,越临近春节核心日,越按“提前15天”滚动放票;而且,不同出发车站还设不同起售时点。这样做,是为了分散流量压力,把全国流量拆成按乘车日、按车站错峰释放,避免所有车票同一秒集中开抢。

这些年来,中国每年春运出行人次一直在上升,春运抢票依然是很多人的痛点,但整体体验和过去相比,已经提升了太多。

六.14亿人的公共出行权

讲到这里,12306的进化史就基本讲完了。但这个故事,其实还有更深一层的东西。

12306的进化,表面上是一个技术系统的优化,但本质上是一种治理方式的进化。中国是个14亿人口的超大规模社会。这种规模下,任何一个公共服务,都不是简单的“做一个产品给用户用”那么简单。它涉及到资源分配、流量调度、公平保障、应急响应。每一个环节,都不能完全用纯粹的市场逻辑来解决。



举个例子。如果完全按照市场逻辑,那春运的票可以价高者得。一张北京到成都的高铁票,平时几百块,如果完全按供需定价,春运时完全可以抬到几千块,自然就会有人不买了,自然就解决了供需失衡的问题。在某些领域也确实是这么运作的——演唱会票、体育赛事票、节日机票,都有动态定价的机制。

但铁路票不能这么做。因为火车票背后承载的,不是一个商业需求,它是一个工人回家过年的需求,是一个学生回家见父母的需求。这些需求不能用价格来调节,必须用“非市场化”的方式来分配。一个普通工人想从深圳回山里老家过年,他不应该因为买不到票,就失去回家的权利。

12306的进化,本质上就是在探索这种“非市场化”的分配方式。候补购票是什么?它是用算法在模拟“排队”这件事。在规则层面上,排队是最朴素的公平。先到先得,后来的就得等,跟你有没有钱、有没有权力、有没有关系都没有任何联系。但物理世界的排队有它的局限,你必须在场,必须消耗时间。12306把“排队”搬到了数字世界里,让所有人都可以“虚拟排队”,但又不需要真的在那里等。



这是一种典型的中国式工程思维,用现代技术去实现一种古老的公平。

而12306的成功,给中国其他公共服务提供了一个非常重要的范例。个税APP、电子社保卡、医保码,这些后来出现的国家级公共服务系统,它们都是面向全民的、对稳定性要求极高的、承载了重要社会功能的,在它们身上也都可以看到和12306相似的技术演化路径。

12306用了十几年的时间,趟出了一条路。这条路上有过崩溃、有过被骂、有过至暗时刻,但最终走出来了。

但我们也得承认,12306远远不是完美的。每年国庆和春运期间,热门线路依然一票难求。抢票软件依然存在,黄牛产业链以新的形式继续生存——他们从“技术抢票”转向了“囤积身份信息批量候补”和“代购加价”。候补成功率虽然在持续提升,但仍有相当比例的人最终拿不到票,他们可能因此错过和家人团聚的机会,或者不得不放弃出行计划。



这里更深层的问题在于,12306的技术再强大,它也解决不了一个根本矛盾:中国铁路的运力,依然无法完全满足14亿人的出行需求。

你可以把抢票系统优化到极致,可以把库存管理做到毫秒级响应,可以把调度算法做到全局最优,但如果总运力就那么多,需求超过供给的时候,总有人买不到票。技术能做的,是让这个分配过程更公平、更透明、更高效,但它无法凭空创造出新的运力。

真正能解决运力问题的,是高铁网络本身的扩张。2008年京津城际开通的时候,中国高铁运营里程是120公里。到了2025年底,这个数字突破了5万公里,超过全球其他国家高铁里程的总和。全国铁路营业总里程达到16.5万公里。按照规划,2035年,全国铁路网运营里程达到20万公里左右,其中高铁7万公里左右。

正是这十几年的疯狂建设,才让“调度14亿人”这件事从不可能变成了可能。



最后,我还想再强调一个点,12306到底是什么?

在手机界面上,它是一个APP,和淘宝、携程,或者同样卖票的淘票票、大麦这些,看起来也没有什么不同,logo还有点土。

但它,其实有本质的区别。

淘宝的核心目标是促成更多的交易、获取更多的利润。它会通过各种营销手段刺激你消费,可以通过精准推荐让你下单。它服务的是市场逻辑。

携程主要以平台模式连接用户和供应商,核心角色是信息中介和交易撮合。它服务的也是市场逻辑。

而12306不一样。它服务的——是14亿人的出行权。



火车票不是普通商品,它是基础公共服务的组成部分。

这种公共服务属性,决定了它所有的底层设计,第一优先级必须是公平、普惠、便捷。也决定了它的票价调整是有限度、受管制的,而不是完全按照市场供需自由浮动,更不会有什么膨胀红包、优惠券。

另外,它还必须照顾那些不熟悉智能手机操作的老人、农民工等群体,所以你也会看到,在网上购票已经非常发达的情况下,我们也还始终保留着电话订票、窗口售票和代售点等多种渠道。网络不能成为获取火车票的唯一通道,因为那样会把大量的弱势群体排除在外。



这种坚持是有代价的。多渠道售票意味着系统的复杂度更高,意味着更多的运营成本,意味着技术架构上要做出很多妥协。但这种代价是必要的,因为12306的服务对象是每一位中国人,不是只有那些会熟练使用APP的人,尽管后者占了大部分。

回头看,中国人建设12306的故事,是一个关于技术、制度、理性的故事;但同时,也是一个关于亲情、乡愁的故事。因为一张火车票的背后,关键词往往是“启程”、“远行”“离别”和“回家”。

每年春运和国庆,当无数家庭在异乡团聚,当无数恋人跨越山河相见,当无数游子带着父母的牵挂踏上归途,背后是一个由代码、铁轨、调度员、列车员、技术工程师共同支撑起来的庞大系统在默默运转。



这个系统的每一次响应,都关联着一个具体的人和他想抵达的地方。它处理的不只是数据,是无数次具体的相遇与离别。它优化的不只是算法,是亿万人对于“按时回家”这个朴素愿望的实现路径。

从2011年那个被全网骂崩的网站,到2025年,单日承载2313万人次出行、年发送旅客近46亿人次的全球规模最大的铁路票务系统,这条路,12306走了十五年。

而中国第一条铁路——吴淞铁路——1876年通车,距今正好150年。十五年不长,放在150年的中国铁路历史里只是一瞬间。

但就在这一瞬间里,这个古老国度实现了一次又一次史诗级的社会调度——十几亿人的乡愁,变成了准点抵达的承诺。

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    快速回复 返回顶部 返回列表