我现在对丢失数据感到困惑,无法弄清楚原因。所以我编写了一项服务,将GPS信息从设备发送到端点。
我使用pm2启动我的流程,但问题是这项服务有时候不会将信息发送到端点,而设备正在发送数据。到目前为止的解决方案是在pm2中重新启动实例。但这有时是不可行的,因为我创建了一个crontab,每隔45分钟在pm2重启GPS实例,但它恰好在时间窗口中丢失信息< 45分钟这不起作用......
我无法解决这个问题。为什么我丢失数据并重新启动一切都没关系?当孩子将数据发送给父母并且我读到了两个可能的原因时,我在node.js进程中看到有关丢失数据的堆栈溢出的帖子:
这是我的代码:
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);
}
我真的需要弄清楚这一点,因为我不知道什么时候需要重新启动服务,因为我实际上没有收到信息我接收了......
哪种解决方案在我的场景中真的可行,任何人都可以解决这个问题?