Catch up on everything announced at Firebase Summit, and learn how Firebase can help you accelerate app development and run your app with confidence. Learn More

Управление функциями

Оптимизируйте свои подборки Сохраняйте и классифицируйте контент в соответствии со своими настройками.

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

Развернуть функции

Чтобы развернуть функции, запустите эту команду Firebase CLI:

$ firebase deploy --only functions

По умолчанию интерфейс командной строки Firebase развертывает все функции внутри index.js одновременно. Если ваш проект содержит более 5 функций, мы рекомендуем вам использовать флаг --only с конкретными именами функций, чтобы развернуть только те функции, которые вы отредактировали. Развертывание определенных функций таким образом ускоряет процесс развертывания и помогает избежать превышения квот на развертывание. Например:

$ firebase deploy --only functions:addMessage,functions:makeUppercase

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

Полный список доступных команд см. в справке Firebase CLI .

По умолчанию интерфейс командной строки Firebase ищет исходный код в папке functions/ . При желании вы можете организовать функции в кодовых базах или нескольких наборах файлов.

Удалить функции

Вы можете удалить ранее развернутые функции следующими способами:

  • явно в интерфейсе командной строки Firebase с functions:delete
  • явно используя контекстное меню в списке функций в консоли Firebase
  • неявно , удалив функцию из index.js перед развертыванием.

Все операции удаления требуют подтверждения перед удалением функции из производства.

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

# Delete all functions that match the specified name in all regions.
$ firebase functions:delete myfunction

# Delete a specified function running in a specific region.
$ firebase functions:delete myfunction --region us-east-1

# Delete more than one function
$ firebase functions:delete myfunction myotherfunction

# Delete a specified functions group.
$ firebase functions:delete groupA

# Bypass the confirmation prompt.
$ firebase functions:delete myfunction --force

При неявном удалении функций firebase firebase deploy анализирует index.js и удаляет из производства все функции, которые были удалены из файла.

Изменить имя, область или триггер функции

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

Переименовать функцию

Чтобы переименовать функцию, создайте новую переименованную версию функции в index.js а затем выполните две отдельные команды развертывания. Первая команда развертывает функцию с новым именем, а вторая команда удаляет развернутую ранее версию. Например, если у вас есть функция с именем webhook , которую вы хотите изменить на webhookNew , измените код следующим образом:

// before
const {onRequest} = require('firebase-functions/v2/https');

exports.webhook = onRequest((req, res) => {
    res.send("Hello");
});

// after
const {onRequest} = require('firebase-functions/v2/https');

exports.webhooknew = onRequest((req, res) => {
    res.send("Hello");
});

Затем выполните следующие команды, чтобы развернуть новую функцию:

# Deploy new function called webhookNew
$ firebase deploy --only functions:webhooknew

# Wait until deployment is done; now both webhooknew and webhook are running

# Delete webhook
$ firebase functions:delete webhook

Изменение региона или регионов функции

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

  1. Переименуйте функцию и измените ее регион или регионы по желанию.
  2. Разверните переименованную функцию, что приведет к временному запуску одного и того же кода в обоих наборах регионов.
  3. Удалить предыдущую функцию.

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

// before
const {onRequest} = require('firebase-functions/v2/https');

exports.webhook = onRequest((req, res) => {
    res.send("Hello");
});

// after
const {onRequest} = require('firebase-functions/v2/https');

exports.webhookasia = onRequest({
        region: 'asia-northeast1'
    }, (req, res) => {
    res.send("Hello");
});

Затем разверните, запустив:

$ firebase deploy --only functions:webhookAsia

Сейчас запущены две одинаковые функции: webhook работает в us-central1 , а webhookasia — в asia-northeast1 .

Затем удалите webhook :

$ firebase functions:delete webhook

Сейчас есть только одна функция — webhookasia , которая работает в asia-northeast1 .

Изменить тип триггера функции

По мере разработки облачных функций для развертывания Firebase вам может потребоваться изменить тип триггера функции по разным причинам. Например, вы можете захотеть перейти с одного типа события Firebase Realtime Database или Cloud Firestore на другой, например, с общего события onWrite на детализированное событие onCreate .

Невозможно изменить тип события функции, просто изменив исходный код и запустив firebase deploy . Чтобы избежать ошибок, измените тип триггера функции с помощью этой процедуры:

  1. Измените исходный код, чтобы включить новую функцию с желаемым типом триггера.
  2. Разверните функцию, что приведет к временному запуску как старой, так и новой функций.
  3. Явным образом удалите старую функцию из рабочей среды с помощью интерфейса командной строки Firebase.

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

// before
const {onMetadataUpdated} = require('firebase-functions/v2/storage');

exports.objectchanged = onMetadataUpdated((event) => {
    return console.log('File name is: ', event.data.name);
});

// after
const {onObjectFinalized} = require('firebase-functions/v2/storage');

