Я пытаюсь передать файл из хранилища Google через облачную функцию в новый файл в другом хранилище - мой реальный пример использования - преобразование данных в CSV-файлы, но в приведенном ниже примере эта часть для простоты удалена.
У меня есть два ведра <bucket-name>
и <bucket-name>-copy
.
Код:
const util = require('util')
const stream = require('stream')
const pipeline = util.promisify(stream.pipeline);
const {Storage} = require('@google-cloud/storage')
const storage = new Storage()
exports.testStream = (event) => {
const file = event;
console.log(`Processing file: ${JSON.stringify(file)}`)
const startDate = Date.now()
async function run() {
await pipeline(
storage.bucket(file.bucket).file(file.name).createReadStream(),
storage.bucket(file.bucket+'-copy').file(file.name).createWriteStream({gzip: true})
)
console.log('Pipeline complete. Time:', Date.now() - startDate, 'ms')
}
return run().catch(console.error)
}
Я развертываю облачную функцию в том же регионе, что и сегменты: функции gcloud внедряют testStream --runtime nodejs10 --region europe-west2 --trigger-resource <bucket-name>
--trigger-event google.storage.object.finalize --memory = 256MB
Чтобы вызвать функцию, я копирую небольшой 100-строчный CSV-файл в корзину sr c:
gsutil cp 100Rows.txt gs: // <bucket-name>
Если я запускаю функцию локально, она выполняется немедленно, как и ожидалось, фактически я могу передавать потоковые файлы 1M в линейное время, как вы могли ожидать. Тем не менее, вышеописанная функция развернутого облака занимает около 45 секунд, чтобы скопировать этот крошечный файл, а большие файлы просто никогда не завершаются. Я также замечаю, что журнал успеха конвейера идет после того, как функция выполнит ok log.
2020-04-22 20:20:40.496 BST
testStream1142856940990219Function execution started
2020-04-22 20:20:40.554 BST Processing file: {"bucket":"my-bucket","name":"100Rows.txt"} //removed rest of object for brevity
2020-04-22 20:20:40.650 BST Function execution took 155 ms, finished with status: 'ok'
2020-04-22 20:21:33.841 BST Pipeline succeeded. Time: 53286 ms
Есть идеи, где я ошибаюсь, или это известное ограничение, которое я пропустил? (Я много смотрел!)
Спасибо
Джон