12306简单设计

本文探讨了12306购票系统的高并发问题,提出了通过设置网关服务器、动态DNS分配和使用内存队列进行排队的设计方案。用户获取随机ticket id后按顺序购票,使用session id进行实际购票流程,并设置了session的有效时间。该设计减少了对数据库的依赖,提高了系统在高并发情况下的处理能力,同时也改善了用户体验。
摘要由CSDN通过智能技术生成

任何设计都要分析问题需求,找到瓶颈。12306如果并发很少,那么就是一个很普通的购物商城的模型。单机器可能就可以解决了。但是由于12306平时访问量很大,而且部分时间段访问量会突然增大所以基本上讨论的问题就集中在以上两点。

看到风云12年的一篇博客上有当时对此问题的分析。提出的方法如下:

“ 我们设置几个网关服务器,用动态 DNS
的方式,把并发的订票请求分摊开。类比现实的话,就是把人分流到不同的购票大厅去。每个购票大厅都可以买到所有车次的票。OK
,这一步的负载均衡怎么做我就不详细说了。

每个网关其实最重要的作用就是让订票的用户排队。其实整个系统也只用做排队,关于实际订票怎么操作,就算每个网关后坐一排售票员,在屏幕上看到有人来买票,输入到内部订票系统中出票,然后再把票号敲回去,这个系统都能无压力的正常工作。否则,以前春运是怎么把票卖出去的?

我们来说说排队系统是怎么做的:

其实就类似我们去热门馆子吃饭拿号。只不过要防止别人伪造号插队而已。

如果你来一个人(一次 HTTP 请求),我就随机产生一个我做过一些签名处理的号码返回给你。暂时称为 ticket id 。这个 ticked
id 是很难伪造的。

系统在内存里开一个大数组(32G 内存够排上亿人了吧),就是一循环队列。把这个 ticket id 放在队列尾。

用户现在拿着 ticket id 向网关发起请求。网关利用一次 hash
查询,在内存中的数组队列里查到它的位置,立刻返回给用户。用户的前端就可以看到,他在这个网关(售票大厅)前面还有多少人等着。

这里的关键是,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值