Node.js 的有状态的进程间通信

Posted

技术标签:

【中文标题】Node.js 的有状态的进程间通信【英文标题】:Stateful Interprocess communication for Node.js 【发布时间】:2012-03-13 22:21:33 【问题描述】:

我可能在这里遗漏了一个明显的技巧,但是...

是否有 2 个以上的 node.js 进程以有状态的方式交换消息? 举个例子: 进程 A 是一个 HTTP 服务器,用于处理传入的外部 http 请求,为了满足这些请求,它需要从进程 B 或 C 获取信息。目前,我有“A”为每个对“B”或“B”的请求打开一个 TCP/IP 连接C' 正在侦听合适的端口。

这看起来很糟糕而且开销很大,因为每个请求都需要大量开销来打开和关闭套接字,但是如果不为每个请求打开一个套接字,我看不到一种方法来确保来自“B”的响应或“C”绑定到正确的 HTTP 响应。

所有进程都在 nodejs 中,B + C 的启动时间很长(30 秒以上),因此不能根据请求生成它们。所有进程当前都在同一个机器上运行(双核)。 就协议而言,我使用的是基本的“net”服务器,如 nodejs 文档中所述,并在其上抛出文本。

我们很乐意接受任何建议等

【问题讨论】:

为什么进程 A 不能只维持与进程 B + C 的持久 TCP 连接并根据需要使用它们? 如果我通过管道发送数据,当响应返回时,我该怎么做。 nodejs 知道将该数据应用到哪个 http 请求? (我真的不知道) 这取决于服务器 B 和 C 使用的协议。您能否详细说明一下您的问题? 添加了一些 - 如果这还不够,请告诉我 【参考方案1】:

您可以选择将唯一的会话 ID(应用服务器/自行生成)作为消息的一部分(在进程 A B/C 之间)传递,也可以在会话 ID 上附加一个计数器(在会话 ID 和计数器)来跟踪请求。计数器将在每个新请求时递增。我相信您可以使用更好/更简单的选择。

对于进程间消息传输,可以查看内存缓存(例如 redis/memcached 等)或使用消息服务器,例如 ZermoMQ/RabbitMQ 等(您也可以使用 Redis 进行队列/发布-订阅消息传递)。您还可以选择避免使用消息服务器并简单地在节点内使用 hook.io 或 net/tcp 进行消息传输。

希望对你有帮助。

【讨论】:

谢谢 Ali,我有点昏昏沉沉,不认为我可以将 http 连接存储在池中以供以后处理。

以上是关于Node.js 的有状态的进程间通信的主要内容,如果未能解决你的问题,请参考以下文章

节点和C应用程序之间的进程间通信

Linux 进程间通信-管道

进程与进程间通信

UNIX Domain Socket(UDS)是什么?同一台主机间进程间通信

进程间通信

进程间通信的概念-简介