当前位置: 首页 > 科技观察

如何计算12306的剩余票数,具体思路是什么?_0

时间:2023-03-19 23:09:29 科技观察

售票的特点,如果一张票卖出去,会影响整条火车线路的票数:有人在北京到广州的火车上买了石家庄到郑州的车票,也就是说发车点是北京-石家庄,目的地是郑州-广州的所有情况都会少一张票。1.最低的方法。每查一张票,就计算各站的票数,取最小值。假设共有3个站,北京、石家庄、广州共10个席位。有人想查询北京-广州的车票:北京-石家庄9张,石家庄-广州1张已经售出。在中间站取10-9=1的最小值,还剩一个。这样如果是20个站去查两端车站的剩余车票,就要计算19次,然后找最小值。为什么说低呢?因为票不多但是查剩余票的人太多了!而且人也不傻,没票了就刷新!所以一次访问算20次,10万人加上每个黄牛开10台电脑刷票,即时访问量达到100W。如果想在1秒内得到响应,需要1秒计算2000W次。2.稍微好一点的方法。买票时,计算各站剩余车票,查询剩余车票时直接返回此结果。同样是每秒100W次访问,但是这一秒只有1000人买票,剩下的票只需要1000*20=20W次计算,节省了1800W次计算。3.更“实用”的方法。数据状态每1秒同步一次。假设12306每次检查剩余票需要更新1k数据。一般单网卡带宽为1G,理论上可以支持12.8W的同时访问。如果100W人想看,至少8台服务器在工作。方法2中,需要存储剩余的票。8个副本,需要1000*8=8000次更新。我们还需要考虑到各地访问量的不均衡性。电信、网通、铁通等线路,整体火车票情况数据量都是几十K,所以每秒更新8000条也是上百兆的流量。但是如果当前数据状态每1秒同步一次就更好了。这样1*8=8次编程,数据库更新传输总量大概1M/s,差不多吧?即便如此,它仍然无法处理流量。因为电脑上的12306使用的是网页方式,查询票的页面大小是6K,即使用ajax刷新一次京郑,这么大的站也需要传输7K的纯json数据,个人感觉很多字段被浪费了。没用的。所以在我看来,12306可以做以下改进,并不是所有的问题都需要用技术来解决。1.已经搞定,分段放票,减少拥挤2.12306自制一个不错的抢票软件。既然抢票权掌握在自己手中,刷票软件就会少很多,流量会大大减少。3.不要乱用现在的图片验证码。这些验证码是刷不出来的。识别度低的基本就是暴力反刷,不仅要反bot,还要反真人。4.更改抢票规则。总之就是看手速、网速、人品。何必费心大家刷卡刷卡呢?编写算法并分配它。供求矛盾是主要矛盾。如果供大于求,势必导致买不到票。不可能。有的评委想学高性能、高并发、分布式的网站架构设计,我还真不知道。。。推荐看这两本书,《大型网站技术架构_核心原理与案例分析_李智慧》、《大型网站系统与Java中间件实践》、?好。由于12306的openquestion太大了,我只能说说看到为什么买不到票的最基本情况。12306网站是世界上最繁忙的网络之一。因为在某个时间点有大量的人访问网站,所以网站的并发处理能力非常高。本人是IT菜鸟,给没有计算机基础的评委普及一些粗浅的知识。别笑。网上有这样一张统计图表:1、网站运行情况如何。用户想知道有没有票,于是打开网页,网站后台查询自己的数据库,查看是否有用户需要的数据,然后将结果显示在页面上,形成页面上的剩余门票信息。然后用户看到:咦~有票!买买买!点击购买后,网站后台会更新用户在数据库中的订票信息:北京到巴黎的100张机票已更改为99张,购票成功。我这里说的很简单,没有提到支付链接和退票。我们先来看这个简单的例子,画出这样的图:2.当有101个人抢票时会发生什么?这是一个悲剧,现在抢票更接近现实。早上8:00:00,同时有101人想抢这100张票。会发生什么?对于一个人来说,网站实现“查多少票”(检索数据库),“买票”(修改数据库)的时间很快,大概在50ms以内,执行的很顺利。但是呢101人同时点击购买了?按照上图的简单流程,多卖了一张票!因此,需要多一层校验:由于不止一个人同时购买了一张票,当你看到票数点击购买的那一刻剩余票数其实是在购票的瞬间发生变化的!所以在买票的时候,你会再次查看剩余票数。如下图所示,虽然红框是同时出现的,但是你的网速不快。。。所以,你买的时候看到有票,但是没有票。3.百万人同时访问一个网站怎么样time?基本上和上面一样步骤是一样的,但是ba网站的ckground将用于展示用户的数据库和用于重写系统的数据库分开。即有一个(多个)数据库专门供用户阅读,一个数据库专门用于加减运算。内容在它们之间定期同步。(用于改写的数据库称为主库,用于读取的数据库称为从库。一般只有一个主库,从库有很多个,主库的数据同步到slavedatabase每隔一段时间。)查看票数当我只访问slavelibrary时:还有票,太高兴了!买票的时候改成参观主库:你姐!约定有票!最后:12306在实际应用中的过程要比这个复杂的多,比如同时10个人抢票给谁?这么大的流量处理不了怎么办?因为车次太多,少一张票会影响整条火车线路。计算量太大怎么办?40分钟等候时间的票呢??所以这里只列出一般情况下比较简单的逻辑,看看就对了。