GMTC全球大前端技术大会(北京站)门票9折特惠截至本周五,点击立减¥480 了解详情
写点什么

严肃科普:12306 能扛得住明星并发出轨级的流量吗?

2019 年 2 月 01 日

严肃科普:12306能扛得住明星并发出轨级的流量吗?

12306: 这是我被黑得最惨的一次。


买着票了吗您?

又是一年春运到来时,每年的这个时候,大家见面的问候语就从“吃了吗您?”变成了“买着票了吗您?”,于是相视苦笑,“¥%#& 的 12306”。春运是这个星球上最大规模的人类迁移活动,每年有长达 40 天的时间里,空运、铁路、公路齐上阵,运送着数十亿人次的旅客。


铁路系统,更是其中重要一环,历年铁路春运数据一览:


  • 2016 年,铁路春运 40 天累计发送旅客 3.03 亿人次;

  • 2017 年,铁路春运 40 天累计发送旅客 3.57 亿人次;

  • 2018 年,铁路春运 40 天累计发送旅客 3.8 亿人次;

  • 2019 年,铁路春运预计发送旅客 4 亿人次。


12306 春运放票可谓是互联网史上最无辜的“饥饿营销”:放票一秒钟基本就没票了,挂个携程、同程、飞猪、智行刷上一星期也未必抢得着一张票,找黄牛、自己写抢票脚本,八仙过海各显神通,“洛阳亲友如相问,就说我在抢车票”。


于是乎,吃瓜群众们认为 12306 的系统简直太烂了,都提前一个月了还买不着票。就像全国有好几亿人想教张小龙做微信一样,大概也有无数人想教 12306 怎么出票。



于是乎有人问了,12306 的系统能扛住明星并发出轨级别的流量吗?


12306: 你不懂我,我不怪你

12306 的发展历程

  • 2010 年 1 月 30 日(2010 年春运首日)12306 网站开通并试运行。用户可查询列车时刻、票价、余票、代售点、正晚点等信息。

  • 2011 年 1 月 19 日(2011 年春运首日),中华人民共和国 18 个铁路局(公司)所在地也分别成立了铁路客户服务中心,并公布了服务热线。

  • 2011 年 06 月 12 日,京津城际铁路率先试水网络售票。

  • 2011 年 9 月 30 日,所有动车组线路实施网上订票。

  • 2011 年 11 月 20 日,Z 字头全部直达特快列车车票实施网上订票。

  • 2011 年 12 月 23 日,铁道部最终兑现在年底前网络售票覆盖所有车次的承诺。

  • 2013 年 12 月 8 日,12306 手机客户端正式开放下载。

  • 2015 年 1 月 16 日,阿里云方面证实,12306 网站 75% 的余票查询系统已经迁移至阿里云计算平台上。

  • 2018 年 11 月 3 日,改版升级的中国铁路 12306 网站正式上线运营。


至此,12306 的布局、功能基本完善,在支撑春运的流量考验下持续着迭代之旅和来自没买到票群众的无情鞭挞。


12306 的设计模式

需求分析


服务旅客需求:


  • 在线售票服务需求;

  • 线下配套服务需求。


业务管理需求:


互联网售票涉及的票额、预售期、售票时 间、席别、票种、车次、车站、实名证件类型、网 站开放时间、业务办理时限、允许购票张数、售票收入统计、旅客投诉受理,异常用户处理等业务。


系统监控需求:


包括对互联网售票过程中涉及的软硬件设备进行资源利用、负载等运行状态的监控,以及对互 联网售票处理速度、购票旅客行为、订单状态等进 行监控,确保系统安全,稳定、高效运行。


系统结构、功能设计


铁路互联网售票相关的系统包括客票系统、12306 网站、互联网售票业务处理平台、铁路电子 支付平台以及站车无线交互平台 5 部分。如下图:



铁路互联网售票系统功能如下:



业务流程设计如下:



业务场景复杂在哪儿?

2012 年春运,由于访问量超出设计预期, 12306 网站在高峰期出现了页面打开缓慢、查询和下 单报错、后台系统过载等一系列问题。持续的高并发访问使系统在多个方面出现性能瓶颈,如下图:



在平时,12306 也就是个普通的购票网站。一旦到了春运、黄金周,12306 就是一个 1 全站所有商品都秒杀,所有 SKU 都是动态库存的存在。


从那以后,铁路系统的研发团队就一直在对系统架构、应用功能以及业务规则进行持续优化和改进。与此同时的,则是逐年刷新客流量峰值的春运、黄金周的高并发考验。


12306 的业务场景到底复杂在哪儿?


火车票跟很多票(包括各大电商的商品、机票、演唱会门票等)有不一样的属性。比如,从北京到广州,沿途有多个站点,理论上乘客可以选择任意 一段区间购票,所以每买一张区间票,可能同时裂变出多张区间票。这个逻辑比大多数电子商务系统要复杂的多。


购票差异还不仅限与此。比如再添加一些更人性化的功能:根据订票者身份证里的年龄优选上下铺、优选号等,那么查询和出票逻辑就更复杂了。


根据官方公布的数字,有人统计了一下:需要数千个 pv,才能出一张票。这个说法并不能得出“出票效率低”的结论,但是恰恰很形象地说明了查询量的巨大。


12306 的查询量不同于电商网站的商品查询,秒杀甚至饥饿营销抢购不到也就算了,火车票是抢不到也时刻惦记着甚至不惜写脚本 24 小时不间断刷新、查询的东西。



上图是爬虫流量的目标行业分布图,可以看到排第一名的是出行行业,而出行行业中近 90% 的爬虫流量都瞄准了 12306。


“12306 日均页面浏览量达到 556.7 亿次,最高峰时页面浏览量达 813.4 亿次,1 小时最高点击量 59.3 亿次,平均每秒 164.8 万次。”


