本鱼拟成立工作室承接项目开发/软件定制/云设施开发运维/办公设备技术支持等,如您有相关需求,欢迎来询 | ::博客文章推荐::

2014 春运祭 ④-⑥ 票呢,票呢,票呢

: 网络/NET 木魚 9530℃ 12评论

④ 12306新版所出现的问题

从网站层面来说,新版12306出现的问题还是集中在漏洞、性能和规则上。至于能不能买到票则很明显和它没有多大关系,因为不管网站做的怎么样票也都卖出去了,而买不到票的人数也不是随着网站好用或不好用而增减的。因此,几乎所有公司的宣传都是在瞎说。
 

4.1 漏洞

新版的12306上线的较为仓促,可以说之前都是在内部测试。而内部测试的一个重要的问题就是无法涵盖所有的可能场景,无法模仿所有的用户。所以一个大型的系统一般都是需要在正式发布测试很久的,这个从产品的版本号上面可以看出。比如腾讯是这方面做的比较登峰造极的,旗下产品QQ一般一年就只有一个正式版,然后正式版的生存周期很短,很快就会又变成测试版,其版本号命名如 QQ2013 SP5 KB2 Update1……好吧其实这样的版本号只能是一个笑话。

单就12306来说,在这2014年春运中,其实闹过不少漏洞。虽然前前后后几乎都修复了,但问题是春运的服务期太短了,等漏洞修复好后其实别人也利用得差不多了。

新版12306暴露过的漏洞其实很多都是曾经犯过的错误,也就成为经典的漏洞,比如进入订单页面后可以修改日期这样的,据了解都曾经被一些小众软件比如心蓝利用过。但也有持续很久才被默默修复的漏洞,比如在新版12306中长期存在一个提交订单的接口,通过这个接口提交订单不需要校验码的验证(虽然同样提交了验证码数据,但是无论对错都能通过)。这个接口的存在是有特别用意留的还是无意中搞出的BUG,不得而知,并且我怀疑车票无忧提交订单的时候不需要验证码就是利用了这个漏洞,而车票无忧利用的话,那它旗下的离线抢票也就必然会利用了。

这里多插一嘴,车票无忧旗下的离线抢票之前有次也爆了串号的问题(又或者是校验出错?),总之有个人找我说了,还截图给我看。结果我一瞄联系人列表密密麻麻,上万页,所以保守估计它的离线抢票规模不小。

其实我对12306总喜欢在高峰期做这样那样的修改感觉理解不了,因为高峰期要保证的事情首要是系统更稳定,而这些变动往往需要测试,需要充足的时间,很明显这不是高峰期所能带来的。高峰期的测试,更接近于压力测试。

 

4.2 性能

当然,新版12306暴露的问题中,最引人注目的还是性能问题。之前13年春运和13年国庆中,虽然买不到票的情况依然无解,但是至少大家都能很顺利地使用网站,不会出现打不开和卡到爆的问题。

之所以这样,个人猜测原因有四,一个是新版12306本身的负载能力相比老版本有所降低,因为更大更复杂的页面和功能设计,内部流程的演变无法估计,可能会造成系统性能的下降;二则自带了官方的刷票,将订票助手的功能从小众化转化为普及化,必然会带来压力的大幅度增加;三是前台的刷票等接口调用时,为了缓存的考虑并没有加入任何限制,导致第三方攻击式的刷新太多(如心蓝、铁路通、离线抢票等等);再者为了人性化的考虑,引入了很多之前没有的接口,如验证码独立查询接口,但实际使用中,这样的接口很容易被触发,如登录的过程中,验证码校验可能会触发三到四次验证码请求,而高峰期被卡死,卡得最狠的也就是验证码校验请求;而众家自动识别验证码也会频繁调用这样的接口导致压力更高。

在后期,为了提升系统性能,12306提高了缓存时间(之前到高峰期查票数据缓存时间一直是2分钟),从2分钟提高到5分钟。意味着同一台服务器上(CDN服务器,不区分用户和浏览器)的用户,只要查询时间、地点一样,查询结果在5分钟之内都不变。这带来了很多问题,比如频繁的过期漏票结果、到整点时无法出票等,后面详解。

 

4.3 设计和规则

 
在封杀页面版的插件一条路上,12306直到13年国庆才找到了正确的路。但新版的12306在各界的炮轰下,很快就又把路走歪了。

12306作为官方的运营,有着充分的主导权,应该做的是建立起完善、有效的秩序,让任何人任何企业想做些动作的时候,都必须遵从自己的限制、自己的规则,不允许逾越,同时对外保持着规则的透明,就像封号后应该给用户明确的提示,而不是搞出一个用户信息有误这样让用户莫名其妙的提示。

