5

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

  1. 一个 node.js 网络应用程序
  2. 一个用 C 编写的专用服务器(一段相当简单的代码,它处理一些我不想为其他语言包装的晦涩库)

我想要的对话很简单,

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

或者

  • 节点:取下这个 ref
  • C app:当然,伙计。

是否有任何轻松的方式在 2 之间传递消息?

我目前的理论想法是这样的:

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

是不是非常低效?

节点中实际上有线程支持吗?(一个简短的谷歌没有带来任何具体的结果)

4

1 回答 1

4

基本上你的方向是正确的,你需要某种进程间通信。这真的取决于您的 IPC 有多复杂。如果只是调用一些方法并在方法之间共享简单(即整数、字符串)数据,那么您可以使用 unix 套接字,它们相当容易实现并且由 nodejs 本机支持并且很容易从 C 中使用好吧(因为所需的标头几乎总是可用的)

ZeroMQ 为您提供了传输抽象(允许 IPC 或真正的基于网络的传输)和许多针对甚至晦涩语言的绑定。提供的 C 和 Node 示例应该让您立即开始。但是,您需要相应的头文件和库;很可能需要先构建。

如果您要在程序之间交换的数据将变得更加复杂(读取结构或数组、嵌套对象),那么您将需要一些真正的 RPC 实现。那里有一堆 RPC 实现;功能方面的 Apache Thrift 对我来说看起来很有希望,尽管最终我无法在合理的时间内构建 thrift 编译器。

所以最后,对我来说,有一个非常相似的用例,我最终使用 ZeroMQ 作为传输抽象,并在此之上使用 JSON-RPC 作为 RPC 机制。JSON-RPC 非常适合 nodejs 和 CI 使用https://github.com/pijyoi/jsonrpc,它建立在 ZeroMQ 和 Jansson 之上。文档不存在,但如果你走到那一步,你不应该害怕。

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

于 2013-12-12T17:16:53.020 回答