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

时间:2013-02-20 13:33:27

标签: node.js message-queue

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

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

例如:

1 - 用户向网站发布内容, 2 - 站点响应,然后邮寄管理员。

在Django中,您将管理员邮件发送给任务,稍后执行,然后回复请求。芹菜在后台发送邮件。

在Node中,您调用邮件程序,然后回复请求。然后邮件程序发送回调以表示DONE与否,此时用户已经在查看响应。

那么我为什么要使用Node队列呢?我猜测事情比这更复杂 - 似乎对于像交易邮件这样的琐碎事情,它没有必要......

或者我误解了它的运作方式!?

2 个答案:

答案 0 :(得分:7)

你是对的,节点中的延续非常好,如果你在单个节点进程中运行所有东西,就不需要立即进行队列。 但是,由于节点是单线程的,因此当节点忙于发送该电子邮件或处理该任务时(如果它是一个cpu密集型任务),节点将无法处理任何新的传入请求

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

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

答案 1 :(得分:4)

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