php - 12306抢票并发怎么处理?

查看:309
本文介绍了php - 12306抢票并发怎么处理?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

公司有个抢单的业务,要网站实现。

我自己设计的解决方案想问问大家是否可行,如果不可行有更成熟的方案吗?

我的方案: 请求进来之后首先判断当前时间是否在抢单时间内,如果在就修改缓存中的抢单人id,表明此订单被抢单人抢到,然后修改抢单允许时间为false。

解决方案

为什么要扯上12306呢?即使是12306的抢票目前来看也有很大的问题。

你的方案如果在并发小的情况下是可以的,如果并发很大的情况下,会造成绝对第一人事实上抢不到订单,甚至系统异常
我们看一下你的流程

  • step1:通过了抢单时间判断

  • step2:保存该抢单人ID

  • step3:执行修改抢单时间为false

但是如果并发量特别大的情况呢?有1000个请求同时到达,第一个请求通过了step1,然后在执行step2和step3的同时,服务器接受到的请求会依然通过step1判断,直至第一个请求执行完step3,这就造成这期间所有的请求返回的结果都是成功抢到了单,但事实上服务器保存的是这期间里的最后一个请求。

解决办法就是使用队列。

把所有请求全部的用户id全部加入队列(表,redis等),在接收到抢单请求时触发任务,在队列中取出第一个,返回结果,并结束请求。

这篇关于php - 12306抢票并发怎么处理?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