在 Linux 上的两个应用程序之间共享数据

Sharing data between two applications on Linux

本文关键字:应用程序 两个 之间 共享 数据 Linux      更新时间:2023-10-16

我有两个进程在Linux上运行,一个是NodeJs应用程序,另一个是C++应用程序。NodeJs 应用程序从服务器接收数据,服务器也是一个 NodeJS 应用程序,现在这些数据将由C++应用程序使用。

现在,我正在从 NodeJs 应用程序将数据写入文本文件中,然后从C++应用程序读取它。但这很慢,也会导致问题,因为文件可以异步写入。

我的问题是,在这两个应用程序之间共享数据的最佳方式是什么,请记住数据可以异步接收?

在 NodeJS 中为C++应用程序创建 REST API。(C++ 客户端:https://github.com/mrtazz/restclient-cpp)。

例:

var express = require('express');
var app = express();
app.get('/data', function (req, res) {
   var dataObjectToSendHere = 'here';
   res.json(dataObjectToSendHere);
})
var server = app.listen(8081, function () {
  var host = server.address().address
  var port = server.address().port
  console.log("Example app listening at http://%s:%s", host, port)
})

为了进一步帮助您,您需要件事:将数据从一个应用程序发送到另一个应用程序(您现在使用的文件),以及从一个进程异步发出另一个进程的信号(告诉它数据可用)。

实际上,您可以对文件执行此操作,但不是仅使用单个文件,而是使用多个文件每次有新数据时一个。将它们写入另一个进程监视更改的特殊目录中,当它检测到新文件时,它只是读取该文件,然后将其删除。

另一种方法是通过命名管道或套接字(本地(即 AF_LOCAL)或"正常")。然后在TCP或UDP之上发明一个简单的协议,可以处理信令和批量数据传输。

当然,由于一个应用程序是节点.js应用程序,您可以简单地使用类似 REST 的接口,并让另一个程序轮询新数据。为此,您不需要任何类型的异步信令,相反,node.js应用程序收集和缓存所有传入的数据,当其他应用程序轮询数据时,您传输自上次轮询以来到达的所有数据。

还有许多其他方法可以做到这一点,只需阅读我在评论中链接到的文章即可了解有关所有这些方法的更多信息。

正如其他人指出的那样,有多种进程间通信方式,例如消息传递、共享内存、文件等。在这里,我想推荐一种反应式方法来解决此问题,因为正如您提到的,数据可以异步传输。您可以使用内存中数据源(如 redis)向其读取和写入数据。它应该提供与节点js的良好集成,这是一个没有sql的数据库。这将帮助您减少文件 I/O 的延迟。现在,您可以构建发布者/订阅者范例,订阅者将收到有关数据库中任何更改的通知。Redis 为此提供了一个接口。如果有疑问,请告诉我。

使用带有本地主机的套接字,我认为很好。