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

won*_*ng2 5 node.js

说我有快递服务发送电子邮件:

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

这很有效.

我想知道在这里引入一个工作队列有什么好处?喜欢Kue.

jfr*_*d00 10

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

不是一般的.

作业队列是解决特定问题的,通常比单个node.js进程可以处理更多,因此您可以"排队"要做的事情,甚至可以将它们分发给其他进程来处理.

您甚至可能具有不同类型作业的优先级,或者想要控制作业执行的速率(假设您有一个速率限制上限,您必须在某个外部服务器上保持低于或者只是不想压倒其他服务器) .还可以使用nodejs群集来增加节点服务器可以处理的任务量.因此,当您有更多操作要比服务器可以一次轻松执行时,队列就是控制某些CPU或资源密集型任务的执行.队列使您可以控制执行流程.

我没有看到您显示的代码使用作业队列的任何原因,除非您一次完成了很多这些.

您提到的特定Kue在其NPM页面上列出了这些功能:

  • 延迟工作
  • 并行工作负荷的分配
  • 工作事件和进展pubsub
  • 工作TTL
  • 带退避的可选重试
  • 优雅的工人关机
  • 全文搜索功能
  • RESTful JSON API
  • 丰富的集成UI
  • 无限滚动
  • UI进度指示
  • 特定于作业的日志

因此,我认为如果您需要某些特定的排队功能,并且Kue如果它具有针对您的特定问题的最佳功能集,则您将使用该库,这是不言而喻的.


如果它很重要,您的代码res.send("ok")在完成异步任务之前以及在您知道它是否成功之前发送.有时会有这样做的理由,但有时您想要回复操作是否成功(您没有这样做).


sam*_*ime 5

基本上,排队的目的只是让您对它们的执行有更多的控制。

这可能用于限制发送的数量,优先处理其他操作,使流量平衡(例如,如果同时发送10000,则不要尝试同时发送所有10000并杀死)您的服务器)。

您将队列究竟用于什么目的以及它是否有好处,取决于您的实际情况和用例。归根结底,这只是控制流量。