新版12306在很多时候,设计中并没有很好的兼顾人性化和性能,并且潜藏着不少问题。比如看起来牛逼异常的卡死浏览器问题,就是设计导致的。在所有的AJAX设计中,AJAX请求默认都是异步的,什么意思呢,就是当浏览器发出请求后,不用等到服务器响应,浏览器可以继续执行其他事情,等到服务器响应后,再回来处理,这就叫异步:请求、等待请求响应和请求的处理是分离的,浏览器不需要连续等待。而在新版12306中,所有的请求全部强制限制为同步请求。什么叫同步呢,就是当AJAX请求发出后,浏览器必须等待服务器响应,在服务器没响应之前(哪怕是出错),浏览器都必须等待、不能做其它任何事情。而现代浏览器的AJAX都是脚本发起的,不是多线程的,因此这样的等待会导致整个界面挂起(脚本运行在界面线程中,所以当一个网页的脚本很慢的时候浏览器界面会卡顿然后告诉你太慢是否要停止)。在高峰期,12306的请求响应几乎是以分钟来计算的,经常会出现一个请求发出去了1分钟服务器都没响应,然后超时了。于是后果就是,在这样的一分钟时间里,整个浏览器都呈现为卡死的状态,直到浏览器弹出来对话框问你网页停止响应了是否要关闭。为嘛儿停止响应了?因为浏览器在等待服务器响应。

大概他们设计的时候没有想到高峰期的服务器响应速度会慢成这样。

另外还有的问题比如查询车票。大概他们对自己的服务器有着过高的期许,查票请求的超时时间被设置为10秒,失败则重查。之前我观察到的情况时,整点高峰时查票请求响应时间几乎是在20秒到60秒之间,这就导致了一个很神奇的问题。就是点击查票——超时——重查——超时——重查——超时——重查。在10秒钟之后的查票结果是正常的,但是用户永远看不到。

喔……说起这个想起来,之前几天12306还有很神奇的问题,就是经常查不到任何车次,具体原因不明。

再比如验证码。验证码作为12306一个用于区分人机的重要手段,但其设计较多存在薄弱环节,不仅导致被破解的概率提升,也导致在高峰期由于大量的破解请求导致服务器负载大量提升。这些设计的存在,虽然很多是为了人性化的考虑,但是很明显,不是任何想买票的人都是那么善良的。

目前12306进行验证码验证的逻辑为:

  • 1.请求验证码图片(服务器生成)
  • 2.调用 checkRandCodeAnsyn 在操作前就判断是否正确
  • 3.连同验证码一起提交,如提交订单和提交登录。这个流程并没有问题,也是比较人性化的操作。但是在整个流程中,没有对时间进行任何限制。在1月份改版后,验证码识别难度已经大大提升,但是这只是导致了验证码一次识别率下降,多试几次,总能识别出一次,加上checkRandCodeAnsyn接口本身没有任何调用限制,导致虽然需要识别多次,但是总体速度几乎还是秒级别的。

以铁路通为例,现在的版本依旧识别验证码,但是识别的过程就是在上述的1-2步骤间来回走,当成功后则跳出。虽然测试的时候需要将近四次才可以识别出来,但是由于现在服务器速度较快,总体花费依然只需要不到两秒。这会导致如下问题:

  • 1.高峰期服务器负载较高,请求响应速度慢,但是这种反复请求并验证的操作很容易导致服务器压力升高很多;
  • 2.当服务器负载不高时,利用此手段依然可以完成既定目标(全自动订票且效率远比人手动高)
  • 3.可能会被暴力利用,如心蓝订票复出版中,有个服务器测速。它的测速不是测CDN节点的速度,而是服务器的速度,测速方式就是爆刷验证码接口,每隔20秒并发20线程请求验证码图片,借以测速。由于验证码的请求、验证是否正确的请求、提交请求都是必须由12306自己的服务器来完成,而不是像查询那样可以由CDN提供缓存,因此被人利用或暴力操作后,对12306的服务器本身也是非常不利的。

 

 

⑤ 为啥买不着票?票都到哪里去了

如果今年真的亲自买票的话,会发现买票的难度是高于去年的。究竟为什么高,原因很多。

首先是12306网站本身的因素。承接之前所言,12306网站在高峰期非常不稳定,买不到票之外还经常崩溃、无法打开,这一切都在折磨着用户的神经。除此之外,造成大部分人感觉票难买的,还有很多因素,比如缓存。

