为什么nodejs处理丢失的数据?

时间:2017-11-12 13:30:15

标签: javascript json node.js gps

我现在对丢失数据感到困惑,无法弄清楚原因。所以我编写了一项服务,将GPS信息从设备发送到端点。

我使用pm2启动我的流程,但问题是这项服务有时候不会将信息发送到端点,而设备正在发送数据。到目前为止的解决方案是在pm2中重新启动实例。但这有时是不可行的,因为我创建了一个crontab,每隔45分钟在pm2重启GPS实例,但它恰好在时间窗口中丢失信息< 45分钟这不起作用......

我无法解决这个问题。为什么我丢失数据并重新启动一切都没关系?当孩子将数据发送给父母并且我读到了两个可能的原因时,我在node.js进程中看到有关丢失数据的堆栈溢出的帖子:

  1. 孩子没有足够快地及时阅读GPS数据信息以发帖并发送信息。
  2. 孩子需要制作发送给父母的内容的JSON.stringify,父母需要制作收到的信息的JSON.parse。
  3. 这是我的代码:

    var child_process = require("child_process");
    var argv = require('minimist')(process.argv.slice(2));
    
    //ex: nsGPSService.js -d 1111-11-11-111
    var deviceId = argv.d;
    var processDevices = [];
    
    function runParent() {
      setTimeout(function() {
        return Database.Devices.getDevices().then(function(devices) {
          return new Promise(function(resolve, reject) {
            async.each(devices, function(device, callback) {
              var result = _.filter(processDevices, { "id": device.id });
    
              if (result.length == 0) {
                var process = child_process.fork(__dirname + '/nsGPSService.js', ["-d", device.id]);
    
                processDevices.push({ "process": process, "id": device.id });
                process.on('message', function(data) {
                  //receber mensagens do filho
                  if (data.reason == "deleted") {
                    //child end process and alerts parent to remove from the list
                    var index = _.findIndex(processDevices, { "id": data.deviceId });
                    processDevices.splice(index, 1);
                  }
                });
                process.on('exit', function(code) {});
                process.on("uncaughtException", function(error) {
                  process.exit(1);
                });
              }
    
              callback();
            }, function(error) {
              error ? reject(error) : resolve();
            });
          }).then(function() {
            runParent()
          }).catch(function(error) {
            runParent()
          });
        });
      }, 5000);
    }
    
    if (!deviceId) {
      return runParent();
    }
    
    
    function runChild(id) {
      setTimeout(function() {
        return Database.Devices.getDeviceById(id).then(function(device) {
          if (!device) {
            proccess.send({
              "deviceId": id,
              "reason": "deleted"
            });
            process.exit();
            return;
          }
          return Controllers.Gps.getRadioInfo('gps', 'info', {}, device).then(function(data) {
            return Controllers.Gps.sendDeviceInfo(data, device);
          }).then(function() {
            return runChild(id);
          }).catch(function(e) {
            return runChild(id);
          });
        });
      }, 5000);
    }
    

    我真的需要弄清楚这一点,因为我不知道什么时候需要重新启动服务,因为我实际上没有收到信息我接收了......

    哪种解决方案在我的场景中真的可行,任何人都可以解决这个问题?

0 个答案:

没有答案