MongoDB实时应用程序中的丢失数据

时间:2016-09-30 15:52:34

标签: node.js mongodb mongoose socket.io real-time

我正在开发一个实时应用程序(节点,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会出现问题吗?

或者只是我正在做一些阻止事件循环的事情,但我无法看到它。

由于

0 个答案:

没有答案