Node.js是否需要一个作业队列?

假设我有一个发送邮件的快递服务:

app.post('/send', function(req, res) { sendEmailAsync(req.body).catch(console.error) res.send('ok') }) 

这工作。

我想知道在这里引入工作队列的优点是什么? 像Kue

       

网上收集的解决方案 "Node.js是否需要一个作业队列?"

基本上,队列的要点只是为了让你更好地控制执行。

这可能是因为扼杀了你发送的数量,优先考虑其他动作,晚上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任务,并知道它是否成功之前。 有时候有这样做的原因,但有时候你想传达回去操作是否成功(你不这么做)。