博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
12306买票难的一些思考
阅读量:6264 次
发布时间:2019-06-22

本文共 1220 字,大约阅读时间需要 4 分钟。

hot3.png

买票难,难在供需关系,除了数量上,还有可获得性上。一个回家的火车联运方案,从某个始发站到某个终点站,票的供给在于放给该始发站的所有可到终点站的票数,当然还可能包括始发站之前的一些站到终点站的票数。而需求更大。更关键的,是需求释放的时间较短,构成并发。而网站需要在较短时间内,处理这些并发,按先到先得原则,给各请求预放票,生成订单,支付成功后放票,支付不成功不放票。

我们具体来看看用户的操作行为:

1, 登录12306网站,或app;

2, 用户注册;

3, 用户登录;

4, 用户选择日期,始发站,终点站,查询车次,车票,座次,铺次,价格,历时等信息;

5, 客户预购票;

6, 排队,预放票;

7, 支付,放票;

逐个进行分析:

 

1, 登录12306网站,或app;

输入一个域名,经过dns解析,指向到某ip地址和端口,通过负载均衡,跳转到对应的web服务器。这里可以在全国部署sdn分布式集群,让不同的用户根据物理距离或ip源,经过一个统一的负载均衡策略,指向离客户端最近的一个web服务器,以节省传输的速度。

这种部署有地域性和时效性问题。地域性是指我国幅员辽阔,如果在全国所有地区都自费建立分布式机房的话,成本会非常大,可以集中在几个大的站点进行部署。时效性是指这种并发主要集中在重大节假日,可以只在这个时期使用这种策略,或者在这段时期把这种策略部署得更全面,平时可以不进行使用。还可以通过市场化方式,临时购买一些云服务器或者租用一些稳定的服务器进行部署。

另一个是将买票卖票的业务数据单独剥离出来,作为一个独立域名,将12306现有的其他辅助功能通过链接的方式跳转出去,让网站专注于查询和购票。

同时将网站的很多资源静态化,减少使用图片,动画,特效等,减少带宽压力,最好做成纯文本类型(图片校验除外)。

 

2, 用户注册;

增加注册和校验难度,实名制,手机,身份证验证,防止机器人。

 

3, 用户登录;

用redis-Hash缓存session,账号信息,登录时间和次数,单点,防止恶意登录,浪费资源。

 

4, 用户查询;

这个是第一个重点。我的想法是,把每个车次都作为key,而这个车次的其他信息作为value存入redis-Hash中。缓存有效期可以根据需要设为5-15-30秒。

单列火车的查询,在火车表中,建立起始站和终点站的索引,从起始站到其他站的车票数量,是起始站到该站的所有站与站之间的车票数量最少的那个值觉得的,类似于木桶理论。

多式联运(转车)的查询,需要在每列火车之间简历簇索引,具体可参见 https://new.qq.com/omn/20180423/20180423G08ZGL.html

每次成功放票后,集中一个时间点如15-30秒去更新一次缓存,主要是票数,还有车厢,座位号等。

还需要思考,明天再写。

转载于:https://my.oschina.net/u/3412738/blog/2236910

你可能感兴趣的文章
内存分段与分页
查看>>
第一个WindowService服务
查看>>
zookeeper的三种安装模式
查看>>
腾讯2014实习面经 —— 面试经过回忆
查看>>
MIT Scheme 使用 Edwin
查看>>
BZOJ1500:[NOI2005]维修数列——题解
查看>>
transactionscope报“此操作对该事务的状态无效”问题
查看>>
css3(border-radius)边框圆角详解(转)
查看>>
[摘录]第2章 中场谈判技巧
查看>>
11.21日工作总结
查看>>
第一本docker书 学习笔记(二)
查看>>
leetcode--Minimum Depth of Binary Tree
查看>>
ToolBar
查看>>
面向对象软件设计原则(五) —— 应用示例
查看>>
关于数据结构(一)
查看>>
正则语法的查询,这是纯转载的,为了方便查询
查看>>
【spring cloud】spring cloud zuul 路由网关
查看>>
【javaw.exe 两个】启动了两个javaw.exe 相关
查看>>
使用GDAL构造OpenCV的图像格式
查看>>
Android中使用JUnit测试
查看>>