5

我想将一些管理实用程序添加到一个小的 Web 应用程序中,例如“备份数据库”。用户将单击一个按钮,HTTP 响应将立即返回,尽管可能长时间运行的进程已在后台启动。

在 Java 中,这可能通过生成一个独立线程来实现,在 Scala 中通过使用 Actor 来实现。但是在 node.js 中什么是合适的习语?(代码片段赞赏)

我现在正在重新阅读文档,这确实看起来是一个节点 101 问题,但这几乎就是我在这个问题上的位置......无论如何,澄清这是基本场景:

function onRequest(request, response) {
    doSomething();
    response.writeHead(202, headers);
    response.end("doing something");
}

function doSomething(){
     // long-running operation
}

我希望响应立即返回,让 doSomething() 在后台运行。

好的,考虑到节点的单线程模型,如果不产生另一个 OS 级 ChildProcess,这似乎是不可能的。我的误解。

在我的代码中,我需要的备份主要是基于 I/O,因此节点应该以一种很好的异步方式处理它。我想我要做的是将doSomething移到response.end之后,看看它的行为如何。

4

2 回答 2

5

正如 supertopi 所说,您可以查看Child process。但我认为这会损害您服务器的性能,如果这种情况连续发生很多。那么我认为你应该将它们排队。我认为你应该看看异步消息队列来离线处理你的工作(分布式)。消息队列的一些(仅举两例)示例是beanstalkdgearman

于 2012-04-08T22:30:08.953 回答
3

我没有看到问题。您需要做的就是doSomething()启动一个异步操作。它会立即返回,您onRequest将写回响应,客户端将收到他们的“OK,I started”消息。

function doSomething() {
    openDatabaseConnection(connectionString, function(conn) {
        // This is called some time later, once the connection is established.
        // Now you can tell the database to back itself up.
    });
}

doSomething不会只是坐在那里直到建立数据库连接,或者等待您告诉它备份。它会立即返回,注册一个稍后会运行的回调。在幕后,您的数据库库可能正在为您创建一些线程,以使异步按应有的方式工作,但您的代码不需要担心它;您只需立即返回,立即将响应发送给客户端,异步代码继续异步运行。

(It's actually more work to make this run synchronously -- you would have to pass your response object into doSomething, and have doSomething do the response.end call inside the innermost callback, after the backup is done. Of course, that's not what you want to do here; you want to return immediately, which is exactly what your code will do.)

于 2012-04-18T12:24:49.503 回答