【问题标题】:Mean.js Node.js background processesMean.js Node.js 后台进程
【发布时间】:2015-04-29 06:08:00
【问题描述】:

我正在编写一个 mean.js 应用程序,但我在概念上对后台进程感到困惑。

我需要一些在后台连续运行的进程,这些进程在 mongodb 数据库上运行并执行清理、电子邮件、推文等操作。

我需要许多与我的网络应用程序中相同的功能和库,这些功能和库可用于这些后台进程。

最好的方法是什么?我是否从一个全新的源库开始,并将这些工作进程视为一个单独的应用程序?或者当我使用 grunt 启动 server.js 时,我是否创建一个守护进程文件夹并分叉后台进程?

我想我让自己感到困惑,并且可能使事情变得比应有的复杂。我查看了节点守护进程和 child_processes 以及 simple_daemon。但我不确定要走哪条路。

感谢您的帮助。

【问题讨论】:

  • 一旦我启动了 pm2,尤其是pm2 save,我就不再担心它了。使用或多或少相同的应用程序的多个副本是最可维护的(恕我直言),有些只是做一些事情,有些是接电话。如果你真的需要 ram,你可以注释掉你不需要的部分后台工作者,或者你甚至可以有条件地要求他们让同一个文件戴上很多帽子。

标签: javascript angularjs node.js mongodb meanjs


【解决方案1】:

您可以使用 setInterval() 在 mean.js 应用程序中运行计划或重复任务。由于 node.js 的工作方式,只要 node 正在运行您的应用程序,任何定义为在 setInterval() 或 setTimeout() 中运行的回调都会在加载后运行。这意味着您可以将后台逻辑保存在控制器/模型或相邻文件中。您可以包含您的背景脚本,例如从主 app.js 文件或控制器、模型等中的任何地方 require()-ing 它。

例如

app.js:

require('tasks/doStuff');
require('express');

/* express/app stuff here */

tasks/doStuff.js:

require('mongoose');
require('some/other/stuff');

setInterval( function() {
    console.log('interval happened');
}, 1000);

这种方法确实需要一些设计/架构方面的考虑。也就是说,您的任务现在与节点 mean.js 应用程序的成功执行相关联。如果你的 mean.js 应用程序崩溃/死掉,你的任务也会死掉。

【讨论】:

  • 啊。好的,这对我来说很有意义。但我对此感到困惑:如果 node.js 应用程序是单线程进程,并且如果我的 setinterval 需要很长时间(比如很长的查询)不会阻止传入的 Web 请求吗?
  • 理论上是的。但在实践中,没有。只要您在长时间运行的函数上使用异步方法,就不会阻塞线程。这是 Node.js 的基础。更多信息:stackoverflow.com/questions/14795145/…
  • 这取决于长时间运行是否发生在线程内;通常,节点中的长时间延迟发生在线程外,例如等待 http 或 DB 调用。如果你在 JS 中研磨一个大的数据循环,那么是的,一个长跑者会停滞不前,但这种情况很少发生,如果是这样,你可以将那个慢 js 移动到另一个节点实例,以保持你的重要从备份线程。
猜你喜欢
  • 1970-01-01
  • 2011-06-13
  • 2014-05-29
  • 2013-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-26
相关资源
最近更新 更多