PHP-排队系统设计

需求定制 需求定制 主题:1050 回复:2283

PHP-排队系统设计

归属感 发布于 2017-09-28 字数 369 浏览 1225 回复 3

请教一下铁道部的排队系统是怎么做的?
因为我理解HTTP是一个无连接的协议,网页一加载完成就没服务器什么事了,
服务器怎么知道有多少人在等?是不是每一个访问的用户开一个SESSION?
但如果这时候用户将网页关闭了,这时候队列里就应该删除一个用户,服务器是怎么知道
用户关闭了网页的?
服务器端的队列是怎么维护的?
好困惑啊,高手们能不能提供个思路啊

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

支持 Markdown 语法,需要帮助?

评论(3

想挽留 2017-10-25 3 楼

我没用过12306那玩意儿买票,也就不清楚上面是怎么实现的了。
不过我的思路是,作为网上排队,不应该沿用生活中那种弱智的以活生生的人来作为排队凭证的做法,这完全就是绑架用户,而更应该采取的是派号的方法,每人领个号,一个号一个号轮着,当然过号还让不让买那就是另外一回事了。
因此我的建议是,用户关闭浏览器也不需要把他剔除出排队的队伍中。具体的实现是,用户点击排队后,系统将他的userid放到一个队列中,这个队列可以是记录在文件或者内存(MEMCACHE或者REDIS或者TOKYO TYRANT)里面。添加的时候从尾部添加,取出用户的时候从头部取出,每次取出用户时,将队列每一个元素中的“前面还有XXX人”自减一下,然后再根据这个数字给出一个估计的“剩余等待时间”就OK了。

清晨说ぺ晚安 2017-10-12 2 楼

理论上想想,12306实现的队列中保存的都不可能sessionid 。我想就是做这套系统的人再抽风,也不可能用这个作为存储数据的。如果是sessionid的话,那岂不是我可以开多个浏览器就多次买票了?

肯定是购票的身份证号码之类的能够唯一标志当前信息的某些数据。

这个队列肯定和sessionid没有半毛钱的关系,当用户提交订单,然后肯定是把订单信息或者订单标志存在队列中了

清晨说ぺ晚安 2017-09-29 1 楼

对于服务器端每打开一个浏览器请求一个网站的页面后,session的生命周期开始,当session超过时间限制之后,session会失效。以java来说的话当关闭浏览器,虽然session还存在,但此时已经无法获取到session,过一会儿java会自动销毁之,因为通常sessionid会保存在客户端的cookie中,客户端提交sessionid到服务器进行验证。
而且在我理解铁道部的队列系统生成的并行队列应该不会很多,也没有做过什么sharding,caching,clustering之类的,甚至很怀疑他们用了多少服务器用的什么样的配置才能出现这么烂的效果=。=