20

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

然而,随着 Node 异步工作,队列系统的用例是否大大减少了?

例如:

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

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

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

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

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

4

2 回答 2

7

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

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

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

于 2013-02-21T01:47:18.550 回答
4

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

于 2013-02-20T20:08:26.127 回答