我正在开发一个实时应用程序(节点,socket.io和带有Mongoose的mongoDB ),它每30秒接收一次数据。收到的数据是关于机器的一些元数据和10个压力。
我每天都有一个文件,当日期发生变化时会预先分配(避免在文档增长时保存数据时在数据库中移动数据),所以我只需要做更新。
数据如下:
{
metadata: { .... }
data: {
"0":{
"0":{
"0":{
"pressures" : {.....},
},
"30":{}
},
"1":{},
"59":{}
},
"1":{},
"23":{}
}
},
如果没有在服务器中执行任何数据库操作,我每隔30秒就会从传感器接收数据而不会出现问题,并且永远不会丢失socket.io连接:
DATA 2016-09-30T16:02:00+02:00
DATA 2016-09-30T16:02:30+02:00
DATA 2016-09-30T16:03:00+02:00
DATA 2016-09-30T16:03:30+02:00
DATA 2016-09-30T16:04:00+02:00
DATA 2016-09-30T16:04:30+02:00
但是当我开始进行更新(调用DataDay.findById(_id).exec()...)时,我丢失了一半的数据,有时也丢失了socket.io连接,即(16:18h,17:10h,17 :49h,18:12h ..),它就像服务器每隔一段时间停止接收套接字信息
DATA 2016-09-30T16:02:00+02:00
LOST
LOST
DATA 2016-09-30T16:03:30+02:00
DATA 2016-09-30T16:04:00+02:00
LOST
LOST
DATA 2016-09-30T16:05:30+02:00
LOST
我正在使用MONGODB和mongoose(蓝鸟承诺),但我可能正在进行一些阻止操作或出错,但我无法找到它。
处理收入数据的代码是:
socket.on('machine:data', function (data) {
console.log('DATA ' + data.metada.date));
var startAt = Date.now(); // Only for testing
dataYun = data;
var _id = _createIdDataDay(dataYun._id); // Synchronous
DataDay.findById(_id).exec() // Asynchronous
.then( _handleEntityNotFound ) // Synchronous
.then( _createPreData ) // Asynchronous
.then( _saveUpdates ) // Asynchronous
.then( function () {
console.log('insertData: ' + (Date.now() - startAt + ' ms'));
})
.catch( _handleError(data) );
console.log('AFTER DE THE INSERT METHOD');
console.log(data.data.pressures);
});
我控制了操作的成本,并且:
_createIdDataDay: 0 ms
_handleEntityNotFound: 1 ms
_createPreData 709 ms // only is executed once a day
_saveUpdates: 452 ms
insertData: 452 ms
此测试仅在一台机器发送数据时完成,但目标是从50台到100台机器接收数据,所有机器都同时发送数据。
所以从这个测试得出的结论是,每30秒我必须更新数据库,操作持续时间大约为452毫秒。
所以我不明白问题所在。
更新时452毫秒太昂贵了吗? 即便如此,我没有做更多的操作,下一个数据在30秒内出现,所以它没有意义上的损失数据
我知道承诺对多个事件并不适用(但我认为情况并非如此),但不确定。
socket.io
会出现问题吗?
或者只是我正在做一些阻止事件循环的事情,但我无法看到它。
由于