1. 聚能聊>
  2. 话题详情

史上最难抢票年,聊聊春运背后的数据库设计难点与思考

20161124_02_pic_004

马上春节了,听说今年是史上最难抢票年,一票难求的问题依旧存在,身为程序猿的你有没有什么技术抢票的高招?

还记得10年前春节前买火车票得在放票前1天搬个小板凳去排队,对于热门路线,排一个晚上都有可能买不到票。

随着互联网的发展,几年前建设了12306网上购票系统,可以从电脑上买票,但是不要以为在电脑上就能买到票。

记得12306刚推出时,经常发生12306网站打不开,无法付款的问题。

为什么呢?

原因很简单,春节期间网上购票的人可能达到几亿的级别,而且放票日期是同一天同一个时间点,也就是说同一时刻12306要接受几亿用户的访问。

处理能力和实际的访问需求更不上,带来的结果就是网站打不开,系统不稳定的现象。

随着硬件的发展、技术的演进,12306的系统越来越趋于成熟,稳定性和响应速度也越来越好。

据说现在很多商家还开通了云抢票业务,本质上是让你不要冲击12306系统了,把需求提前收集,在放票时,这些系统会进行排队与合并购买,这种手段可以减少12306的访问并发。

抢火车票是很有意思的一个课题,对IT人的智商以及IT系统的健壮性,尤其是数据库的功能和性能都是一种挑战。

虽然很多人并不知道12306到底使用了什么技术,是如何设计的,但是并不能阻止IT人不断思考的内心。

我先帮大家揭开这神秘的技术一角 《12306的西天取经路 - 春节抢票与PostgreSQL数据库设计思考》

欢迎大家来讨论

* 回家的票你买到了么?关于春节抢票,程序猿们有什么技术高招?

* 12306背后的技术大家也来一起猜想一下,有哪些在云上的应用?

* 什么样的数据库设计,可以支撑几亿人肉DDOS的查询与售卖?

参与话题

奖品区域 活动规则 已 结束

  • 奖品一

    淘公仔 x 1

  • 奖品二

    定制笔记本 x 1

  • 奖品三

    程序员礼盒 x 2

152个回答

1

海童 已获得定制笔记本 复制链接去分享

如果12306架构设计的好,那么在高峰期(比如春节),可以通过水平扩展的方式租用服务器,空闲时期在归还,节省成本。 对于用户请求层面,通过增加机器,负载均衡是比较容易做到的。在数据库层面,当增加新机器时,可以自动将数据进行分片,降低每台机器的负载,提高响应速度。 当然,实际设计和编码起来还是有难度的。

神垕 回复

现在12306设计的应该有,这部分是靠公有云和私有云结合使用的

hzabyte 回复

动不动就提分片当万能药。能分片的12306肯定已经分了。问题是票量要归结,中途上车的要和中途下车的要对接,这个总数如何分片中实现同步?

云栖技术 回复

我感觉你的问题要被采纳。

ruanxiaojun 回复

集中与分布相结合方案: 设立一个中央数据库和若干个地区数据库,在地区数据库中存储本地区始发列车的座席数据。该方案综合了集中式和分布式两种方案的优点,避免了两者的缺点。既 便于异地购票、座席复用、信息共享,又相对减少了网络的开销;设备投资合理,升级更新容易;兼顾了技术先进和现实可能;既可适应体制改革,又能适应现状, 具有较大的弹性和适应能力。
中国铁路客票发售与预订系统由中央级、地区级和车站级三层结构组成,包括全国票务中心管理系统、地区票务中心管理系统和车站电子售票系统。系统采取集中与 分布相结合的方案,在全路票务中心内安装中央数据库,Sybase领先的数据库产品Adaptive Server Enterprise、Replication Server、Adaptive IQ,中间件产品Open Client、Open Server以及开发工具PowerBuilder和PowerDesigner在其中都有着非常重要的应用;这一系统主要用于计划与调度全系统的数据, 并接收下一系统的统计数据和财务结算数据。在地区票务中心设有地区数据库,Sybase的Adaptive Server Enterprise、Replication Server、Open Client、Open Server、PowerBuilder、PowerDesigner将全面支持这一数据库,它主要用于计划与调度本地区数据,并可响应异地购票请求。系 统的基础部分是由Sybase的Adaptive Server Enterprise、Replication Server、Open Client、Open Server、PowerBuilder、PowerDesigner构成的车站售票系统,它主要具有售票、预订、退票、异地售票、统计等多种功能。中国 铁路客票发售和预订系统实现了计算机联网售票,并且有出售返程、联程等异地购票的功能,实现了票额、座席、制票、计算、结算和统计等计算机管理,为铁路客 户服务提供了有效的调控手段,标志着中国铁路客户服务已走向现代化。

