node 怎么实现 工作队列?

2021-07-10 12:40:39 +08:00
 mutoudaren

用 nodejs 简单的搭建了一个 http sever,可以处理 post 请求,执行比如“job1(post)”,“job2(post)”这样的请求,但是这些不同的 job 只能同步执行,也就是一个执行完了再执行另一个。

所以有没有简单的实现,先把 post 请求存到队列里面,然后依次执行?

5371 次点击
所在节点    Node.js
27 条回复
zhennann
2021-07-11 16:36:05 +08:00
两种思路:
1 、采用分布式锁 redlock
2 、采用 redis 做消息队列
cszchen
2021-07-11 22:26:45 +08:00
node 天生就是异步啊,不需要你额外封装,大家都是头疼怎么同步,所以才有了 Promise
libook
2021-07-12 10:11:13 +08:00
需求是希望收到的所有请求之间按照顺序一个一个执行是吧?

可以用消息队列的思想,就是来请求会异步插入到一个队列里,然后单线程一个一个地消费。

最简陋的做法是在一个 module 的根作用域下声明一个 Array,然后每次来请求都 unshift 一个消息,服务里单独跑一个循环去从数组里 pop 消息出来处理,处理完再 pop 下一个。

有分布式需求的话就用 Redis 、RabbitMQ 之类的消息队列中间件,可以启动一个集群服务作为生产者往队列里插消息,然后启动一个消费者服务来同步一条条消费。
soraping
2021-07-12 10:19:32 +08:00
事件循环吧,已经内置了 uvlib,io 请求自动进入到事件队列里
jianhua
2021-07-12 14:53:37 +08:00
多台服务器的话,需要一个消息队列,因为你要维护简单,redis 就可以了,实现一个简单的 pub/sub 。

单台服务器,生产者消费者写过没有。。。
tanrunhao
2021-07-12 15:35:31 +08:00
最简单是搞个 全局数组, 启动时候 setInterval 轮询数组执行, 然后请求时候把任务放进去。 这样基本满足需求
xcstream
2021-07-19 17:13:28 +08:00
async function(){
await f1()
await f2()
} ()

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/788690

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX