大家讨论一下12306
昨天购票发现12306那是超级的垃圾啊,慢不说,还多次买不上,今天早上花十分钟想了一下,决定按照12306工程师的水平给他们出点主意,大家讨论一下,看那种改进比较好,说不定让那帮人看到了也可以改善一下性能。
有人说这个网站没有做集群,或者是个业余做的当然都有可能,这件事虽然能难倒铁道部,但是为了我们以后买票顺利,我特地观察了一下,作为一个菜鸟,想给铁道部外包做12306的技术同仁出点主意:
改进无非就是这三点:(另外这里不讨论什么多层架构,什么的,我觉得12306的可能掌握不了那种技术)
1、前端服务器。我想服务器集群来增大抗压力他们肯定想到了,但是可能没有做,因为有原因。
2、数据库方面。数据库拆分。我想他们用的肯定是好的数据库,oracle,或者db2. 不应该用mysql,或者mssql,(别告诉我你们真用的mysql,开个玩笑)
3、语言实现,服务器性能。
首先做一些猜测,有人说淘宝啊,百度啊,什么的可以支持多少多少人在线,为啥12306就做得这么差,其实12306和淘宝、百度上需求有明显的不同。为啥这么说,打个浅显的比方,淘宝他是一个分散性的系统,登录的人确实多,交易的行为也确实在同一时间发生多次,其实他对数据库的要求小一点,因为淘宝是多对多的关系,大量的人访问大量的页面购买大量的不同的东西,这样的话他对数据库的压力要小,因为数据库事务锁或者同步不是那么麻烦,但是12306却是大量的人在极短的时间购买同样的而且还是量少的东西,所以前者淘宝只要把集群做大,把负载做平衡就ok了。但是12306不仅要做到淘宝所做的(就是集群,负载平衡)还要从业务上改善数据库事务锁的性能。(当然淘宝可能用了一些内存数据库啊,缓存什么的,这里不讨论就是说一下他们的区别)
上面说的也许有人觉得不是这样的,其实我觉得差不多这样的,大家都知道京东,苏宁一做起活动的时候网站就慢得要死,也是这个原因,但是好像相对比12306要好点,好点就在于12306的商品比苏宁,京东更少,当然可能京东技术也要好点。
所以针对以上几点
第一:12306该做集群的要做集群,该做负载平衡的要做负载平衡,别把给的钱都贪掉包二奶。
第二:因为做了集群,就意味多个Server 要同时访问一个DB(或者几个但是数量绝对不多),这样还是有瓶颈限制的,我想这点应该是他们限制很多用户同时登录的原因,并且这点才是他们的技术难点。首先我们猜测之所以他们要访问同一个DB是因为有如下几点:
a、铁道部的票源是全国联网的,所有的终端都要及时的反应出票源的变化。
b、并且终端有多种形式,总结起来就有电话终端、12306终端、车站售票处终端、代售点终端。
c、铁道部需要实时的掌握余票信息。(如果分多个db,这点就要求同步麻烦)
其实通过以上几点我们可以看出对12306我们是可以分成多个DB的。但是需要满足一下条件:
a、将电话终端、12306终端、车站售票处终端、代售点终端分离开来,根据现在的预售时间是可以的,比如 拿出一半(多少无所谓啊,只举例)的票源在12306买。
b、将各个终端之间的余票查询分开就是12306查余票就是查自己的,
c、12306提前2天开卖,电话提前1天开卖,其他终端正常
只要做到了上面几点就可以把DB分开
解决方法:
1、我们分多个DB,怎么分呢?极端情况一趟车分一个DB(当然这个根据实际情况决定),这时我们用mysql就可以了,这样就把户买票时相对同一个DB的压力分散了。DB就不存在事务锁的瓶颈了。整个网站就从订票到购票就会快很多。
2、由于分了多个DB那个12306的余票查询就会变得比较复杂,因为每趟车的数据都在一个库里面。那么这个时候我们就增加一个内存数据库,用作查询余票。中间写个缓存更新器,每3min把查询缓存数据库更新一下,这样就ok了(实际上他先择余票查询也是不准的)。
3、每个数据库和集群之间要用光纤模块直连,这个钱不能省。这样我们订票就OK了
这样在12306卖出每天的第一批狂抢的爆发点后平常的压力就非常小了,这个时候就可以走现在的购票模式了。这时就同步主数据库。实现和其它终端的共享
我只是从12306的业务特殊性分析了一下,整个的架构啊没有怎么想,大家讨论讨论,13e中国人总该能做出一个登得上去的网站吧。