kungge 回复

你说的,12306肯定都有考虑,租用服务器应该是有的,毕竟现在云服务器提供商太多太多。因为票务系统是很复杂的,比单纯的淘宝买东西复杂多了,所以技术层面就某些数据分片负载均衡要看能否适用。

sclm 回复
回复@hzabyte:

按车次分不就可以了。

评论
2

szm. 已获得程序员礼盒 复制链接去分享

提前30天放票当天就买到了,用了智行帮抢票,结果没加钱根本抢不到,倒是自己手动买的很容易买上。
做为买过好多次火车票的人,总结出几个经验:1. 每个车站放的票是有比例的,你搜的起点到终点没票,不代表这条线就没票了,可以试试起点向前几站,终点向后几站,说不定会有意外惊喜。2. 放票的一瞬间抢票失败率会很高,主要是抢票的人太多服务器压力大,导致出票错误率高,可以等几分钟,或者几十分钟,等峰值过去再抢。3. 迫不得已的话只能转乘,这个不用多说了。
其实得益于阿里的技术,抢票已经好多,由于火车票不像商品,被一个用户买了就没了,而是有可能一个位置被多个用户共用,并且要求同一张票只能属于一位乘客,因此复杂度很高,能达到当前的技术已经很不错了。
个人对于减轻服务器压力的几个想法:1 放票时间可以进行划分,而不是放在同一个时间点上,这样可以起到一定的分流作用。2 可以在出票时隐藏座位信息(一段时间后显示),减少乘客因为座位问题而多次退票。3 监测购票信息,发现大量囤票等行为进行干预。

kungge 回复

等个几分钟?就是等个十秒都全都没了,后面刷屏概率更低。

szm. 回复
回复@kungge:

可能是我回家的那段路人相对较少吧

szm. 回复
回复@kungge:

可能是我回家的那段路人相对较少吧

小邦 回复

并不能分流吧,但凡放了票,无论多少,都会一窝蜂上去抢。

评论
1

mr.蜜 已获得程序员礼盒 复制链接去分享

从提前一个时间段购买火车票,这本身就是会引起高并发,何况回家过年这种年度潮汐式迁移,每年都有,为什么要让买火车票变成抢票呢?分布式数据库固然好用,读写分开也能从一定角度缓解高并发,单这种几亿的高并发量所需要的设备量,在平时就变得极其浪费资源。由于回家过年的人需求很简单,“我只想买到回去的车票”,至于买的是哪个座位,那个班次,并不是特别在意,那么为何不实用预约等机制来消耗掉这种高并发呢?让高并发的可能只存在于零时出行,那么是不是可以解决一些问题呢?

2

ljm52013 复制链接去分享

现在总体很稳定,至于抢不到票,这跟系统本身没有关系,t和运力有关系。因为票源是有限的

德哥 回复

总体已经越来越稳定了

云栖技术 回复

我们利用技术可以吧紧缺的票源,紧紧抓住。

评论
0

黄赞赞 复制链接去分享

没抢过,现在人脸识别技术挺成熟的,可不可以考略下人脸识别技术呢?

一人只能买一张票,干掉什么牛党。
但这只适合手机抢票。

聚小编 回复

刷脸抢票这个点子不错呢~

wuxiangege 回复

双胞胎,怎么办?

ichina 回复

双胞胎长的不太一样的。系统可以识别。哈哈

云栖技术 回复

那要是替别人买票么。存在很多局限性,随着科技日益进步,总有一天会实现的

ruanxiaojun 回复

根源是运力不足,跟什么技术没有多大关系,最后拼的是服务器和网速。如果票源充足,就不会出现抢票;

评论
1

风水师 复制链接去分享

说到买票,就是一个供求关系的失衡。买票人多票少。再好的网站也解决不了这个问题。只有说分散经济中心,让人口吸引在自己家庭附近,买票需求少了。怎么也不会出现买票难的这个问题。

德哥 回复

好提议,大型城市失去中心地位,也会阵痛的,要靠特色来留人了。

云栖技术 回复

这现在的社会,是一个人吃人的社会,人民素质得不到提高,无法达到发达国家的水准,还需要时间

zoup 回复

分散经济中心是不可能的,不管是从前,还是现在,年轻人和劳动力都是往大城市跑,机会更多,工资更高。不管是中国,还是美国、日本、英国,都是这样。

评论
0

anpho 复制链接去分享

买不到票的一个原因,是系统里面的预留票。比如济南到潍坊没票,但是济南到青岛却可能有几百张票。

天真丶无邪 回复

深有同感,北京到淄博的没有票,同一个车,北京到青岛就有好多

杜龙少 回复

青岛始发有很多票,而下一站高密就没票

hzabyte 回复

优先保证起点到终点的。。。这也是因为铁道部门复杂的业务逻辑引起的买票难度。

云栖技术 回复

策略不同,铁道部也是要赚钱。预留长途票。就好比程序的权限一样,哈哈。我大中国,泱泱大国,过年国家过年,安内都成大问题,如何攘外呢,应赶紧整治,贪污腐败,社会风气,求一个稳定发展。

狼窝炮神 回复
回复@hzabyte:

这倒不一定,我从洛阳(始发站)到福州(终点站)的火车第二站是郑州,买洛阳到福州没有,买郑州到福州一大堆。

评论
1

xxmocco 复制链接去分享

票已到手,还是官网靠谱

andr0id 回复

是啊,第三方付费刷的都没刷到,来回的票都是在官网顺利抢到的

jo-obj 回复

第三方Bug不比12306少

评论
0

1999483631685740 复制链接去分享

高速如此发达,为什么还是一票难求。

德哥 回复

春运高速也堵d

zoup 回复

因为一直都是一票难求,只不过互联网的存在,加速信息的流通,一票难求的问题被放大了看,自然是难以解决的。而且如果在春运这种时候都能满足运力要求的话,那铁总必然亏本,因为平常维持铁路运营的成本很高。

评论
2

神垕 复制链接去分享

能不能把第二天要出售的票,前一天晚上数据同步到缓存中,然后第二天从缓存中查询数据。

聚小编 回复

缓存风险是不是比较大

评论
1

一个人的! 复制链接去分享

看了阿里云一位工程师短视频,大概了解一点。用了一个伏羲的架构解决了这个难题。

聚小编 回复

亲一定是看过技术峰会的直播的,赞

阿灿君 回复

66

评论
3

ewingz 复制链接去分享

改变业务架构是根本,尽量推出提前预定或者集体抢购的方法。瞬间几十亿并发读写可能是目前任何硬盘数据库集群系统都无法搞定的。还有一个思路就是每天交易的售票数据使用内存存储,夜间再导入硬盘存储。这么干数据危险性大

0

51干警网 复制链接去分享

貌似抢票不难吧。春节探亲往返票已经入手。
QQ_20170105113216

聚小编 回复

赤裸裸的炫耀啊

可可口口 回复

23块钱的票,目测最多200公里吧

神垕 回复

同在郑州!

51干警网 回复

老司机。对的~

51干警网 回复
回复@神垕:

我说禹州的,搞不搞?

51干警网 回复

来啊,放纵吧。

评论
-1

1694970641463023 复制链接去分享

我买的域名无缘无故全没了,阿里云发个邮件截图如下,按照他说的去操作,一下全没了,阿里云官网客服电话还永远打不通,没人接,全是机器人。。。气死我啦
online/75e70e6eb5074ca5933875561d1fdb9d_b63344588aee4b1686925ac4e8f78985.jpg

聚小编 回复

亲,你反馈的账号中没有域名的购买记录,此账号下的手机号也一直无法打通,我们的客服MM无法联系到你。建议你用购买域名的账号提交工单反馈此问题,或是留下可以联系到你的手机号。

评论
0

wang8231690 复制链接去分享

多弄几班车,比啥都好使 ……

小北56 回复

哈喽kity 回复

车太多,管控不过来!

评论
0

undifined 复制链接去分享

一票难求的根本原因是铁路局运力问题,应该缩小各地区发展差异……

德哥 回复

好提议啊,现在流动人口太集中了,要加快城镇化发展

评论
2

hacker-dba 复制链接去分享

票资源有限,你就算数据库提交成功再快也是一千个人抢100张饼,买不到票的依旧买不到

2

1985147208754918 复制链接去分享

其实就是人肉DDoS啊^

1

小邦 复制链接去分享

可以试试抽票,跟抽车牌号一个道理。12306可以改建为抽票系统,抽票时间全年皆可,一个身份证只抽一个号,期间也可退换。最后关闭网站,由服务器统一随即分配,再公布。

1

文件备份 复制链接去分享

上面都是专家,技术上面分析的很有道理,不过无外乎,读写分离,分布式,减少中心库的压力;这个符合解决问题的主题思路。但是这些思路必须有个前提条件,市场经济经济条件下来的自由买卖关系;同志们,#火车票#在现阶段(基本国情,基本交通工具以及基本文化等考虑)并不符合市场经济下的基本买卖关系,所以说,从公平性等各方面权衡考虑,我的方案来了。

借鉴打新股的方法就行,在春运等特殊节假日的情况下,提前60天提需求,下定金,系统抽签决定谁能拿到票;可以不断的提需求,只要有票,就自动抽签去决定谁能拿到票。

如此一来,黄牛是绝对没有生意了;无论你是谁,对你来说,机会都是均等的。

如此的设计,找几个实习生就搞定了...

8