【问题标题】:Implement request-response exchange between node processes实现节点进程之间的请求-响应交换
【发布时间】:2018-06-06 12:34:02
【问题描述】:

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

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

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

请求/响应系统应该支持成功类型和错误类型的响应,以及指示底层协议失败的错误无响应。

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

【问题讨论】:

    标签: javascript node.js asynchronous process ipc


    【解决方案1】:

    该问题的一种可能解决方案似乎是使用 WAMP over WebSockets:

    WebSocket request-response subprotocol

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

    所以也许可以在其他东西上使用 WAMP,或者想出另一个解决方案。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-14
      • 2019-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-09
      • 2018-05-28
      相关资源
      最近更新 更多