Допустим, у меня есть процесс родительского узла, который разветвляет дочерний процесс.Я хочу создать механизм запроса-ответа между ними, чтобы ребенок мог отправить сообщение (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?