Что такое функции?
Кратко:
- Serverless-функции - это программы, которые выполняются на вычислительных ресурсах облачной платформы.
- Платить вы будете только за выполнение функции и обращение к базе данных.
- В Yandex Cloud сервис Cloud Functions использует специально созданные виртуальные машины с установленными рантаймами.
- Сервис ведет журнал выполнения функций, интегрируется с другими сервисами Yandex Cloud и предоставляет SDK для разработчиков.
- Функции должны быть конечными и не могут хранить состояния.
- При использовании сервиса вы будете платить за количество вызовов функции, вычислительные ресурсы и исходящий трафик.
- В следующем уроке вы узнаете, как добавлять функцию в Cloud Functions и приводить её код к модели программирования.
Что такое функции?
Давайте рассмотрим гипотетический пример. У вас есть рассылка для клиентов, и в каждом письме содержится ссылка для желающих отписаться. Пользователь, который больше не хочет читать вашу рассылку, переходит по этой ссылке, и его адрес убирают из списка получателей.
При классическом подходе к решению этой задачи вам нужно поднять ВМ, настроить на ней сервер, принимающий запросы, а также развернуть и настроить весь стек, на котором работает приложение, обрабатывающее запросы на отписку. Помимо этого, нужно обеспечить отказоустойчивость: добавить реплики, развернуть балансировщик нагрузки, настроить сбор метрик и логов, а также уведомления в случае нештатных ситуаций. При этом вы будете платить провайдеру за постоянно работающие ВМ, а также системному администратору за обслуживание всей этой инфраструктуры.
Вместо этого вы можете создать так называемую serverless-функцию. Это программа, которая предназначена для решения какой-то одной простой задачи. Код этой программы упаковывается в изолированный контейнер и выполняется на вычислительных ресурсах дата-центра облачной платформы.
В вашем случае этот код будет обрабатывать HTTP-запрос, делать обращение к базе данных и удалять адрес пользователя из получателей рассылки. Платить вы будете только за выполнение функции и обращение к базе данных.
Решения класса FaaS (Function-as-a-Service) есть у разных поставщиков облачных технологий, например Cloud Functions в Google Cloud Platform, Azure Functions у Microsoft, AWS Lambda у Amazon. В Yandex Cloud этот сервис называется Cloud Functions. Давайте сначала разберёмся с возможностями и особенностями его реализации в Yandex Cloud.
Особенности реализации serverless functions в Yandex Cloud
Yandex Cloud Functions в целом следует общей концепции serverless functions. Для запуска кода облачных (бессерверных) функций используются специально созданные виртуальные машины, на которых установлены рантаймы, то есть среды выполнения кода на том или ином языке программирования, например Python версии 3.9. При этом для удобства пользователя работа с ними скрыта за абстракцией, позволяющей сосредоточиться на решаемой задаче.
Однако сервис Cloud Functions умеет не только это. Он также:
- Ведёт журнал выполнения функций. Сюда выводятся параметры и время запуска функции, а также время и результат её выполнения. У пользователя есть возможность выводить в журнал и собственную информацию. Это удобно как при создании и отладке функций, так и при разборе нештатных ситуаций. Например, данные, которые вам нужно было записать в базу данных, в итоге туда не попали. Почему? Не вызвалась функция или была недоступна база данных? В коде функции была ошибка? Журнал поможет найти ответы на эти вопросы.
- Интегрируется с другими сервисами Yandex Cloud. Для этого он использует триггер — механизм, который позволяет запускать функцию по событиям в других сервисах. Например, вы можете вызывать функцию при получении пакета данных от ваших IoT-устройств для его обработки.
- Предоставляет SDK для разработчиков. Это программные модули, которые можно подключить и вызвать из пользовательских функций. Они упрощают взаимодействие с другими сервисами Yandex Cloud из кода программы. Например, вы можете использовать SDK для сохранения данных в Yandex Object Storage.
Ограничения
При этом у сервиса есть два концептуальных ограничения:
- Функции должны быть конечными. Они не могут бесконечно выполнять какую-то задачу. Это ограничение заложено в суть самого сервиса, есть даже специальный таймер, по истечении которого функция будет автоматически завершена.
- Функции не могут сами по себе хранить состояния. Cloud Functions — среда выполнения, в которой не сохраняется состояние. Каждая запущенная копия (instance) функции отвечает только за один запрос одновременно (в случае большого количества запросов эта копия может последовательно их обработать). Конкурирующие запросы обрабатываются разными копиями функции, эти копии не могут обмениваться переменными или локальной памятью. Если вам нужно, чтобы функция сохраняла состояние, данные нужно записать в файл в объектном хранилище или в базу данных, например YDB.
Тарификация
При использовании этого сервиса вы будете платить за количество вызовов функции, за используемые для вызова выделенные вычислительные ресурсы, а также за исходящий трафик. Под вычислительными ресурсами подразумевается объём памяти, указанный при создании версии функции, а также время выполнения для каждого вызова функции.
Давайте рассмотрим следующий пример. Предположим, ваше приложение получает ровно один запрос в секунду с равномерной частотой в течение дня, что составит 2 678 400 за месяц в 31 день. Какова будет ежемесячная стоимость обработки этих запросов?
Предположим, обработка запроса занимает 200 мс, на её выполнение требуется 256 МБ памяти. Исходящего трафика нет. Стоимость вычислительных ресурсов для функции (ГБ×час) составляет 3,42 рубля*. Это означает, что все единицы измерения нужно привести к гигабайтам и часам. Стоимость вызовов функции составляет 10 рублей за 1 000 000 вызовов. Получаем следующую формулу:
3,42×(256/1024)×(200/1000/3600)×2678400+10×(2678400/1000000)= 154 ₽ в месяц
* Тарифы, использованные в этом и следующих примерах расчёта стоимости, могут отличаться от актуальных
Однако первый миллион вызовов функции в месяц не тарифицируется, равно как и первые 10 ГБ×час в месяц, израсходованные на выполнение функций. Скорректируем вычисления:
3,42×(((256/1024)×(200/1000/3600)×2678400)−10)+10×((2678400–1000000)/1000000)= 109,80 ₽ в месяц
Теперь давайте рассчитаем стоимость аренды виртуальной машины. Для запуска приложения нам подойдет ВМ на базе любого дистрибутива Linux с дополнительно установленным рантаймом. Эта ВМ должна быть постоянно доступна, а значит, не может быть прерываемой. Кроме того, она должна работать на 100% vCPU. Минимальная стоимость такой машины составит 1 360,83 ₽ в месяц.
Обратите внимание: эти расходы придётся увеличить, поскольку вам также нужны сетевой балансировщик (его использование тарифицируется) и ещё одна ВМ для перехвата трафика.
Более подробную информацию о тарификации Cloud Functions вы найдёте в документации.
В следующем уроке поговорим о том, как добавлять функцию в Cloud Functions и приводить её код к модели программирования.