将NodeJS连接对象保留在共享数据库/内存中

时间:2017-10-18 06:59:58

标签: node.js redis

我正在使用NodeJS 6运行Debian 8,并正在使用IBM Watson IoT平台:https://github.com/ibm-watson-iot/iot-nodejs

我在IBM创建了一个网关,并且能够使用以下代码连接并向其发布数据:

var gatewayClient = new iotf.IotfGateway(config);

gatewayClient.connect();

gatewayClient.on('connect', function(){
    gatewayClient.publishGatewayEvent("status","json",'{"d" : { "cpu" : 60, "mem" : 50 }}');

});

配置包含有关我的唯一网关的唯一信息。

我现在面临的挑战是,我希望能够在其他NodeJS实例中重用此gatewayClient。所以我想到了类似下面的内容(伪代码):

var gatewayClient = new iotf.IotfGateway(config);
gatewayClient.connect();

sharedDatabase-perhaps-Redis[unique-gatewayClient-ID].push(gatewayClient);

然后在我可以调用的同一台服务器上的任何NodeJS中:

sharedDatabase-perhaps-Redis[unique-gatewayClient-ID].publishGatewayEvent("status","json",'{"d" : { "cpu" : 60, "mem" : 50 }}');

我希望它有意义,但如果它可以存档以及如何使用,以及如果Redis可以成为解决方案或其他数据库类型,我会感到有点困惑。

整个想法是能够使连接保持活动/持久性,并让来自不同NodeJS实例的客户端通过该实例推送数据,而无需创建新连接。

1 个答案:

答案 0 :(得分:1)

网络连接不可序列化,无法跨进程轻松共享。

相反,你应该考虑创建一个" master"维护与IBM后端的连接的进程,客户端将直接与此主服务器通信,而不是直接与IBM通信(出于物联网的目的,一种常见的通信方法是使用MQTT)。

此外,是什么阻止您在一个进程中运行将在这些单独的Node.js进程中运行的代码?这也可以解决问题,因为每个部分都可以直接使用连接。

据我所知,您已经拥有一个接受客户端消息的服务器进程,并且应该将这些消息转发给IBM后端。对于每个唯一客户端,您希望创建与后端的新连接,或重新使用以前创建的连接。

你可以使用这样的东西(为了简洁而保留错误处理):

// Function to get the connection for a particular client id,
// or, if one doesn't exist yet, create a new one.

let clients = {};
function connectionForClient(uniqueGatewayClientID) {
  // Check if we already have a connection for this client.
  if (! clients[uniqueGatewayClientID])

    // No, create a new one, represented by a promise.
    clients[uniqueGatewayClientID] = new Promise(function(resolve) {
      let client = new iotf.IotfGateway(config);

      client.connect();

      client.on('connect', function() {
        resolve(client);
      });
    });

  }
  return clients[uniqueGatewayClientID];
}

使用:

connectionForClient(uniqueGatewayClientID).then(function(client) {
  client.publishGatewayEvent("status","json",'{"d" : { "cpu" : 60, "mem" : 50 }}');
});