Node.js是否需要一个作业队列?
假设我有一个发送邮件的快递服务:
app.post('/send', function(req, res) { sendEmailAsync(req.body).catch(console.error) res.send('ok') })
这工作。
我想知道在这里引入工作队列的优点是什么? 像Kue
。
基本上,队列的要点只是为了让你更好地控制执行。
这可能是因为扼杀了你发送的数量,优先考虑其他动作,晚上stream出(即,如果10000发送同时发送,你不会同时发送所有10000个)你的服务器)。
你使用的队列是什么,以及它是否有任何好处取决于你的实际情况和用例。 在一天结束时,这只是控制stream量。
Node.js是否需要一个作业队列?
不是一般的。
一个作业队列是解决一个特定的问题,通常比单个node.js进程可以处理更多的事情,所以你“排队”的事情要做,甚至可以把它们派送到其他进程来处理。
你甚至可以为不同types的工作设定优先级,或者想要控制执行工作的速度(假设你有一个限速上限,你必须在某个外部服务器上保持低于或者不想压倒某些其他服务器) 。 也可以使用nodejs集群来增加节点服务器可以处理的任务数量。 所以,一个队列是关于控制一些CPU或资源密集型任务的执行,当你有更多的事情要做,而不是你的服务器可以很容易地执行一次。 一个队列可以让你控制执行的stream程。
我没有看到你使用作业队列的代码的任何理由,除非你一次做了很多这些。
您提到的特定Kue
库在其NPM页面上列出了这些function:
- 延迟工作
- 并行工作量的分配
- 工作事件和进度pubsub
- 作业TTL
- 可选的退避重试
- 优雅的工人closures
- 全文searchfunction
- REST风格的JSON API
- 丰富的集成UI
- 无限滚动
- UI进度指示
- 特定于工作的日志
所以,我想不用说,如果你需要一些特定的排队function,你会添加一个队列,如果你有特定问题的最佳function,你会使用Kue
库。
万一它很重要,你的代码发送res.send("ok")
在它完成asynchronous任务,并知道它是否成功之前。 有时候有这样做的原因,但有时候你想传达回去操作是否成功(你不这么做)。