Я пытаюсь обновить свой бэкэнд облачных функций до узла 8, потому что узел 6 не поддерживается GCP. Я обнаружил, что узел 8 на значительно медленнее, чем узел 6, до такой степени, что мои функции иногда отключаются. Приложение, над которым я работаю, позволяет пользователю загружать фотографии в облачное хранилище, которое запускает облачную функцию, которая извлекает exif-данные из фотографий и сохраняет их в БД.
Чтобы упростить задачу, я написал облачную функцию тестера, которая показывает несоответствие между узлами 6 и 8. Тестер запускается при загрузке фотографий, а затем просто загружает файл из другого сегмента. Ниже приведены программы и команды, которые я использовал для их развертывания:
Проверка узла 6:
const Storage = require('@google-cloud/storage');
bucketName = 'MY_BUCKET_NAME'
fileName = 'db-config.json'
/**
* Generic background Cloud Function to be triggered by Cloud Storage.
*
* @param {object} event The Cloud Functions event.
* @param {function} callback The callback function.
*/
exports.node8Test = (event, callback) => {
const storage = new Storage({
projectId: process.env.GCP_PROJECT
});
var start = Date.now()
storage.bucket(bucketName).file(fileName).download().then((config) => {
console.log(Date.now() - start)
callback()
});
};
Команда развертывания узла 6:
gcloud functions deploy node8Test --trigger-resource MY_BUCKET_NAME --trigger-event google.storage.object.finalize --runtime=nodejs6 --timeout=450s
Проверка узла 8:
const Storage = require('@google-cloud/storage');
bucketName = 'MY_BUCKET_NAME'
fileName = 'db-config.json'
/**
* Generic background Cloud Function to be triggered by Cloud Storage.
*
* @param {object} data The event payload.
* @param {object} context The event metadata.
*/
exports.node8Test = (data, context) => {
const storage = new Storage({
projectId: process.env.GCP_PROJECT
});
var start = Date.now()
storage.bucket(bucketName).file(fileName).download().then((config) => {
console.log(Date.now() - start)
});
};
Команда развертывания узла 8:
gcloud functions deploy node8Test --trigger-resource MY_BUCKET_NAME --trigger-event google.storage.object.finalize --runtime=nodejs8 --timeout=450s
Вот мои результаты:
- Проверка узла 6 завершилась со средним временем 273 мс (загружено 10 элементов и усреднено время)
- Тест узла 6 никогда не занимал больше времени, чем 550 мс
- Тест узла 8 завершился со среднимвремя 17,160 мс , более 17 секунд (загружено 10 элементов и усреднено время)
- Все тесты узла 8 заняли 6000 мс при самом длительном прохождении теста в течение 26 секунд
Как это исправить?
РЕДАКТИРОВАТЬ: добавлены fileName и bucketName вверху. Этот файл представляет собой крошечный простой текстовый файл, который содержит один объект json с 4 свойствами, и все они являются строками, которые определяют конфигурации подключения к базе данных.
ОБНОВЛЕНИЕ: Исходные данные теста, полученные выше, были получены с использованием облачного хранилища nodejs версии 1.7. 0. После этого я снова запустил тест узла 8 после обновления до последней версии облачного хранилища nodejs (версия 4.0.0) и все еще наблюдаю такое же медленное время отклика. Еще одна вещь, которую нужно добавить: файл 'db-config.json' загружается во все мои другие 20-некоторые бэкенд-облачные функции. Однако эти облачные функции запускаются по протоколу http и работают на узле 8 так же быстро, как и на узле 6. Кажется, что замедление узла 8 происходит только в облачных функциях, запускаемых загрузкой облачного хранилища.