exports.objectchanged = onObjectFinalized((event) => {
    return console.log('File name is: ', event.data.name);
});

Затем выполните следующие команды, чтобы сначала создать новую функцию, прежде чем удалять старую:

# Create new function objectFinalized
$ firebase deploy --only functions:objectFinalized

# Wait until deployment is done; now both objectChanged and objectFinalized are running

# Delete objectChanged
$ firebase functions:delete objectChanged

Установить параметры времени выполнения

Облачные функции для Firebase позволяют выбирать параметры среды выполнения, такие как версия среды выполнения Node.js и тайм-аут для каждой функции, выделение памяти и минимальное/максимальное количество экземпляров функции.

Рекомендуется устанавливать эти параметры (кроме версии Node.js) в объекте конфигурации внутри кода функции. Этот объект RuntimeOptions является источником достоверных параметров времени выполнения вашей функции и переопределяет параметры, установленные любым другим способом (например, через консоль Google Cloud или интерфейс командной строки gcloud).

Если ваш рабочий процесс разработки включает ручную настройку параметров среды выполнения через консоль Google Cloud или интерфейс командной строки gcloud, и вы не хотите, чтобы эти значения переопределялись при каждом развертывании, установите для параметра preserveExternalChanges значение true . Если для этого параметра установлено значение true , Firebase объединяет параметры времени выполнения, установленные в вашем коде, с настройками развернутой в данный момент версии вашей функции со следующим приоритетом:

  1. В коде функций установлена ​​опция: переопределять внешние изменения.
  2. В коде функций для параметра установлено значение RESET_VALUE : переопределить внешние изменения значением по умолчанию.
  3. Параметр не установлен в коде функций, но установлен в текущей развернутой функции: используйте параметр, указанный в развернутой функции.

Использование параметра preserveExternalChanges: true не рекомендуется для большинства сценариев, потому что ваш код больше не будет полным источником правды для параметров времени выполнения для ваших функций. Если вы используете его, проверьте консоль Google Cloud или используйте интерфейс командной строки gcloud, чтобы просмотреть полную конфигурацию функции.

Установить версию Node.js

Firebase SDK для облачных функций (2-го поколения) позволяет выбирать среду выполнения Node.js. Вы можете запустить все функции в проекте исключительно в среде выполнения, соответствующей одной из следующих поддерживаемых версий Node.js:

  • Node.js 16
  • Node.js 14

Чтобы установить версию Node.js:

Установите версию в поле engines в файле package.json , который был создан в вашем каталоге functions/ во время инициализации. Например, чтобы использовать только версию 16, отредактируйте эту строку в package.json :

  "engines": {"node": "16"}

Поле engines обязательно; в нем должна быть указана одна из поддерживаемых версий Node.js, чтобы вы могли развертывать и запускать функции. В настоящее время firebase init functions устанавливают для этого поля значение 16 .

Обновите среду выполнения Node.js

Чтобы обновить среду выполнения Node.js:

  1. Убедитесь, что ваш проект включен в тарифный план Blaze .
  2. Убедитесь, что вы используете Firebase CLI v9.17.0 или более позднюю версию.
  3. Измените значение engines в файле package.json , который был создан в вашем каталоге functions/ во время инициализации. Например, если вы обновляете версию 10 до версии 16, запись должна выглядеть так: "engines": {"node": "16"}
  4. Повторное развертывание функций с помощью интерфейса командной строки Firebase версии 9.17.0 или более поздней версии.

Управление масштабированием

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

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

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

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

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

Разрешить одновременные запросы

В Cloud Functions для Firebase (1-го поколения) каждый экземпляр мог обрабатывать один запрос за раз, поэтому поведение масштабирования устанавливалось только с minInstances и maxInstances . Помимо управления количеством экземпляров, в Cloud Functions для Firebase (2-го поколения) вы можете контролировать количество запросов, которые каждый экземпляр может обслуживать одновременно, с помощью параметра concurrency . Значение по умолчанию для параллелизма — 80, но вы можете установить любое целое число от 1 до 1000.

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

Экспериментируя с более высокими настройками параллелизма в Cloud Functions для Firebase (2-го поколения), помните следующее:

  • Более высокие параметры параллелизма могут потребовать более высокой производительности ЦП и ОЗУ для оптимальной производительности, пока не будет достигнут практический предел. Например, функции, которая выполняет интенсивную обработку изображений или видео, может не хватать ресурсов для обработки 1000 одновременных запросов, даже если ее настройки ЦП и ОЗУ максимальны.
  • Поскольку облачные функции для Firebase (2-го поколения) поддерживаются Cloud Run, вы также можете обратиться к руководству Google Cloud по оптимизации параллелизма .
  • Обязательно тщательно протестируйте многопоточность в тестовой среде, прежде чем переключаться на многопоточность в рабочей среде.

Уменьшить количество холодных пусков

