Архитектура для выполнения длительных заданий для неблокирующего приложения node.js в распределенной среде - PullRequest
1 голос
/ 19 сентября 2011

Я создаю HTTP-прокси в node.js .Когда входящий запрос удовлетворяет некоторым условиям, выполняется долгосрочное задание.Когда это происходит, все последующие запросы должны ждать завершения задания (из-за архитектуры узла):

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

Это не хорошо.Итак, допустим, что долго выполняющееся задание может быть реализовано в Java , и для этой цели я создаю серверное приложение Java, которое выполняет долго выполняющееся задание в отдельном потоке каждый раз, когда приложение узла выполняет запрос,

Итак, когда условия выполняются, node.js устанавливает соединение (TCP, HTTP, что угодно) с сервером Java.Сервер Java инициализирует новый поток для запроса, выполняет долгосрочное задание в этом отдельном потоке и возвращает обратно, скажем, 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 подписывается на них и возвращает ответ обратно).

Мысли?

1 Ответ

0 голосов
/ 19 сентября 2011

Взгляните на Q-Oper8 (https://github.com/robtweed/Q-Oper8), который предназначен для обеспечения нативного решения Node.js для таких ситуаций, как этот

...