Потоковый файл из Google Storage -> Облачная функция -> Хранилище очень медленное или время ожидания истекло - PullRequest
0 голосов
/ 22 апреля 2020

Я пытаюсь передать файл из хранилища 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

Есть идеи, где я ошибаюсь, или это известное ограничение, которое я пропустил? (Я много смотрел!)

Спасибо

Джон

1 Ответ

1 голос
/ 23 апреля 2020

Решение состояло из трех частей:

  1. Выполните обещание, предложенное Дагом
  2. Верните обещание
  3. Увеличьте параметр развертывания --memory = 2048MB поскольку это означает, что мы также используем процессор приличного размера - что я не осознал - и это останавливает тайм-ауты

Я отредактировал код в своем вопросе, но здесь он снова все равно:

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)

}

Развертывание в gcp:

Развертывание функций gcloud = 2048MB

...