2017-01-13 8 views
1

У меня есть то, что кажется очень простой базой + firebase-queue + код GeoFire, запущенный на узле, который, как представляется, приводит к утечке памяти, но я не уверен, что я никого не навожу.Узел утечки памяти GeoFire?

'use strict'; 

if (!process.env.FIREBASE_PROJECT_ID) { 
    require('dotenv').config({ silent: true }); 
} 

let fbConfig = require('./firebase-config'); 
let fbNodes = fbConfig.NODES; 
let Queue = require('firebase-queue'); 
let admin = require("firebase-admin"); 
let GeoFire = require('geofire'); 

admin.initializeApp({ 
    credential: admin.credential.cert(fbConfig.FIREBASE_SERVICE_ACCOUNT), 
    databaseURL: fbConfig.APP_SETTINGS.databaseURL 
}); 

let db = admin.database(); 
let queueRef = db.ref(fbNodes.QUEUE); 
let geoFire = new GeoFire(db.ref(fbNodes.GEOFIRE)); 

var q = new Queue(queueRef, function (data, progress, resolve, reject) { 
    let geoQuery = geoFire.query({ 
    center: data.queryCenter, 
    radius: data.maxDistanceKm 
    }); 

    // fires for every key returned by the geoQuery 
    let listener = geoQuery.on('key_entered', function (key, loc, dist) { 
    // do nothing 
    }); 

    // This will fire once the initial data is loaded, so now we can cancel 
    // the "key_entered" event listener 
    geoQuery.on('ready', function() { 
    listener.cancel(); 
    resolve(); 
    }); 
}); 

Вот график потребления памяти из памяти-использования, который показывает этот код уплетая 1,5 ГБ памяти примерно через 10 минут и 1100 задач решены, пока она не выходит из строя.

memory consumption charted by memory-usage

Любая идея о том, что здесь происходит?

Это работает на:

  • узел 6.7.0
  • firebase-админ 4.0.4
  • firebase-очереди 1.6.1
  • geofire 4.1.1
+0

Что делать, если вы также отмените сам запрос: 'geoQuery.cancel();'? Без этого не будет ли у вас запроса, зависающего для каждой задачи, обработанной из очереди? – cartant

+0

Это похоже на это. Благодарю. Если вы опубликуете ответ, я соглашусь с ним. – brainbolt

ответ

2

Утечка вызвана запросами GeoFire. Каждый раз, когда задача из очереди обрабатывается, создается запрос, но эти запросы никогда не отменяется - только их слушатели.

Чтобы подключить утечку, позвоните по телефону cancel по запросам, когда все будет готово. Например:

geoQuery.on('ready', function() { 
    listener.cancel(); 
    geoQuery.cancel(); 
    resolve(); 
});