node如何实现请求队列,先进先出规则?

例如抢票规则,库里有一张票,两个请求同时进来,如何让第一个请求执行完之后再执行第二个,使得第二个请求拿到的结果是第一个请求操作完之后的结果!

阅读 6.6k
6 个回答

redis可以的,但是消息队列的话专业的可以用rabbitMQ
rabbitMQ里有队列广场,里面存放着消息(票),如果一个请求过来了,可以把广场里的消息(票)分发给请求(消费者)
比如说数据库里存放了编号为'12306'的票,队列里也有一张12306
A先来了,队列把这张12306发给A,A拿着这个消息去操作数据库去了
B来了,此时A有可能都没走,因为来的频率非常快,但是队列里已经没票了,然后队列告诉B,没票了。B就先回去了
不一定要先进先出后进后出吧,只要后进的拿到先进的操作完的结果就可以,后进也可以先出,只要数据状态是正确的就可以了

可以试一下用redis

可以使用koa中间件来实现。

let app = require("koa");
app.use(async (ctx,next)=>{
await next(); //执行第一个请求
//执行第二个请求
})

数据库加锁。

尝试用在监听到相关的请求的时候,将各个接口的请求都转发给同一个对象模块处理,该模块在执行的时候只需要实现一个list存储所有的请求,然后按顺序执行然后回调即可,当然,这可以在外面封装一层Promise。

简单来说,就是这个数据结构允许往里面存值,同时传递一个回调函数,在执行的时候,只会同步、依次执行,结果通过回调返回。外面包一层Promise。

今天脑子有点凉,写完发现似乎有些地方没转过来,比如同步方式为毛还要重新用回调和Promise封装……不过上面所说的这个方案是应该是可以实现的,我控制并发时这样做过。

这个需要使用mq实现,简单用DB实现。其他方案只能实现在一个进程内,多几台就不行了

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题