什么是缓存?是12306为了缓解自身服务器压力,部署在CDN层级的一层缓冲界面。简单的说,就是在规定的时间里,如果你连续查询,那么实际上这个请求将会由CDN服务器使用之前查到的数据直接发送给你,而不是真正地去12306查询数据。这个缓存技术在大部分网站上都会使用,连我的网站上都有,只不过12306的这个缓存比较特殊,特殊的原因是其缓存的目标和层级都比较神奇。一般来说,动态查询产生的结果是不应该被缓存的,一般的缓存也必须针对用户和浏览器等客户端进行严格区分,而12306的缓存神奇的地方,在于只要是同一台服务器,它不区分浏览器、用户,只要查询的时间地点一样,就统统进行缓存。这种机制的运用,可以大大降低12306自身服务器的压力。据一些背景资料的了解,在12年春运时,12306系统的查询负载能力RPS(每秒响应查询数)只有300-400次/秒,这种级别的容量在买票的压力面前无异于杯水车薪。12年到13年12306进行了持续的改进,用各种内存数据库分布式大计算,将查询能力RPS提升到25000次/秒,这已经很高了,但是在数量更大的用户面前,这只是一个很小的数字,所以缓存几乎是12306为了自身稳定和负载的无可奈何的必须选择。
除此之外,还有大大小小的各种软件在狂刷服务器,比如心蓝那样的DDOS式的查询、铁路通的秒刷等等等等,以及更多你所见过都没见过的软件,为了更快的看到票,丝毫不会考虑到12306的负载猛刷的情形,都加剧了12306系统的负载。

在不久之前,可能是2分钟的缓存也不够用了,所以12306的缓存时间调整为5分钟。这意味着什么呢,如果没有技术处理,那么你查一次票后的五分钟之内,你都不用查了,因为看到的都是同样的数据。这会有什么影响呢,举两个例子。
一个是放票的整点。你想买票,你不想被缓存陷害,于是你憋着不查票。但是很可惜,缓存不分用户,很不幸的是有人不懂或耐不住寂寞,在59分59秒的时候查了一下,然后只要你用的和他是同样的服务器,那么你就悲剧了,因为在00分59秒之前,你看到的都将是无票,或等待起售。
再举一个例子,你没买到票,在刷新等待余票。前一秒钟你刷新了一次,无票,然后下一秒钟出来了一张退票,但是可惜的是,在接下来的五分钟内,你都看不到它,只能让它在不知不觉中被别人买走。又或者,你看到票了,但是没来得及买,于是你只能再刷新。但是很悲剧的是,在接下来的五分钟里,每次刷票都只能看到一张你永远也买不到的票。

缓存的存在,让买票更像是买彩票,包含了很多的运气成分。唯一幸运的是,当和运气相关时,便和公平无关。

再者,买不到票,也和铁路售票计划以及人的选择有关。
2014年春运售票计划显然比2013年更不透明,限制更多,悲催的是12306从来不会告诉你放票规则,所以你只能郁闷。
我深感不安的,就是限售。限售指的是一趟车沿途停靠的各个站的不同配额受到了限制。在高峰期间,12306放票的基本规则是保(障)长(途)放(弃)短(途),又或者是为了利益最大化?反正就是不明白了。最终的结果就是,太多人看到的车票都是『秒无』的,并认定是被黄牛抢走了。但很多情况下并非如此,很多时候之所以买不到,是因为你的上车站或下车站是过站,被限售了,第一时间不会出票,只有等到后面几天,车次复用时,才会有票出来。

举两个例子。
一个是我帮亲戚买票,从北京到洛阳的。北京始发的高铁,洛阳几乎都是过站。放票的时候我下午两点准时等在12306上,但是,很可惜的是车票就是秒无,我持续刷新了二十分钟,都没有一张票出来。我疑惑了很久,看了看有几趟车的下一站就是终点站西安,于是试着查了查北京到西安的,结果那几趟车都还有六七百张票,但是要多付一百块钱的样子。征求亲戚同意后,还是买了通票。
另一个例子是一个同事,要买北京到无锡的,他想买卧铺,也是始终无票。我看了看无锡是过站,而上海是终点站,就建议他试着刷刷北京到上海的。结果,没过五分钟就买到了。

车票限售其实不是大问题。但是带来的影响很大,以之前帮亲戚买的票为例,从洛阳到西安的那一段是没有人坐的,但是票也卖出去了,不可能再卖,无形中,就浪费了这一段的运力。另一方面,由于限售没有任何通知、没有任何说明,没有人明白这到底是怎么限制的。

如果说限售是因为12306导致的,那么还有很大一部分因素是人自己导致的。很多人说自己买不到票,仔细询问你会发现,他们很多人所谓的买不到,是因为买不到自己想要的:直达或特快,卧铺,时间好,一觉睡到天亮就到了。高铁太贵,临客太慢,座票太累……等等等等,在犹豫间,什么票都没了。更有甚者,自己买不到,请别人帮忙买,买到之后还会各种嫌弃,嫌时间不好,嫌座票太累,嫌车次不好太慢,等等等等,就差嫌弃车编号不吉利了。

