Внедрить обмен запрос-ответ между процессами узла - PullRequest
0 голосов
/ 06 июня 2018

Допустим, у меня есть процесс родительского узла, который разветвляет дочерний процесс.Я хочу создать механизм запроса-ответа между ними, чтобы ребенок мог отправить сообщение (JSON) родителю и дождаться ответа, а также другим способом.

Я не хочуиспользуйте HTTP, потому что я хочу, чтобы механизм был максимально сжатым и с минимальными задержками, а HTTP обычно имеет некоторые накладные расходы.Кроме того, HTTP - это протокол клиент-сервер, и я хочу что-то двунаправленное.(Я был бы рад узнать, являются ли издержки неоправданными или такими же плохими, как использование каналов, TCP-сокетов напрямую или WebSockets в этой ситуации; это облегчит мою работу).

Конечный результат Iхочу что-то вроде этого.Обратите внимание, что этот код написан на языке TypeScript для ясности, а не потому, что ответ должен быть тоже на языке TypeScript.

class Communicator {
    // Callback for when a message is received by the Communicator
    // Resolve returns a response to the sender, reject returns an error
    onMessage : (data : any) => Promise<any>;

    // Sends an object to the other process, and returns a promise
    // that resolves with the response or rejects with the error reason
    send(data : any) : Promise<any>;
}

В этом случае я собираюсь предположить, что мы используем собственный механизм process.send, ноесли бы другая система, такая как WebSockets, была бы лучше, она была бы немного другой:

// PARENT

let cp = require("child_process").fork("./child.js");

let comm = new Communicator(cp);

await comm.send({property : 1});

.

// CHILD

let comm = new Communicator(process);

await comm.send({property : 1});

Система запросов / ответов должна поддерживать как тип успеха, так и тип ошибкиответы, а также ошибки неответа, которые указывают на сбой базового протокола.

Как мне реализовать это в узле?Я могу подумать о многих проблемах, если попытаюсь сделать это наивно, поскольку несколько запросов и ответов могут выполняться параллельно.Есть ли библиотека, которая уже делает это?Должен ли я просто использовать HTTP?

1 Ответ

0 голосов
/ 06 июня 2018

Одним из возможных решений проблемы, по-видимому, является использование WAMP поверх WebSockets:

Подпротокол запроса-ответа WebSocket

Однако, поскольку в этом случае мыГоворя об IPC и процессах, запущенных на одной машине, мы не очень ограничены в отношении протокола передачи (мы могли бы даже использовать необработанные сокеты, если бы мы действительно хотели).Существует также встроенная система обмена сообщениями между родительскими и дочерними процессами.

Так что, возможно, можно использовать WAMP поверх чего-то другого или придумать другое решение.

Что касается WAMP,один пакет, который мы можем использовать, это автобан .

...