У меня есть то, что кажется очень простой базой + 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 задач решены, пока она не выходит из строя.
Любая идея о том, что здесь происходит?
Это работает на:
- узел 6.7.0
- firebase-админ 4.0.4
- firebase-очереди 1.6.1
- geofire 4.1.1
Что делать, если вы также отмените сам запрос: 'geoQuery.cancel();'? Без этого не будет ли у вас запроса, зависающего для каждой задачи, обработанной из очереди? – cartant
Это похоже на это. Благодарю. Если вы опубликуете ответ, я соглашусь с ним. – brainbolt