例如抢票规则,库里有一张票,两个请求同时进来,如何让第一个请求执行完之后再执行第二个,使得第二个请求拿到的结果是第一个请求操作完之后的结果!
可以使用koa中间件来实现。
let app = require("koa");
app.use(async (ctx,next)=>{
await next(); //执行第一个请求
//执行第二个请求
})
尝试用在监听到相关的请求的时候,将各个接口的请求都转发给同一个对象模块处理,该模块在执行的时候只需要实现一个list存储所有的请求,然后按顺序执行然后回调即可,当然,这可以在外面封装一层Promise。
简单来说,就是这个数据结构允许往里面存值,同时传递一个回调函数,在执行的时候,只会同步、依次执行,结果通过回调返回。外面包一层Promise。
今天脑子有点凉,写完发现似乎有些地方没转过来,比如同步方式为毛还要重新用回调和Promise封装……不过上面所说的这个方案是应该是可以实现的,我控制并发时这样做过。
2 回答2k 阅读✓ 已解决
5 回答2.3k 阅读
2 回答1k 阅读✓ 已解决
3 回答1.3k 阅读
3 回答1.5k 阅读
1 回答697 阅读✓ 已解决
1 回答1.1k 阅读✓ 已解决
redis可以的,但是消息队列的话专业的可以用rabbitMQ
rabbitMQ里有队列广场,里面存放着消息(票),如果一个请求过来了,可以把广场里的消息(票)分发给请求(消费者)
比如说数据库里存放了编号为'12306'的票,队列里也有一张12306
A先来了,队列把这张12306发给A,A拿着这个消息去操作数据库去了
B来了,此时A有可能都没走,因为来的频率非常快,但是队列里已经没票了,然后队列告诉B,没票了。B就先回去了
不一定要先进先出后进后出吧,只要后进的拿到先进的操作完的结果就可以,后进也可以先出,只要数据状态是正确的就可以了