Функция
Функция позволяет вам размещать код в Yandex Cloud, который можно запускать по запросу или триггеру.
Сразу после создания функция содержит только метаинформацию о себе: имя, описание, уникальный идентификатор и т. д. Для начала работы с функцией необходимо создать версию функции. Выполнить функцию можно с помощью HTTPS API или CLI.
Перед написанием функции, ознакомьтесь с моделью программирования.
Версия функции
Версия содержит код функции, параметры запуска и все необходимые зависимости. Вы можете работать с разными версиями одной функции на разных стадиях процесса разработки, например, версия в разработке, альфа-версия, бета-версия. При внесении каких-либо изменений всегда создается новая версия с тегом по умолчанию — $latest
, при этом не имеет значения, загрузили вы совершенно новый код или внесли только незначительные правки.
Формат загрузки кода
Для создания версии вы можете воспользоваться редактором кода или загрузить код и необходимые зависимости, используя один из форматов, описанных в таблице ниже. После создания функции объект с кодом больше не нужен. Его можно удалить из хранилища.
Формат | Консоль управления | CLI Yandex Cloud |
---|---|---|
ZIP-архив с вашего ПК | ||
ZIP-архив из S3 с указанием бакета и объекта | ||
Директория | ||
Файл |
Важно
Файл больше 3,5 МБ необходимо загружать через Object Storage. Подробнее об ограничениях читайте в разделе Квоты и лимиты в Cloud Functions.
Подробнее о том, как создать версию, читайте в разделе Создать версию функции.
Тег версии
Теги используются для вызова определенной версии функции. Каждый тег должен быть уникален в рамках функции. У одной версии может быть несколько тегов.
Примечание
При создании новой версии ей присваивается тег по умолчанию — $latest
.
Модель программирования
Cloud Functions поддерживает разные языки программирования. Вне зависимости от выбранного вами языка, при написании кода необходимо опираться на принятую в сервисе модель программирования. В ней есть как элементы, которые необходимо реализовать пользователю, так и механизмы, которые уже реализованы на стороне сервиса и могут быть использованы по необходимости.
Описание модели
Чтобы функция запустилась, опишите в ней обработчик. Он определяется при написании кода и обрабатывает поступающие данные, вызывая необходимые функции и методы в коде. Обработчик должен принимать данные, которые приходят с запросами функции, и контекст, который передает Cloud Functions. Для некоторых сред выполнения есть требования к абсолютному пути к файлу, в котором находится обработчик:
- Python, Go, Java — не должен содержать символ
.
в названии файла до расширения, например.handler.py
. - .NET Core — не должен содержать символ
.
в названии файла до расширения и начале названия директории, в которой находится файл с обработчиком, например.handler.cs
или.test/handler.cs
.
Контекст обеспечивает взаимодействие кода вашей функции с Cloud Functions. Например, с его помощью функция может узнать, сколько времени осталось до момента, когда Cloud Functions завершит ее выполнение.
Поступающие запросы обрабатываются функцией по одному. Чтобы функция обрабатывала несколько запросов сразу, используйте возможности асинхронного выполнения кода, которые предоставляет среда выполнения.
Чтобы сообщить сервису об ошибке при выполнении функции, обрабатывайте ошибки с помощью исключений.
Выполнение функции журналируется сервисом, но при необходимости вы можете реализовать в коде вашей функции дополнительное ведение журналов.
Масштабирование функции
Экземпляр функции обрабатывает один ее вызов в один момент времени. Если функция вызывается быстрее, чем экземпляр успевает обработать запрос, сервис масштабирует функцию — запускает ее дополнительные экземпляры. Таким образом обеспечивается параллельная обработка запросов. В Cloud Functions можно задать:
zone_instances_limit
— количество экземпляров функции в зоне доступности;zone_requests_limit
— количество одновременно выполняемых вызовов функции в зоне доступности;provisioned_instances_count
— количество подготовленных экземпляров;concurrency
— максимальное количество вызовов, одновременно обрабатываемых одним экземпляром функции. Доступно не для всех сред выполнения. Подробнее см. Одновременные вызовы экземпляра функции.
Примечание
Вызовы распределяются по зонам доступности случайным образом. Cloud Functions не гарантирует равномерное распределение вызовов по зонам. Например, все вызовы вне зависимости от их количества могут попасть в одну зону.
Настройки масштабирования применяются в течение 5 минут после их задания.
Одновременные вызовы экземпляра функции
Чтобы один экземпляр функции в один момент времени мог обрабатывать несколько ее вызовов, можно задать параметр concurrency
при создании версии функции. Идентификаторы таких вызовов (RequestID
) должны быть уникальными, иначе при попытке обработать вызов с повторяющимся идентификатором будет возвращаться ошибка.
Если хотя бы один вызов достигнет таймаута, он и все остальные вызовы, которые обрабатываются тем же экземпляром функции, завершатся. Подробнее о таймауте см. Лимиты.
Параметр concurrency
доступен для функций со следующими средами выполнения:
Лимиты
Когда количество экземпляров функции достигает значения zone_instances_limit
, Cloud Functions перестает ее масштабировать. Если вызовов функции больше, чем могут обработать экземпляры, вызов становится в очередь, но при этом считается выполняемым. Когда количество выполняемых вызовов достигает значения zone_requests_limit
, сервис перестает ставить вызовы в очередь и возвращает ошибку 429 TooManyRequests
.
Подготовленные экземпляры
Подготовленный экземпляр — это экземпляр функции, при запуске которого гарантированно нет холодного старта. В подготовленном экземпляре до вызова функции:
- запускается интерпретатор;
- инициализируются компоненты среды выполнения Cloud Functions;
- загружается и инициализируется пользовательский код.
Время простоя подготовленных экземпляров и выполнения в них функции тарифицируется отдельно.
Если количество вызовов функции превышает количество, которое могут обработать подготовленные экземпляры, Cloud Functions масштабирует функцию в пределах квот. Новые вызовы могут быть обработаны как подготовленным экземпляром, так и обычным — в зависимости от того, какой освободится или создастся раньше.
Подготовленные экземпляры расходуют следующие квоты, даже если не запущены:
- Количество экземпляров функций в каждой зоне доступности.
- Суммарный объем RAM для всех запущенных функций в каждой зоне доступности.
- Количество подготовленных экземпляров функций в одном облаке.