Функция Firebase всегда имеет тайм-аут для больших файлов?

#node.js #firebase #google-app-engine #google-cloud-functions #google-cloud-storage

#node.js #firebase #google-app-engine #google-cloud-функции #google-облачное хранилище

Вопрос:

Я создал функцию firebase, которая запускается при загрузке видео в хранилище firebase и с помощью ffmpeg добавляет к нему водяной знак, он отлично работает с небольшими размерами видео, но всегда имеет тайм-аут в больших. Есть идеи, как я могу преодолеть эти ограничения

 const functions = require('firebase-functions');
const { Storage, Bucket } = require('@google-cloud/storage');
const projectId = 'video-sharing-a57fa';
const admin = require('firebase-admin');
admin.initializeApp();

let gcs = new Storage({
    projectId
});
const os = require('os');
const path = require('path');
const spawn = require('child-process-promise').spawn;


exports.addLogo = functions.runWith({ memory: '4GB', timeoutSeconds: 540 }).storage.object().onFinalize(async event => {

const bucket = event.bucket;
const contentType = event.contentType;
const filePath = event.name;
console.log('File change detected, function execution started');
if (path.basename(filePath).startsWith('resized-')) {
    console.log('We already renamed that file!');
    return;
}
const destBucket = gcs.bucket(bucket);
const tmpFilePath = path.join(os.tmpdir(), path.basename(filePath));
const metadata = { contentType: contentType };
const tmpLogoPath = path.join(os.tmpdir(), 'watermark.png');
await destBucket.file('watermark.png').download({
    destination: tmpLogoPath
})

const newPath = path.join(os.tmpdir(), 'output.mp4')

return destBucket.file(filePath).download({
        destination: tmpFilePath
    }).then(() => {
        console.log('entered spawn');
        var str = "overlay=10:10"
        return spawn('ffmpeg', ['-i', tmpFilePath, '-i', tmpLogoPath, '-filter_complex', str, newPath]);
    }).then(() => {
        console.log('chaning the name');
        return destBucket.upload(newPath, {
            destination: path.dirname(filePath)   '/resized-'   path.basename(filePath),
            metadata: metadata
        })
    });
 

})

Ответ №1:

Облачные функции имеют ограниченное время выполнения, оно ограничено максимум 9 минутами. Дополнительная информация здесь. Скорее всего, проблема в том, что ffmpeg не удается вовремя добавить водяной знак. Ваши действия должны быть:

  1. Проверьте журнал функции, чтобы убедиться, что это именно ошибка firebase functions:log --only <FUNCTION_NAME>
  2. Рассмотрите другой вариант архитектуры для обработки действительно больших файлов:
    a. Ограничьте объем обработки данных ffmpeg , например, с -ss 50 -t 10 помощью . В этом сценарии будет следующая архитектура: а) одна функция, которая считывает файлы и помещает их в очередь, б) одна функция, которая считывает размер файла и помещает данные в другую очередь, например {name: "file1.mp4", start: 10, duration: 15}
    б. Используйте контейнер по требованию, такой как Cloud Run
    c. Используйте App Engine в случае, если вы постоянно обрабатываете некоторые файлы