簡體   English   中英

用於在分布式環境中為非阻塞的node.js應用程序執行長時間運行的作業的體系結構

[英]Architecture for executing long running jobs for a non-blocking node.js application in a distributed environment

我在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應用程序在另一個群集上運行)

也許像RabbitMQ這樣的消息傳遞代理服務可能會有所幫助(節點推送消息,Java訂閱消息並將響應推送回)。

有什么想法嗎?

看看Q-Oper8( https://github.com/robtweed/Q-Oper8 ),它旨在為此類情況提供本機Node.js解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM