Советы и хитрости

В этом документе описываются передовые методы проектирования, внедрения, тестирования и развертывания облачных функций.

Правильность

В этом разделе описываются общие рекомендации по разработке и внедрению облачных функций.

Напишите идемпотентные функции

Ваши функции должны давать одинаковый результат, даже если они вызываются несколько раз. Это позволяет вам повторить вызов, если предыдущий вызов завершился неудачно на этапе выполнения вашего кода. Для получения дополнительной информации см Повторное обращение фоновых функций .

Не запускайте фоновые действия

Фоновая активность - это все, что происходит после завершения вашей функции. Функция вызов завершается , как только функция возвращает или иным образом сигнализирует завершение, например, путем вызова callback аргумента в фоновых функциях Node.js. Любой код, запускаемый после постепенного завершения, не может получить доступ к ЦП и не будет выполнять никаких действий.

Кроме того, когда последующий вызов выполняется в той же среде, ваша фоновая активность возобновляется, препятствуя новому вызову. Это может привести к неожиданному поведению и ошибкам, которые трудно диагностировать. Доступ к сети после функции завершает как правило , приводит к соединениям сбрасываются ( ECONNRESET код ошибки).

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

Всегда удалять временные файлы

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

Вы можете увидеть память , используемую в отдельной функции, выбрав его в списке функций в ГКП консоли и выборе использования памяти сюжет.

Не пытайтесь писать вне временного каталога и обязательно используйте методы, не зависящие от платформы / ОС, для построения путей к файлам.

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

Инструменты

В этом разделе приведены рекомендации по использованию инструментов для реализации, тестирования и взаимодействия с облачными функциями.

Местное развитие

Развертывание функции занимает немного времени, поэтому часто бывает быстрее протестировать код вашей функции локально.

Firebase разработчики могут использовать функции Firebase CLI Cloud эмулятора .

Используйте Sendgrid для отправки писем

Cloud Functions не разрешает исходящие подключения через порт 25, поэтому вы не можете создавать незащищенные подключения к SMTP-серверу. Рекомендуемый способ отправки сообщений электронной почты является использование SendGrid . Вы можете найти другие варианты для отправки электронной почты в отправке электронной почты из экземпляра учебника для Google Compute Engine.

Представление

В этом разделе описаны передовые методы оптимизации производительности.

С умом используйте зависимости

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

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

Уменьшите количество холодных запусков, установив минимальное количество экземпляров

По умолчанию Cloud Functions масштабирует количество экземпляров в зависимости от количества входящих запросов. Вы можете изменить это поведение по умолчанию, установив минимальное количество экземпляров, которое облачные функции должны держать готовыми для обслуживания запросов. Установка минимального количества экземпляров сокращает холодный запуск вашего приложения. Мы рекомендуем установить минимальное количество экземпляров, если ваше приложение чувствительно к задержкам.

См поведения масштабирования управления для получения дополнительной информации об этих параметрах выполнения.

Используйте глобальные переменные для повторного использования объектов в будущих вызовах

Нет никакой гарантии, что состояние облачной функции будет сохранено для будущих вызовов. Однако облачные функции часто повторяют среду выполнения предыдущего вызова. Если вы объявляете переменную в глобальной области видимости, ее значение можно повторно использовать в последующих вызовах без повторного вычисления.

Таким образом, вы можете кэшировать объекты, воссоздание которых может оказаться дорогостоящим при каждом вызове функции. Перемещение таких объектов из тела функции в глобальную область может привести к значительному повышению производительности. В следующем примере тяжелый объект создается только один раз для каждого экземпляра функции и используется для всех вызовов функций, достигающих данного экземпляра:

console.log('Global scope');
const perInstance = heavyComputation();
const functions = require('firebase-functions');

exports.function = functions.https.onRequest((req, res) => {
    console.log('Function invocation');
    const perFunction = lightweightComputation();

    res.send(`Per instance: ${perInstance}, per function: ${perFunction}`);
});

Особенно важно кэшировать сетевые соединения, ссылки на библиотеки и клиентские объекты API в глобальной области. См Оптимизация Networking примеры.

Ленивая инициализация глобальных переменных

Если вы инициализируете переменные в глобальной области видимости, код инициализации всегда будет выполняться через вызов холодного запуска, увеличивая задержку вашей функции. В некоторых случаях это приводит к прерывистым таймауты на услуги называют , если они не обрабатываются должным образом в try / catch блок. Если некоторые объекты используются не во всех путях кода, рассмотрите возможность их ленивой инициализации по запросу:

const functions = require('firebase-functions');
let myCostlyVariable;

exports.function = functions.https.onRequest((req, res) => {
    doUsualWork();
    if(unlikelyCondition()){
        myCostlyVariable = myCostlyVariable || buildCostlyVariable();
    }
    res.status(200).send('OK');
});

Это особенно важно, если вы определяете несколько функций в одном файле, а разные функции используют разные переменные. Если вы не используете ленивую инициализацию, вы можете тратить ресурсы на переменные, которые инициализируются, но никогда не используются.

Уменьшите количество холодных запусков, установив минимальное количество экземпляров

По умолчанию Cloud Functions масштабирует количество экземпляров в зависимости от количества входящих запросов. Вы можете изменить это поведение по умолчанию, установив минимальное количество экземпляров, которое облачные функции должны держать готовыми для обслуживания запросов. Установка минимального количества экземпляров сокращает холодный запуск вашего приложения. Мы рекомендуем установить минимальное количество экземпляров, если ваше приложение чувствительно к задержкам.

Дополнительные ресурсы

Узнайте больше об оптимизации производительности в «Google Cloud Performance Атлас» видео Облако функций холодной загрузки время .