用于在分布式环境中为非阻塞node.js应用程序执行长时间运行作业的体系结构

时间:2011-09-19 04:51:07

标签: java multithreading architecture node.js nonblocking

我正在 node.js 中构建HTTP代理。当传入请求满足某些条件时,将执行长时间运行的作业。发生这种情况时,所有后续请求必须等待作业结束(由于节点的体系结构):

function proxy(request, response) {
    if(isSpecial(request)) {
        // Long running job
    }
    // Proxy request
}

这样做并不好。
所以让我们说长期工作可以在 Java 中实现,为此我构建了一个Java服务器应用程序来执行长时间运行的作业每次节点应用程序发出请求时都有一个单独的线程。

因此,当满足条件时,node.js与Java服务器建立连接(TCP,HTTP,无论如何)。 Java服务器为请求初始化一个新的Thread,在这个单独的线程中执行长时间运行的作业,然后返回一个JSON响应(可以是二进制,无论如何),该节点可以轻松,异步地处理:

var javaServer = initJavaServer(); // pseudo-code

function proxy(request, response) {
    var special = isSpecial(request);
    if (special) {
        var jobResponse;
        javaServer.request( ... );
        javaServer.addListener("data", function(chunk)) {
            // Read response
            // jobResponse = ...
        }
        javaServer.addListener("end", function(jobResult)) {
            doProxy(jobResponse, request, response);
        }
    } else {
        doProxy(null, request, response);
    }
}

通过这种方式,我可以为满足条件的请求执行长时间运行的作业,而不会阻塞整个节点应用程序。

所以这里的要求是:

  1. 速度
  2. 两个应用程序的可伸缩性(节点代理在群集上运行,Java应用在另一个上运行)
  3. 也许像RabbitMQ这样的消息传递代理服务可能有所帮助(节点推送消息,Java订阅它们并推回响应)。

    思想?

1 个答案:

答案 0 :(得分:0)

查看Q-Oper8(https://github.com/robtweed/Q-Oper8),它旨在为诸如此类的情况提供本机Node.js解决方案