假设我有一个父节点进程,它会分叉子进程。我想在它们之间创建一个请求 - 响应机制,以便子进程可以向父进程发送消息(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吗?
答案 0 :(得分:0)
问题的一个可能解决方案似乎是在WebSockets上使用WAMP:
WebSocket request-response subprotocol
然而,由于在这种情况下我们谈论的是IPC和在单个机器内运行的进程,我们并没有真正限制传输协议(如果我们真的想要,我们甚至可以使用原始套接字)。父进程和子进程之间还有一个内置的消息传递系统。
所以也许可以将WAMP用于其他方面,或者提出另一种解决方案。
关于WAMP,我们可以使用的一个包是autobahn。