这是加上验证码防护以后的数据,被拦在门外的爬虫流量有多少?不计其数。



上图是经过多次优化后的 12306 体系架构,可以看出比起前一张图,无论是系统的复杂程度还是结构的完善程度都有了巨大的提升。即便是这样,买不到票的人仍然很多。


事实上,像春运这样大规模的人类迁徙事件,从客观情况而言,技术只能起到缓解、改善、照顾到大部分人的作用。至于“根治”,需要的不仅是购票系统的技术水平持续提升,更加需要交通运输行业的持续进化。


回到最初的问题:12306 能扛得住明星并发出轨级的流量吗?


铁总:加机器扩容就能解决的事儿,不用来问我。



写在最后

普通人骂 12306,是因为他们不懂技术,也没有耐心去了解这背后的技术难点、业务场景复杂度。他们骂 12306,只是因为他们想回家。


要不我们再黑 12306 一把:如果让你来设计,你会给 12306 什么样的解决方案应对春运级别的流量?欢迎评论区留言告诉我们你的天才设想。


参考资料:


http://www.tljsjyy.com/CN/abstract/abstract3756.shtml


http://www.tljsjyy.com/CN/abstract/abstract2613.shtml


http://daily.zhihu.com/story/4453176


2019 年 2 月 01 日 06:006874
用户头像
小智 前 InfoQ 主编

发布了 402 篇内容, 共 321.6 次阅读, 收获喜欢 1773 次。

关注

评论 2 条评论

发布
用户头像
如果淘宝也想得到普通人的体谅,就不会这么成功了
2019 年 02 月 01 日 09:03
回复
我赞了你,但是淘宝有增速过程,12306直接获得多少公司梦寐以求的顶级流量,不过我不认为这不是它无响应的理由。
2019 年 02 月 01 日 09:19
回复
没有更多了
发现更多内容

再次荣获最受观众喜爱奖

Serverless Devs

阿里云 云原生 cncf #Serverless

现货量化倍投系统开发,马丁量化策略交易平台搭建

WX13823153201

Fedora 34成哑巴了?

DisonTangor

fedora

阿里内网流传的9w字图解网络(全彩版)GitHub现已下载量过百万

马小晴

Java 程序员 网络协议 网络 架构师

打破思维定式(七)

Changing Lin

5月日更

2021年5月国产数据库排行榜:“华为高斯模式”取得成功,阿里OPA持续攀升

墨天轮

数据库 dba tdsql TiDB Gauss DB

为啥你写的代码总是这么复杂?

华为云开发者社区

软件 代码 代码注释 bug 复杂度

论好文章和烂文章

阿里巴巴云原生

程序员 开发者 云原生 写作技巧 成长与思考

牛!一次实战批量SRC和CNVD的奇技淫巧(全程干货,建议收藏)

Machine Gun

运维 网络安全 信息安全 渗透测试

官宣:恭喜 ChaosBlade 项目进入 CNCF Sandbox

阿里巴巴云原生

go 容器 云原生 k8s 监控

渗透测试必备|一款优秀的web指纹识别工具

Machine Gun

Linux 网络安全 Web 信息安全

阿里开源的“高并发设计笔记”就这水平!?我反正是跪着看完的

Java架构师迁哥

数据采集之js自定义采集

大数据技术指南

大数据

我崩溃了!BTAJ面试有关散列(哈希)表的面试题详解,电子版已问世

欢喜学安卓

android 程序员 面试 移动开发

一萌妹子的面试经历,美团四面三小时,成功拿到Java岗offer

Crud的程序员

Java spring 架构 java程序员

Linux C/C++ 学习路线总结!助我拿下腾讯offer

赖猫

后台开发 C/C++ Linux服务器开发

阿里开源的“SpringCloudAlibaba笔记”这么细节的吗?真秀!

Java架构师迁哥

云图说|不要小看不起眼的日志,“小日志,大作用”

华为云开发者社区

运维 日志 云日志服务 安全监控审计

如何做一场高质量的分享

阿里巴巴云原生

深度学习 开发者 云原生 分享

Apache Flink Meetup 北京站,1.13 新版本发布 x 互娱场景实践分享的开发者盛筵!

Apache Flink

大数据 flink

高性能JavaScriptの笔记(一)

空城机

JavaScript 性能优化 前端 5月日更

String拼接出现null?你看到的分析可是错的

Java王路飞

Java 程序员 架构 面试 string

Arction高性能图表控件LightningChart关于交易图表问题解答

Geek_bacee5

数据可视化 LightningChart.NET Arction 图表控件 LightningChart

更灵活的边缘云原生运维:OpenYurt 单元化部署新增 Patch 特性

阿里巴巴云原生

容器 运维 云原生 中间件 边缘计算

区块链的基础设施对于DeFi,到底意味着什么?

北熊说链

太空猫公链

新思科技发现开源安全、许可证合规性和维护问题依然很普遍

InfoQ_434670063458

新思科技 OSSRA 开源安全

云原生资源隔离技术——CPU隔离

程序员小毕

Java 程序员 架构 面试 云原生

如何选择fil矿机厂商?fil挖矿哪家靠谱?

投资矿机v:IPFS1234

如何选择fil矿机厂商 fil挖矿哪家靠谱

MapReduce排序以及序列化

五分钟学大数据

大数据 hadoop mapreduce

Spring Cloud Bus 消息总线介绍

阿里巴巴云原生

Java 微服务 云原生 中间件 数据格式

白嫖到阿里P7整合的万字Java精髓文档,学完斩获了3个大厂offer

java专业爱好者

Java main

严肃科普:12306能扛得住明星并发出轨级的流量吗?-InfoQ