Я создаю 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);
}
}
Таким образом, я могу выполнять долго выполняющиеся задания для тех запросов, которые удовлетворяют условиям, без блокировки всего приложения узла.
Итак, вот требования:
- Скорость
- Масштабируемость обоих приложений (прокси-узел узла работает в кластере, а приложение Java - в другом)
Может быть, может помочь служба брокера обмена сообщениями, такая как RabbitMQ (узелотправляет сообщения, Java подписывается на них и возвращает ответ обратно).
Мысли?