当我使用带有.stream()

时间:2017-08-04 09:47:36

标签: node.js mongodb mongoose

我正在尝试使用带流的tailable游标。我们正在使用mongoose并且它可以工作但是当我用这段代码启动我的服务器时:

const listStream = ListsSub.find()
  .tailable({
    await_data: true,
    numberOfRetries: -1,
  })
  .stream();

我的CPU过热了。

代码处于活动状态时

活动监视器

enter image description here

评论.stream()使服务器再次运行良好。

代码在注释时的活动监视器

enter image description here

如果没有它,我真的不知道怎么做。 这是我的代码吗?任何人都遇到过同样的问题吗?

编辑:

  • mongoose:4.11.3
  • mongodb:3.4.6
  • node:8.1.2
  • 同一台计算机上的服务器和mongodb

2 个答案:

答案 0 :(得分:7)

这里有几件事要做。第一个值得注意的事情是使用.cursor()方法而不是.stream(),正如在使用时发布的弃用警告中实际指示的那样:

  

DeprecationWarning:Mongoose:在mongoose> = 4.5.0中不推荐使用Query.prototype.stream(),而是使用Query.prototype.cursor()

第二个值得注意的事情是,如.cursor()文档中所指定的,现在直接从底层驱动程序返回“包装流”接口。因此,建议使用现代.addCursorFlag()选项,而不是mongoose Query中的.tailable()方法。

一旦这两个措施都到位,我发现mongodnode进程的空闲CPU在更新间隔之间降至0%

最好使用以下列表进行模拟。

const mongoose = require('mongoose'),
      Schema = mongoose.Schema;

mongoose.Promise = global.Promise;
mongoose.set('debug',true);

const uri = 'mongodb://localhost/tailing',
      options = { useMongoClient: true };

const subSchema = new Schema({
  name: String
},{
  capped: { size: 1024, max: 1000 }
});

const Sub = mongoose.model('Sub', subSchema);

function log(data) {
  console.log(JSON.stringify(data, undefined, 2))
}

(async function() {

  try {

    const conn = await mongoose.connect(uri,options);

    //await Sub.remove({});

    await Sub.insertMany(Array(50).fill(1).map((e,i) => ({ name: i+1 })));

    let stream = Sub.find()
      .cursor()
      .addCursorFlag('tailable',true)
      .addCursorFlag('awaitData',true);
      /*
      .tailable({
        await_data: true,
        numberOfRetries: -1
      })
      .cursor();
      */

    stream.on('data',function(data) {
      log(data);
    });

    let counter = 50;


    setInterval(async function() {
      counter++;
      await Sub.insertMany({ name: counter });
    },10000);

  } catch(e) {
    console.log(e);
  } finally {
    //mongoose.disconnect();
  }

})();

作为实际写入捕获的普通旧顶部输出发生:

top - 21:38:29 up 12 days,  1:23,  3 users,  load average: 0.06, 0.03, 0.04
Tasks: 116 total,   2 running, 114 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.3 us,  0.3 sy,  0.0 ni, 98.6 id,  0.7 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  2045968 total,   207452 free,   813908 used,  1024608 buff/cache
KiB Swap:  2097148 total,  2097124 free,       24 used.  1028156 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND
 1257 mongodb   20   0 1946896 487336  34892 S  0.7 23.8 130:37.67 mongod
28233 neillunn  20   0 1021460  41920  22996 S  0.3  2.0   0:00.67 node
30956 neillunn  20   0  101472   4384   3352 S  0.3  0.2   0:20.95 sshd

答案 1 :(得分:0)

我正在使用mongooseV5.9.2,我需要添加以下方法来解决此问题

let options = { tailable: true, 
                awaitData: true, 
                numberOfRetries: -1, 
                tailableRetryInterval: 200
              };
    collection.find().cursor(options);