【问题标题】:Inter-process communication between node and C application节点和C应用程序之间的进程间通信
【发布时间】:2013-05-27 20:01:25
【问题描述】:

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

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

我想要的对话很简单,

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

  • 节点:删除此参考
  • C 应用程序:当然,伙计。

有什么方法可以轻松地在两者之间传递消息吗?

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

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

是不是非常低效?

node 中真的有线程支持吗? (一个简短的谷歌并没有带来任何具体的结果)

【问题讨论】:

  • 节点是单线程的。但是,您可以同时运行多个进程。
  • 你的计划听起来不错,我认为
  • 使用消息队列(ZeroMQ、RabbitMQ 等),我不知道你为什么认为你需要多线程,因为 Node 中的套接字几乎总是非阻塞的。
  • 不同节点进程可以共享同一个对象吗?
  • @DimaK:不,他们不能。

标签: c node.js ipc


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-07
    • 1970-01-01
    • 2011-01-05
    • 2017-04-09
    • 2018-02-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多