Зависание розетки ECONRESET

У меня есть функция, которая запускается в базе данных firebase onWrite. Тело функции использует два облачных API Google (DNS и хранилище).

Хотя функция работает и работает как положено (в основном), проблема в том, что Socket зависает чаще, чем хотелось бы. (50%~ раз)

Мои вопросы таковы: похоже ли это на то, что испытали остальные тестеры? Является ли это хорошо известной проблемой, которая является нерешенной или ожидаемой?

пример кода выглядит следующим образом:

const functions = require('firebase-functions');
const admin = require('firebase-admin');
const {credentials} = functions.config().auth;
credentials.private_key = credentials.private_key.replace(/\\n/g, '\n');
const config = Object.assign({}, functions.config().firebase, {credentials});
admin.initializeApp(config);
const gcs = require('@google-cloud/storage')({credentials});
const dns = require('@google-cloud/dns')({credentials});
const zoneName = 'applambda';
const zone = dns.zone(zoneName);

exports.createDeleteDNSAndStorage = functions.database.ref('/apps/{uid}/{appid}/name')
.onWrite(event => {
    // Only edit data when it is first created.
    const {uid, appid} = event.params;
    const name = event.data.val();
    const dbRef = admin.database().ref(`/apps/${uid}/${appid}`);

    if (event.data.previous.exists()) {
        console.log(`already exists ${uid}/${appid}`);
        return;
    }
    // Exit when the data is deleted.
    if (!event.data.exists()) {
        console.log(`data is being deleted ${uid}/${appid}`);
        return;
    }

    const url = `${name}.${zoneName}.com`;
    console.log(`data: ${uid}/${appid}/${name}\nsetting up: ${url}`);

    setupDNS({url, dbRef});
    setupStorage({url, dbRef});
    return;
});

function setupDNS({url, dbRef}) {

    // Create an NS record.
    let cnameRecord = zone.record('cname', {
        name: `${url}.`,
        data: 'c.storage.googleapis.com.',
        ttl: 3000
    });

    zone.addRecords(cnameRecord).then(function() {
        console.log(`done setting up zonerecord for ${url}`);
        dbRef.update({dns: url}).then(res => console.log(res)).catch(err => console.log(err));
    }).catch(function(err) {
        console.error(`error setting up zonerecord for ${url}`);
        console.error(err);
    });
}

function setupStorage({url, dbRef}) {
    console.log(`setting up storage bucket for ${url}`);

    gcs.createBucket(url, {
        website: {
            mainPageSuffix: `https://${url}`,
            notFoundPage: `https://${url}/404.html`
        }
    }).then(function(res) {
        let bucket = res[0];
        console.log(`created bucket ${url}, setting it as public`);
        dbRef.update({storage: url}).then(function() {
            console.log(`done setting up bucket for ${url}`);
        }).catch(function(err) {
            console.error(`db update for storage failed ${url}`);
            console.error(err);
        });
        bucket.makePublic().then(function() {
            console.log(`bucket set as public for ${url}`);
        }).catch(function(err) {
            console.error(`setting public for storage failed ${url}`);
            console.error(err);
        });
    }).catch(function(err) {
        console.error(`creating bucket failed ${url}`);
        console.error(err);
    });
}

person Adnan Y    schedule 02.04.2017    source источник
comment
см. также: stackoverflow.com/questions/43058274/   -  person Paul    schedule 03.04.2017


Ответы (1)


Я думаю, что ваша функция должна вернуть обещание, чтобы вся остальная асинхронная работа успела завершиться до закрытия функции. Как показано сейчас, ваши функции просто немедленно возвращаются, не дожидаясь завершения работы.

Я не очень хорошо знаю облачные API, которые вы используете, но я предполагаю, что вы должны заставить свои setupDns() и setupStorage() возвращать обещания из асинхронной работы, которую они выполняют, а затем возвращать Promise.all(), передавая эти два обещания, чтобы позволить Облачные функции знают, что должны дождаться завершения всей этой работы, прежде чем очищать контейнер, в котором выполняется функция.

person Doug Stevenson    schedule 02.04.2017
comment
Я понял это после того, как задал вопрос. Тем не менее, случайные сбросы все еще случаются, возможно, не так часто, хотя я не могу судить, уменьшилась ли частота. Я попробую то, что Пол предложил в своем комментарии, и сообщу, если это исправит - person Adnan Y; 04.04.2017