Чтобы установить минимальное количество экземпляров для функции в исходном коде, используйте параметр minInstances . Например, эта функция устанавливает минимум 5 экземпляров для сохранения тепла:

  const { onCall } = require("firebase-functions/v2/https");

  exports.getAutocompleteResponse = onCall(
    {
      // Keep 5 instances warm for this latency-critical function
      minInstances: 5,
    },
    (event) => {
      // Autocomplete user’s search term
    }
  );

Вот некоторые вещи, которые следует учитывать при установке значения для minInstances :

  • Если облачные функции для Firebase масштабируют ваше приложение выше параметра minInstances , вы будете испытывать холодный запуск для каждого экземпляра выше этого порога.
  • Холодный запуск сильнее всего влияет на приложения с резким трафиком. Если ваше приложение имеет пиковый трафик и вы установили значение minInstances достаточно высоким, чтобы холодные запуски уменьшались при каждом увеличении трафика, вы увидите значительное снижение задержки. Для приложений с постоянным трафиком холодный запуск вряд ли сильно повлияет на производительность.
  • Установка минимального количества экземпляров может иметь смысл для производственных сред, но обычно ее следует избегать в тестовых средах. Чтобы масштабировать до нуля в вашем тестовом проекте, но при этом сократить количество холодных запусков в рабочем проекте, вы можете установить minInstances на основе переменной среды FIREBASE_CONFIG :

    // Get Firebase project ID from `FIREBASE_CONFIG` environment variable
    const envProjectId = JSON.parse(process.env.FIREBASE_CONFIG).projectId;
    
    exports.renderProfilePage = onRequest(
      {
        // Keep 5 instances warm for this latency-critical function
        // in production only. Default to 0 for test projects.
        minInstances: envProjectId === "my-production-project" ? 5 : 0,
      },
      (req, res) => {
        // render some html
      }
    );
    

Ограничить максимальное количество экземпляров функции

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

  const { onMessagePublished } = require("firebase-functions/v2/pubsub");

  exports.mirrorevents = onMessagePublished(
    { topic: "topic-name", maxInstances: 100 },
    (event) => {
      // Connect to legacy database
    }
  );

Если функция HTTP масштабируется до предела maxInstances , новые запросы помещаются в очередь на 30 секунд, а затем отклоняются с кодом ответа 429 Too Many Requests , если к тому времени ни один экземпляр не будет доступен.

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

Установите время ожидания и выделение памяти

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

Чтобы задать выделение памяти и время ожидания в исходном коде функций, используйте GlobalOptions.memory и GlobalOptions.timeoutSeconds , чтобы настроить виртуальную машину, на которой выполняются ваши функции. Например, эта функция облачного хранилища использует 1 ГБ памяти и время ожидания истекает через 300 секунд:

  exports.convertLargeFile = onObjectFinalized({
    timeoutSeconds: 300,
    memory: "1GiB",
  }, (event) => {
    // Do some complicated things that take a lot of memory and time
  });

Максимальное значение timeoutSeconds540 или 9 минут.

Чтобы установить выделение памяти и время ожидания в Google Cloud Console:

  1. В Google Cloud Console выберите « Облачные функции для Firebase» в меню слева.
  2. Выберите функцию, щелкнув ее имя в списке функций.
  3. Щелкните значок « Изменить » в верхнем меню.
  4. Выберите выделение памяти в раскрывающемся меню с надписью Выделенная память .
  5. Нажмите « Дополнительно », чтобы отобразить дополнительные параметры, и введите количество секунд в текстовом поле « Время ожидания ».
  6. Щелкните Сохранить , чтобы обновить функцию.

Переопределить значения ЦП по умолчанию

Выделено до 2 ГБ памяти, каждая функция в Cloud Functions для Firebase (2-го поколения) по умолчанию использует один ЦП, а затем увеличивается до 2 ЦП для 4 и 8 ГБ. Обратите внимание, что это значительно отличается от поведения по умолчанию 1-го поколения способами, которые могут привести к несколько более высоким затратам на функции с малым объемом памяти, как показано в следующей таблице:

Выделено оперативной памяти ЦП версии 1 по умолчанию (дробный) ЦП версии 2 по умолчанию Повышение цены за мс
128 МБ 1/12 1 10,5x
256 МБ 1/6 1 5,3x
512 МБ 1/3 1 2,7x
1 ГБ 7/12 1 1,6x
2 ГБ 1 1 1x
4ГБ 2 2 1x
8 ГБ 2 2 1x
16 Гб н/д 4 н/д

Если вы предпочитаете сохранить поведение 1-го поколения для функций 2-го поколения, установите значения по умолчанию 1-го поколения в качестве глобальной опции:

// Turn off Firebase defaults
setGlobalOptions({ cpu: 'gcfv1' });

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

// Boost CPU in a function:
export const analyzeImage = onObjectFinalized({ cpu: 2 }, (event) => {
  // computer vision goes here
});