Cloud и инфраструктура

Обновлено 5 мин чтения

Serverless: когда выгоднее платить за работу системы, а не за постоянно включённые серверы

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

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

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

Что покупаем вместо собственного сервера

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

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

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

Повторный запуск — часть нормальной работы

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

Временные файлы и память среды нельзя считать единственным журналом завершённой работы. Среда может быть заменена; даже её повторное использование не является обещанием сохранности бизнес-состояния. Отметки о выполнении и ссылки на результаты сохраняют в подходящем долговечном хранилище.

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

Платформа масштабируется быстрее соседей

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

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

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

Время запуска и время работы — разные расходы

Новую среду нужно подготовить: загрузить код, запустить среду исполнения, выполнить инициализацию. Это может добавлять задержку. Холодный запуск возможен не только после ночного простоя, но и при расширении обработки. Измерять стоит сценарий целиком, а не только быстрый вызов уже готового обработчика.

Для фонового сертификата небольшая задержка иногда допустима. Для ответа на действие человека требования будут другими. Некоторые услуги позволяют заранее держать готовую мощность; это меняет экономику исходного обещания «платим только за работу». Конкретный жизненный цикл показан в документации Lambda.

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

Считать стоимость готового результата

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

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

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

Что оставить простым

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

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