Node JS worker - 需要他们吗?

Posted

技术标签:

【中文标题】Node JS worker - 需要他们吗?【英文标题】:Node JS workers - any need for them? 【发布时间】:2013-02-05 12:44:53 【问题描述】:

请原谅我的无知,但我来自 Django/Python 背景,我可以看到让 Celery 队列在后台处理较慢的进程,同时尽可能快地更新 Web 界面的巨大好处。

但是,由于 Node 异步工作,队列系统的用例是否会大大减少?

例如:

1 - 用户在网站上发布内容, 2 - 站点做出响应,然后向管理员发送邮件。

在 Django 中,您可以将管理邮件发送到一个任务,稍后执行,然后响应请求。 Celery 在后台发送邮件。

在 Node 中,您调用您的邮件程序,然后响应请求。然后,邮件程序会发送一个回调来表示是否完成,此时用户已经在查看响应。

那么我为什么要在 Node 中使用队列呢?我猜什么时候事情会比这更复杂 - 似乎对于事务性邮件等琐碎的事情,没有必要..

还是我误解了它的工作原理!?

【问题讨论】:

【参考方案1】:

您说得对,节点中的延续非常好,如果您在单个节点进程中运行所有内容,则不需要立即使用队列。 但是,由于节点是单线程的,节点在忙于发送该电子邮件或处理该任务(如果它是一个 CPU 密集型任务)时将无法处理任何新的传入请求

因此,如果您的任务需要一段时间才能明智地处理 cpu,那么使用外部队列和单独的进程来处理这些任务/消息可能仍然值得。 如果您的任务是 io 密集型的,并且需要一段时间,因为它们正在等待来自其他服务器的响应,例如,那么由于 node 可以很好地处理 io,因此不再需要。

如果您有一个 CPU 密集型任务,但您不想部署队列,您可以创建更多节点进程和机器实例并在它们之间进行负载平衡,所有这些都让它们处理这些任务。这种方法的缺点是您不能单独扩展网站和后台处理。 (例如 5 个处理 Web 请求的实例和 2 个工作实例)

【讨论】:

所以,如果我想做一些事情,比如调用外部 API 来充实用户信息 - 例如。通过对 Google 地理编码器的请求调用进行一些反向地理编码。此请求不会为以下传入请求停止我的 Node 进程吗?但是如果有很多 CPU 使用它会..? 您需要对其进行基准测试,但是可以。大致就是这样的想法。看看这里,了解在等待 io 操作时可以完成多少工作:eecs.berkeley.edu/~rcs/research/interactive_latency.html。 Node 一次只做一件事,所以如果它在处理数字,它就不能处理请求。只要你做任何 io,你就可以释放节点去做其他事情。 为了(边际)清晰而重新表述:如果您的并行执行涉及大量等待 HTTP 或文件系统请求返回,那么 node 的内置异步 I/O 将足以满足您的并行性.如果您的并行执行涉及在本地运行大型计算(转码视频;运行模拟),那么节点的单线程特性会让您陷入困境,如果可能的话,您需要将工作分派给工作人员。【参考方案2】:

不,队列总是有用例,即使在 Node 世界中也是如此。我见过几个人使用不同程度的成功的基本方法是使用 Redis 支持的队列来存储消息或任务。您可能有一个 Node 进程将项目添加到队列中,而另一个 Node 实例处理队列中的项目。此外,查看queue modules 的节点模块列表,您会看到大量的实现。

【讨论】:

我明白了。我认为有很多队列实现一定是有原因的,我确实说过我认为用例减少了而不是完全消失了......

以上是关于Node JS worker - 需要他们吗?的主要内容,如果未能解决你的问题,请参考以下文章

Node多进程相关

Node.js Cluster Worker:关闭事件

你需要在 node.js 中使用 path.join 吗?

结合 node.js 和 Python

使用 Node.js/python 的 Producer/Consumer + Worker 架构

Node.js 源代码需要啥编码?