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

我有两个软件组件,我想互相交谈,

  1. 一个node.js web应用程序
  2. 一个用C编写的专用服务器(一个相当简单的代码片段,用于处理一些不太熟悉的库,我不想为其他语言包装)

我想要的对话很简单,

  • 节点:安装资源ID A
  • C的应用程序:好的,这是参考编号

要么

  • 节点:拿下这个参考
  • C应用程序:当然,伙计。

有没有在2之间传递消息的无痛方式?

我现在的理论主张是这样的:

  1. 在两个进程之间有1个tcp / unix套接字,每次只有一个会话,以避免总是打开和closures会话(同时也担心会有太多的一次)。
  2. 每个匹配的节点请求和C应用程序响应都具有相同的ID(单个TCP会话上的tcp-esque会话)
  3. 每个相关的节点请求都会向C应用程序生成消息,并将响应对象存储在某个散列中,会话ID作为键。
  4. 有一个单一节点线程来收集C应用程序回复,通过会话ID查找响应对象并响应客户端

这是非常低效的吗?

节点中是否有实际的线程支持? (一个简短的谷歌没有提出任何具体的结果)

基本上你是在正确的方向,你需要某种进程间的沟通。 这真的取决于你的IPC有多复杂。 如果仅仅是一些方法的调用和在方法之间共享简单(即整数,string)的数据,那么你可以使用unix套接字,这些套接字很容易实现,本地支持nodej,而且很容易从C中使用好(因为所需的标题几乎总是可用的)

ZeroMQ为您提供传输抽象(允许IPC或真正的基于networking的传输)和大量的绑定,甚至是晦涩的语言。 所提供的C和Node示例应该可以帮助您立即进入。 但是,您需要相应的标题和库; 最有可能需要先build立。

如果您要在程序之间交换的数据将变得更加复杂(读取结构体或数组,嵌套对象),那么您将需要一些真正的RPC实现。 有一堆RPC实现在那里; function明智的Apache Thrift对我来说看起来非常有希望,尽pipe最终我无法在合理的时间内完成编译器的编译。

所以最后,对于我来说,有一个相似的用例,我最终使用了ZeroMQ进行传输抽象,最后使用JSON-RPC作为RPC机制。 JSON-RPC对nodejs来说是非常原生的,对于使用https://github.com/pijyoi/jsonrpc的 CI来说,它是基于ZeroMQ和Jansson的。 该文件是不存在的,但如果你来到这么远,你不应该害怕。

在性能方面,我不认为这会是一个问题; 你的用例听起来不像你在短时间内有很多请求。 由于ZeroMQ还提供传统的IPC作为传输,您也可以使用它来提高性能。