我想在一些小型Web应用程序中添加一些管理实用程序,例如“备份数据库”。用户将单击一个按钮,HTTP响应将立即返回,尽管可能在后台启动了长时间运行的进程。
在Java中,这可能是通过使用Actor在Scala中生成一个独立的线程来实现的。但是node.js中有什么合适的习惯用法? (代码片段赞赏)
我现在正在重新阅读这些文档,这确实看起来似乎是一个节点101问题,但这几乎就是我在这方面...无论如何,澄清这是基本情景:
function onRequest(request, response) {
doSomething();
response.writeHead(202, headers);
response.end("doing something");
}
function doSomething(){
// long-running operation
}
我希望响应立即返回,让doSomething()在后台运行。
好的,鉴于节点的单线程模型似乎不可能产生另一个操作系统级别的ChildProcess。我的误会。
在我的代码中,我需要的备份主要是基于I / O的,所以节点应该以一种漂亮的异步方式处理它。我认为我要做的是将doSomething转移到response.end之后,看看它是如何表现的。
答案 0 :(得分:5)
正如supertopi所说,你可以看看Child process。但我认为这会损害您的服务器的性能,如果这种情况顺序发生的话。然后我认为你应该排队他们。我认为你应该看一下asynchronous message queues来离线处理你的工作(分发)。消息队列的一些(仅举两个例子)示例是beanstalkd,gearman。
答案 1 :(得分: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
不会只是坐在那里,直到数据库连接建立,或等待你告诉它备份。它会立即返回,已经注册了一个稍后会运行的回调。在幕后,您的数据库库可能正在为您创建一些线程,以使异步工作以它应该的方式工作,但您的代码不需要担心它;你马上回来,立即将响应发送给客户端,异步代码保持异步运行。
(实现同步运行实际上需要更多工作 - 您必须将response
对象传递到doSomething
,并doSomething
进行response.end
调用备份完成后,最里面的回调。当然,这不是你想在这里做的;你想立即返回,这正是你的代码将要做的。)