在高峰期,最好有目标,当一个车次太热门的时候,建议放弃,直接选择比较容易买的,也不要挑剔太多。可是太多人都会想着便宜实惠舒服还方便,都这么想着,一窝蜂而上,等到买不到的时候回头一看,原本有机会买的车也没有机会了,这能怪谁呢。

当然,在这一切的原因背后,还有一个重要的群体,那就是黄牛。在我的二三十群里面,也埋伏着不少黄牛,我能做的只有发现一个清理一个,因为……他们实在太隐蔽了。

我信奉没有买卖就没有杀害,只是还是那句话,当一个人为了买票『走投无路』时,就什么都不顾了。而黄牛为了买票,则是什么都不顾的,他们不会想着什么是秩序,不会想着怎么让12306稳定,他们能囤到票就行了。所以很多人买票做不出来的事情,他们能做得出来。

我一直宣传着拒绝黄牛文明购票,只不过……这只是我无聊时自以为是的倡议而已……

⑥ 这一切都是12306的问题吗?

很多人都把买不到票归结到12306身上,觉得12306太垃圾了,导致自己买不到票。

当然,话说那么多,其实买不到票很正常。在整个春运中,铁路不过承担了十分之一的运力,而网络售票不过承担了一半的售票量,访问12306的人中,三分之二是买不到的,买不到票很正常吗?买到票的人运气好而已……

而这些12306的质量有关系吗?12306质量好还是不好,票都那么多,不增不减。网站再烂票也全部卖光了,当然被谁买走了可以商榷一下,但这也是各方因素综合的结果,并不单单是一个12306的事情。

归结到高峰期12306瘫痪的问题,也会有很多人诘难12306系统太渣。当然,12306有其不足的地方甚至可以说质量不高,但这不是为了应付春运高峰买票需求而将其负载能力无限制提升的理由。春运售票高峰期不过半个月,为了这半个月将整个系统打造为完全能扛得住的系统,且不说投入要有多少,那么除了这半个月之外的时间,庞大的资源消耗谁来买单?而这些投入不会多出一张票,就不用再说了,更好的系统只是让票卖得更快而已。

当然,也有人提到运力的问题,只是当前铁路的运力已经很高了,和系统一样,越高的运力意味着投入更多,而非高峰时期的资源浪费也会越来越多。高峰时期的线路总是固定的,而相应的反向线路相比而言却几乎无人问津,便是很典型的例证。

当然,也会有人说12306系统投资过大,中间很可能会有各种财务上的问题。虽然这也是很大的问题,但总要把事情分开来看,在买票难的这个问题上,这不是12306所能解决的。

还是那句话,地区发展不平衡。如果地区发展的都还可以,谁会飘零异乡,又不是说走就走的旅行。

写到这里,下午才看过一些新闻,写着被深圳地区遣返的童工,甚至不愿意回去,说至少能吃饱饭,不会受冻挨饿。这些问题,一脉相承,不是12306能解决的,更不是我的解决的。解决这些问题需要很久很久,久到我都不敢带有幻想。

12306和春运,只是偌大中国贫富分化地区差异的一个缩影。

谁错了吗?谁都没错。

喜欢 (1)
发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
(12)个小伙伴在吐槽
  1. 嗯,写的是那么回事。。

    ▓星空無限2014-01-28 10:18 回复
  2. [em]e179[/em] 大神不担技术好,人品也好,忧国忧民!

    观自在2014-01-28 10:00 回复
  3. 占个座,鱼大对12306的耐心真是非一般的好。地区间的经济水平和就业岗位不能平衡,就只能增加运力,虽然一年才可能用到那么一两次,但也比让人有家无法回好的多。就此而言,感谢鱼大。

    阿狼/jie2014-01-27 09:16 回复
  4. 鱼,你好出书了,名字就叫-我与12306的故事。。。只有运营增加,才能一定程度缓解这个供需矛盾,每个朝代多少雄才都没办法改变地区贫富差距,现实中也不太可能

    回家路漫漫-湘2014-01-27 07:06 回复
  5. 实在有点长 读了一半睡着了

    海纳百川2014-01-26 11:55 回复
  6. 实在有点太长,没读完

    丁建康2014-01-26 10:20 回复
  7. 好长呀 看完好累
    写的更累啊~~~~

    每次都义务帮他们总结……

    燕霖/yl2014-01-26 10:08 回复
  8. 机会是给有准备的人。

    海 绵 宝 宝2014-01-26 08:31 回复
  9. [em]e113[/em]

    kingww5882014-01-26 07:24 回复
  10. 原来你在写这个

  11. 一口气读完,感触深刻,过年没票,站票也要买一张回家,预祝超哥新年快乐。

    饭扒光2014-01-26 06:31 回复
  12. 还是占个沙发

    八 月。2014-01-26 06:05 回复