节点JS工作人员 - 他们需要什么?

问题描述:

原谅我的无知,但来自Django/Python背景我可以看到让Celery队列通过后台较慢的进程工作,同时Web界面尽可能快地更新的巨大好处。节点JS工作人员 - 他们需要什么?

但是,在Node异步工作的情况下,队列系统的用例是否大幅减少?

例如:

1 - 用户发布内容的网站, 2 - 网站的响应,则邮件管理员。

在Django中,您会将管理​​邮件发送给任务,稍后执行,然后响应请求。芹菜在后台发送邮件。

在节点中,您打电话给您的邮件程序,然后回复请求。然后邮件发送一个回叫来说明是否完成,在这一点上用户已经在查看响应。

那么,为什么我会使用一个队列与节点?我猜测事情比这更复杂 - 似乎对于交易邮件这些微不足道的事情来说,没有必要......

或者我误解了它是如何工作的?

你是对的,继续节点在节点中相当不错,如果你在单个节点进程中运行所有的东西,那么就不需要一个队列。 然而,由于节点是单线程的,节点将无法处理任何新传入的请求,同时它正忙于发送的电子邮件或处理该任务(如果它是一个CPU密集型任务)

所以,如果你的工作需要一段时间为了明智地处理CPU,使用外部队列和单独的进程来处理这些任务/消息仍然是值得的。 如果你的任务是密集型的,需要一段时间,因为他们正在等待来自其他服务器的响应,例如,由于节点与io处理得很好,所以再次减少需求。

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

+1

因此,如果我想要做一些像调用一个外部API来充实一个用户信息 - 例如。通过对Google地理编码器的请求调用进行反向地理编码。这个请求不会让我的节点进程停滞在下面的传入请求中?但是如果有很多CPU使用它会.. ..? – 2013-02-21 10:03:36

+1

你需要对它进行基准测试,但是。这大致是这个想法。看看这里来了解在等待io操作时可以完成多少操作:http://www.eecs.berkeley.edu/~rcs/research/interactive_latency.html。节点一次只能处理一件事,所以如果数字处理的话,它不能处理请求。只要你做任何io,你就可以释放节点去做其他的事情。 – AndyD 2013-02-21 10:44:51

+3

(边缘)清晰度的改写:如果您的并行执行涉及大量等待HTTP或文件系统请求返回的请求,那么节点的内置异步I/O将为您提供足够的并行性。如果您的并行执行涉及在本地运行大型计算(对视频进行代码转换;运行仿真),那么节点的单线程特性会使您停止工作,如果可能的话,您需要将工作转移给工作人员。 – Dave 2013-11-13 00:32:54

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

+0

我明白。我认为必须有一个原因,有很多的队列实现,我曾说过,我认为用例减少,而不是完全... – 2013-02-21 10:00:10