[知乎]12306 系统在 2015 年春运高峰期的稳定运行,采用了哪些具体技术?
来源:互联网 发布:python 创建嵌套字典 编辑:程序博客网 时间:2024/04/29 02:33
http://www.zhihu.com/question/27321479/answer/37292320#rd
不邀自来,果断匿名。
利益声明:阿里云程序员,今年12306春运项目幕后码农。
仅代表个人,尝试从技术的角度对12306做一些抽象的归纳,包括12306与云计算的技术相容性,对项目谈一些感受。不涉及具体数字和系统架构细节,对铁路业务运营不做评论。
先亮明基本观点,不喜请绕路:
1、从技术上看,不是说做好了阿里双11就能做好12306
2、12306的亮相是惨了点,但这两年一直在改进
3、12306一直在尝试引入外部技术力量解决问题,租用公有云算其一吧
=============================
我初次使用12306是到北京旅游,返程票是在12306预定的。当时是拿到一个订票号码之后再去西直门付款取票。客观来说,这两三年12306的便捷程度已经有很大提升。
每年春运,12306都会被推到风口浪尖上,也不断有“高人”放出豪言壮语,可以非常迅速而廉价的开发一个新的 12306出来。我记得大约4年前招聘工程师的时候,也经常遇到有人断言可以3个月内开发一个完整的淘宝系统。对于这种口炮党,我只能说:呵呵。。。
铁路运营是一个庞大的社会工程,每年春运,相当于把全国人口“搓一圈麻将”,如果在这个节点去网点排队买票,相信绝对是一件让所有人头疼的事情,这不仅是用户体验差的问题,同时也是对社会资源的巨大消耗。
收一下,回到技术层面——
在互联网售票之前,网点售票已经实施多年。换句话说,铁路售票实际上一直有一个相当庞大且复杂的、跨多个路局的信息系统在支撑,而且可以追溯到80或90年代,维护至今。这个系统也许不仅支持了售票,可能还包括调度等核心业务。那这里就有一个问题:在做互联网售票的时候,是否要重构一下原有的系统呢?
这个问题值得反复掂量。大家应该知道,彻底重构一个运行数十年的系统的开销和风险吧,粗略一想涉及到各种业务逻辑、软硬件供应商、版本与维护协议等等。
绝大多数的互联网技术同僚应该会倾向于在现有系统上做web前端,先让系统“用起来”,然后再集中技术力量逐步优化整套系统架构。这也是当时12306的选择,这就导致有很多历史的包袱,还要考虑线下售票系统。
==============================
知乎上很多人拿春运售票和我厂双11比较,究竟哪个牛逼?
个人感觉两者同属于重量级的网站业务,双11在业务规模上更有挑战,而12306则在业务复杂度上更高。
火车票跟很多票(包括淘宝天猫的商品、机票、体育场馆门票等)有不一样的属性。比如,从北京到广州,沿途有多个站点,理论上乘客可以选择任意 一段区间购票,所以每买一张区间票,可能同时裂变出多张区间票。这个逻辑比大多数电子商务系统要复杂的多。关于这一点,这里有一个更夸张的分析,有兴趣请参看:
从嗤之以鼻到“奇迹” 前淘宝工程师详解12306技术。
购票差异还不仅限与此。假如说要再添加一些更人性化的feature,比如根据订票者身份证里的年龄优选上下铺、优选号等,那么查询和出票逻辑就更复杂了。
在一个后端上,setup一个web前端(包括入口、安全、缓存和逻辑,非指web页),这个挑战也是巨大的。因为这个前端很容易瞬间胀大, 甚至被撑爆。“撑爆”的概念不难理解,奥运会的订票高峰,中美海底光缆拥塞,包括杰克逊去世后瞬Google瘫痪,或者DDoS拒绝服务攻击,都是这种现象。
根据官方公布的数字,有人统计了一下:需要数千个pv,才能出一张票。这个说法并不能得出“出票效率低”的结论,但是恰恰很形象的说明了查询量的巨大。
为什么12306查询量会这么大呢?因为淘宝的秒杀抢不到就算了,运气不好下次再来过;火车票的购票心理则不同,“求之不得,梦寐思服”,特别是高峰期的票。而买到票的人也不一定满意现在的车次、时间。总之,就是一个字:刷!刷!刷!
当然各种抢票工具的泛滥,也是让查询量猛增的原因之一。不过,从另一个角度看,能让这些工具都被用户用起来,这也证明了系统处理能力的大幅提升。
===洗====地===结====束=====
上面说了,天量的火车票查询是影响12306性能的重要原因之一,大概占了90%以上的访问流量。更棘手的是:峰谷的查询有天壤之别,几乎没有办法在成本和并发能力之间做一个好的平衡。以往的一个做法是从几个关键入口流量控制,保障系统可用性,但是会影响用户体验。
淘宝/天猫大促的时候,也会增加服务器,阿里的业务盘子大,这些新增的机器很快会被其他业务(包括阿里云)消化掉,可能还不够。但是对于 12306来说,就比较难做到这一点。
这成为今年12306与阿里云合作的一个契机:通过云的弹性和“按量付费”的计量方式,来支持巨量的查询业务,把架构中比较“重”(高消耗、低周转)的部分 放在云上。这是一个充分利用云计算弹性的绝好实例,也是在系统架构上做“轻重分离”的一个典型case,把小而精的核心业务系统保持不动,把 “傻大笨粗”(非贬义)的系统迁移到云计算上。
今年初我们和12306的技术团队开始讨论如何将余票查询系统放到云上,十一黄金周做了测试效果不错,到春运12306决定将75%的余票查询业务放到云上。
同意@xLight 的说法,云计算不是万能的,12306的业务系统很复杂。目前我们能看到的是,在提升余票查询能力方面,云计算可以快速部署应用提供服务,通过分钟级的扩容操作,实现十倍、百倍的服务能力扩展。
==============================
做这个项目一晃有小半年了,感触很多。大家知道双11对阿里技术团队是一个不小的挑战,我参加了4年,其中有两年过的尤为艰苦。当时技术团队经常被业务方指责,就像现在大家对待12306的态度一样。但客观说,双11大促推动了阿里的技术成熟,春运也推动了12306采用更多面向未来的技术。
最后引述一段12306工程师回顾系统刚上线时说的话:
12306是个互联网新人,又或者被称为“富二代“,它长得很丑,也很傻很瓜,身体还很弱…所以第一次露脸它就演砸了,那天全中国互联网大佬和网民都盯着它看,基本上全中国的网友都涌入它的家。那天它宕机了,同样是那天骂声如潮……其实我们知道,他们骂的不是12306,他们骂的是这个时代。=============================
回答几个问题:
l为什么是余票查询?
1. 访问量巨大,占12306整个网站流量的90%以上,业务高峰期并发请求密集,性能要求是整个业务系统中最为重要的一环;
2. 与其他业务在逻辑上相对独立,使用云计算的话不需要对整个网站的业务架构做改造。
l实施过程可否透露?(隐去部分敏感信息,请理解):
1. 把余票查询模块和12306现有系统做分离,具备独立部署的能力;
2. 在云上独立部署一套余票查询系统。这样子12306和云上都有了一套余票查询系统,,调度更为灵活;
3. 一些安全措施,吧啦吧啦吧啦……
根据运行情况,云上的余票查询与12306原来的余票查询可以互相补位,根据实时的负载情况,来调配不同的访问比例,充分利用云的弹性。
l云计算跟“堆硬件”有什么区别?
这里主要是"春运 vs 平时"、"业务量 vs 成本"的问题:
1. 传统IT方案,为应对春运的业务压力,需要按照峰值采购大量硬件设备,从规划、建设到投产、服务整个供应链条长成本高,capex和opex上的投入都比较大,很难精确把控,而春运后大量设备会处于空闲状态,利用率低,造成巨大的浪费。
2. 还有至关重要一点是,假如按照传统方案,在实际业务峰值超出了初始评估量时,服务将面临无法完全承载而瘫痪,因为为大规模服务器的采购、交付、部署到应用上线所耗费时间以月计,根本无法在业务量激增时"即插即用"。
3. 云本身就比自己买硬件要便宜,另外所有资源都是“按量计费”,从十一黄金周到春运的过程里,12306在云上做了两次大型扩容,每次扩容的资源交付都是在分钟级就完成。业务高峰结束后,可以释放掉不必要的资源,回收成本。
-------------------------
从嗤之以鼻到“奇迹” 前淘宝工程师详解12306技术
有关12306技术难度和实现水平的又一篇重磅文章。作者是前淘宝工程师,后来在一家电商公司做技术副总。和大多数人一样,12306刚出来时他也骂,甚至为了证明这事儿很容易做,他发起了一个"替12306设计系统"的开源项目,两年后就有了这篇长文。如果你还觉得自己很牛逼,先超越他的思考吧。
AD:
-------------------------
http://www.csdn.net/article/2015-02-10/2823900#rd
12306改造的关键技术– 建立可伸缩扩展的云应用平台
为什么选择Pivotal Gemfire构建12306的云应用平台?
要解决12306春运时高流量高并发的问题,如果单靠硬件升级解决的话,可能需要扩充数十倍的硬件服务器。但在春运以后,又该如何解决服务器过剩的问题呢?
要真正解决“高流量,高并发“的难题是需要从软件和应用系统层面出发,唯有实现“可扩展的应用云平台架构”,灵活和快速热部署的机制,才是真正解决高并发访问的根本。
在经过多次论证和POC测试后, 12306 最后选择Pivotal Gemfire作为系统改造的平台
6. 混合云的应用:
- 使用Gemfire改造后的分布式系统,极易分散部署到不同的数据中心
- 例如,余票查询子系统可以独立于原来的大系统部署到公有云上,同时也可以再将此子系统一分为二,将另一部分服务器部署在私有云的数据中心。即按业务需求随时部署所需要的资源,来解决高并发的难题。
6. 阿里云的余票查询业务托管:
在前一节已经详述,考虑个人资料的敏感度和安全性,12306不会将这些资料放在阿里云,但会将需要耗费巨大资源的余票查询业务放在阿里云提供服务。另外符合此条件的有3大服务器集群,Web服务器集群, 应用服务器缓存集群, 和余票查询/计算集群。
12306混合云成功案例给予最大的启发就是打造一个从下到上都可做弹性扩展的“云应用”系统,企业客户可将关键业务的“子系统”部署在资源丰富的云计算数据中心,“云化”后的子系统可“按需”获取所需要的服务器虚机资源和动态调整网络带宽,利用这些资源解决在高流量和高负载情况下,系统无法快速弹性扩展导致的性能瓶颈。云化后的子系统部署在多数据中心,需要特别注意下列两点建议 :
- 如果将子系统部署在公有云提供服务时,数据隐私的保护和安全性应为首要考虑。
- 如果规划将子系统部署在多数据中心时,在系统框架上必需考虑上下游子系统之间的数据传输或同步/异步的设计。
- [知乎]12306 系统在 2015 年春运高峰期的稳定运行,采用了哪些具体技术?
- 关于春运高峰期的一点想法
- 知乎的技术方案
- (知乎)男生 25 岁了,应该明白哪些道理?
- 系统连续稳定运行的关键
- 忘了Root密码的后果--系统长期运行稳定是件好事吗?
- 知乎的高质量用户在流失吗?还有哪些高质量用户?
- 系统终于稳定了!!
- 【知乎问答】有哪些特殊的搜索引擎?
- 知乎 哪些素质很重要,却是读书学不来的?
- IBM Watson的Question Answering系统采用了何种技术--笔记
- 在计算机管理的事件查看器查看系统运行中的具体错误
- 知乎Live 预告:工程师在创业团队的技术挑战和成长
- Google+的构建使用了哪些技术?
- dumpsys activity 查看系统运行了哪些任务?
- 在低电压下稳定运行的cache(一)
- 在低电压下稳定运行的cache(二)
- 高峰期
- CATransition转场动画
- 滚动视图UIScrollView、UIPageControl
- LeetCode Maximum Depth of Binary Tree
- django 1.8 官方文档翻译: 8-3 点击劫持保护
- ExtJS4组件_form表单配置-属性-方法详解
- [知乎]12306 系统在 2015 年春运高峰期的稳定运行,采用了哪些具体技术?
- 比那名居天子
- 代码面试最常用的10大算法
- HDU 5437 Alisha’s Party(优先队列+模拟)——2015 ACM/ICPC Asia Regional Changchun Online
- java 中 for 与 while 比较。
- hadoop 学习笔记:mapreduce框架详解
- HTTP状态码详解
- oc-内存管理
- JAVA STATIC 修饰的代码段