Monday, November 30, 2015

你会怎样设计铁道部购票网站?- System Design



http://www.raychase.net/291
最近铁道部购票已经成为了热点话题,毛病多得一塌糊涂,如果让你来设计铁道部购票网站,你会怎么做?

这样的网站属于实时性要求较高、并发性要求非常高、容量要求一般的类型,以下是我简单的想法:

1、部署是基于CDN的,对于车票查询的环节来说,这是没有问题的。

2、数据库表设计上面,应当有一张车次表,每行代表一趟车,至少有这样的字段:还剩多少张,已被锁定多少张。

3、每次发生订票操作时,先去查询当前是否有余票,有的话锁定一张等待用户操作,如果半小时内无法完成,锁定票放回。

4、查询部分,集群中放置分布式缓存,存放数据的静态页面,但由于车票查询实时性有一定要求,可以设置每个查询页面有10分钟的生命周期,缓存文件管理算法用LRU就可以,被动更新。如果车票信息在本地,数据库节点应该会是瓶颈,好的缓存设计会很讨巧,可以大大减小数据库压力。

5、应用节点的负载分担是一定要做的,查询和订票操作可以分开集群,有条件的要做硬件负载。

6、静态资源合并,落到单独的域名服务器上。

7、流量控制部分,不能只给出用户提示,应当给出用户当前在等待队列中的位置,定时更新当前位置,在排队到达后,要页面通知到用户来完成操作。

8、订票当次处理成功以后,接下去的出票等等操作放在队列中进行,等待银行把款转过来,这部分也有一定实时性的要求,应当和响应用户的应用服务器分开,免得互相干扰。

还有一些疑问也值得讨论,很有意思,比如遇到那些抢票机器怎么处理。

——————————————————————————————————————————-

2012-1-14,根据大家的讨论摘选有意义的进行补充:
1、车次票需要包含若干个区间票。
2、倘若按照10分钟的页面缓存过期时间,用户很可能还是不愿意接受的,需要把数据直接写到内存里面,查询在内存里面查询,数据库只做适当时机下的持久化和数据同步用。
3、关于和淘宝相比的访问量,不见得有淘宝的大,见日均IP的统计:你会怎样设计铁道部购票网站?
关于PV,这句话很有道理:
“12306真的有这么大的PV量吗?现在的PV这么大,那是因为我查询100次,1次也查不成功,所以我就不断的刷,这本身就是在逼迫全国人民对其进行Dos攻击。如果查询的成功率、订单的成功率提升了,估计PV会直线下降。”所谓恶性循环变指此吧。
4、关于数据库要不要集群,从目前的系统看,瓶颈不在此,而在考虑了采用内存数据存储和直接命中以后,似乎还没有这个必要。

Labels

Review (572) System Design (334) System Design - Review (198) Java (189) Coding (75) Interview-System Design (65) Interview (63) Book Notes (59) Coding - Review (59) to-do (45) Linux (43) Knowledge (39) Interview-Java (35) Knowledge - Review (32) Database (31) Design Patterns (31) Big Data (29) Product Architecture (28) MultiThread (27) Soft Skills (27) Concurrency (26) Cracking Code Interview (26) Miscs (25) Distributed (24) OOD Design (24) Google (23) Career (22) Interview - Review (21) Java - Code (21) Operating System (21) Interview Q&A (20) System Design - Practice (20) Tips (19) Algorithm (17) Company - Facebook (17) Security (17) How to Ace Interview (16) Brain Teaser (14) Linux - Shell (14) Redis (14) Testing (14) Tools (14) Code Quality (13) Search (13) Spark (13) Spring (13) Company - LinkedIn (12) How to (12) Interview-Database (12) Interview-Operating System (12) Solr (12) Architecture Principles (11) Resource (10) Amazon (9) Cache (9) Git (9) Interview - MultiThread (9) Scalability (9) Trouble Shooting (9) Web Dev (9) Architecture Model (8) Better Programmer (8) Cassandra (8) Company - Uber (8) Java67 (8) Math (8) OO Design principles (8) SOLID (8) Design (7) Interview Corner (7) JVM (7) Java Basics (7) Kafka (7) Mac (7) Machine Learning (7) NoSQL (7) C++ (6) Chrome (6) File System (6) Highscalability (6) How to Better (6) Network (6) Restful (6) CareerCup (5) Code Review (5) Hash (5) How to Interview (5) JDK Source Code (5) JavaScript (5) Leetcode (5) Must Known (5) Python (5)

Popular Posts