实现节点进程之间的请求 - 响应交换

时间:2018-06-06 12:34:03

标签: javascript node.js asynchronous process ipc

假设我有一个父节点进程,它会分叉子进程。我想在它们之间创建一个请求 - 响应机制,以便子进程可以向父进程发送消息(JSON)并等待响应,以及其他方式。

我不想使用HTTP,因为我希望机制尽可能紧凑和低延迟,而HTTP通常会有一些开销。此外,HTTP是客户端 - 服务器协议,我想要双向的东西。 (我很高兴知道在这种情况下,开销是否可以忽略不计,或者直接使用管道,直接使用TCP套接字或WebSockets;这会让我的工作更轻松。)

我想要的最终结果是这样的。请注意,为了清楚起见,此代码在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});

请求/响应系统应支持Success-type和Error-type响应,以及指示底层协议失败的Error non-responses。

我应该如何在Node中实现它?如果我试图天真地做这个,我可以想到很多问题,因为多个请求和响应可以并行运行。有没有图书馆已经这样做了?我应该只使用HTTP吗?

1 个答案:

答案 0 :(得分:0)

问题的一个可能解决方案似乎是在WebSockets上使用WAMP:

WebSocket request-response subprotocol

然而,由于在这种情况下我们谈论的是IPC和在单个机器内运行的进程,我们并没有真正限制传输协议(如果我们真的想要,我们甚至可以使用原始套接字)。父进程和子进程之间还有一个内置的消息传递系统。

所以也许可以将WAMP用于其他方面,或者提出另一种解决方案。

关于WAMP,我们可以使用的一个包是autobahn