http://www.raychase.net/291
最近铁道部购票已经成为了热点话题,毛病多得一塌糊涂,如果让你来设计铁道部购票网站,你会怎么做?
这样的网站属于实时性要求较高、并发性要求非常高、容量要求一般的类型,以下是我简单的想法:
1、部署是基于CDN的,对于车票查询的环节来说,这是没有问题的。
2、数据库表设计上面,应当有一张车次表,每行代表一趟车,至少有这样的字段:还剩多少张,已被锁定多少张。
3、每次发生订票操作时,先去查询当前是否有余票,有的话锁定一张等待用户操作,如果半小时内无法完成,锁定票放回。
4、查询部分,集群中放置分布式缓存,存放数据的静态页面,但由于车票查询实时性有一定要求,可以设置每个查询页面有10分钟的生命周期,缓存文件管理算法用LRU就可以,被动更新。如果车票信息在本地,数据库节点应该会是瓶颈,好的缓存设计会很讨巧,可以大大减小数据库压力。
5、应用节点的负载分担是一定要做的,查询和订票操作可以分开集群,有条件的要做硬件负载。
6、静态资源合并,落到单独的域名服务器上。
7、流量控制部分,不能只给出用户提示,应当给出用户当前在等待队列中的位置,定时更新当前位置,在排队到达后,要页面通知到用户来完成操作。
8、订票当次处理成功以后,接下去的出票等等操作放在队列中进行,等待银行把款转过来,这部分也有一定实时性的要求,应当和响应用户的应用服务器分开,免得互相干扰。
还有一些疑问也值得讨论,很有意思,比如遇到那些抢票机器怎么处理。
——————————————————————————————————————————-
2012-1-14,根据大家的讨论摘选有意义的进行补充:
1、车次票需要包含若干个区间票。
2、倘若按照10分钟的页面缓存过期时间,用户很可能还是不愿意接受的,需要把数据直接写到内存里面,查询在内存里面查询,数据库只做适当时机下的持久化和数据同步用。
关于PV,这句话很有道理:
“12306真的有这么大的PV量吗?现在的PV这么大,那是因为我查询100次,1次也查不成功,所以我就不断的刷,这本身就是在逼迫全国人民对其进行Dos攻击。如果查询的成功率、订单的成功率提升了,估计PV会直线下降。”所谓恶性循环变指此吧。
4、关于数据库要不要集群,从目前的系统看,瓶颈不在此,而在考虑了采用内存数据存储和直接命中以后,似乎还没有这个必要。