Бессерверные вычисления: почему некоторые разработчики упускают главное?

На эту тему перевели для вас интересные и достаточному простые мысли дата-инженера Анны Аннисени.

Бессерверные вычисления: почему некоторые разработчики упускают главное?

Чем опасен однобокий взгляд на ИТ-архитектуру?

Недавно я посмотрела видеоролик замечательного разработчика и ютубера Бена Авада (Ben Awad), в котором он высказал мнение, что бессерверные технологии лишены смысла. Ролик мне смотреть было интересно – но я не могу сказать, что полностью разделяю отношение автора к бессерверным технологиям. Своим мнением я хотела бы поделиться в этой статье.

В начале ролика автор шутит:

В этом мире есть две вещи, которых я не понимаю, — девушки и бессерверные вычисления.

Ничего не могу сказать об отношениях Бена с девушками, – но прав ли он, когда речь заходит о бессерверных вычислениях? Давайте рассмотрим приведенные им критические доводы и обсудим возможные контраргументы. Спойлер: Я считаю, что в бессерверных технологиях ЕСТЬ смысл, – если знать, КОГДА и КАК их использовать.

Критика бессерверных технологий

Основной аргумент, упомянутый в этом несколько спорном YouTube-ролике – это недостаточно высокая скорость выполнения кода. Если говорить конкретнее, основной недостаток бессерверных приложений с позиций автора – это (общеизвестная) проблема «холодного запуска» . Она связана с появлением дополнительной задержки, при которой код может не начать выполняться до тех пор, пока облачная инфраструктура не выделит необходимые вычислительные ресурсы, не подтянет программный код или образ контейнера, не установит дополнительные пакеты и не настроит среду выполнения.

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

Почему некоторые инженеры не видят истинных преимуществ бессерверных технологий?

Если скорость выполнения кода настолько важна для вас, что лишние 200 мс задержки (по оценкам AWS задержка может достигать 1 сек) не приемлемы для ваших рабочих нагрузок, в таком случае бессерверные технологии и в самом деле не вариант, и это абсолютно нормальная ситуация. Однако не стоит заходить слишком далеко и утверждать, что такая задержка сводит на нет всю пользу бессерверных технологий. Каждый должен сам для себя решить, какая задержка приемлема в конкретном сценарии.

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

Низкие затраты на бессерверную инфраструктуру могут существенно перевесить любые недостатки

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

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

Проблема холодного запуска – это вопрос правильной настройки и бюджетирования

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

Если вы готовы заплатить чуть больше, есть много способов смягчить проблему холодных запусков, например, при помощи предварительно прогретых виртуальных машин (механизм Provisioned Concurrency). Еще можно намеренно генерировать больше запросов (так называемые фейковые запросы), чтобы ваша операционная среда не успевала остыть. Используя платформу мониторинга, например, Dashbird, очень легко настроить уведомления о любом холодном запуске и оптимизировать нагрузку на бессерверные ресурсы. На картинке ниже видно, что на 29 выполненных вызовов пришелся всего один холодный запуск, что добавило примерно 180 миллисекунд задержки к общему времени выполнения.

<span><span><span><i>Функционал наблюдаемости в Dashbird помогает выявить и предотвратить холодные запуски </i></span></span></span>
Функционал наблюдаемости в Dashbird помогает выявить и предотвратить холодные запуски 

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

<i>Настройка оповещения о холодных запусках в Dashbird</i>
Настройка оповещения о холодных запусках в Dashbird

Методы сокращения задержек при выполнении функций AWS Lambda

Вы можете уменьшить задержку выполнения функций при бессерверных вычислениях, если правильно настроите повторное использование контекста. AWS замораживает и сохраняет контекст выполнения функции AWS Lambda – то есть все, что происходит за пределами функции-обработчика. Если в течение последующих 15 минут такая же функция будет запущена еще раз, «замороженная» среда выполнения будет использована повторно. Это означает, что производительность будет существенно выше, если вынести затратные по времени операции, например, подключение к реляционной базе данных, за пределы обработчика в функции AWS Lambda. В данной статье эта тема разъяснена очень подробно.

Существует масса прекрасных статей, в которых рассказывается, как уменьшить или даже полностью устранить проблемы, связанные с холодным запуском: например, эта и эта. Более того, в Dashbird есть открытая библиотека Python под названием xlambda, которая не даст остыть функциям AWS Lambda, написанным на языке Python.

Какая задержка приемлема для ваших рабочих нагрузок?

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

Наконец, такие платформы, как бессерверный сервис Kubernetes от AWS (также известный под названием "EKS на Fargate") позволяет объединить бессерверный и серверный уровни данных на одном кластере Kubernetes. Такое сочетание позволяет запускать критически важные рабочие нагрузки, требующие низкой задержки, на серверном уровне данных на базе Amazon EC2, а другие виды рабочей нагрузки (например, пакетную обработку данных) – на бессерверном уровне данных, – и получить лучшее из двух подходов. Подробнее об этом можно узнать в этой статье.

Бессерверные вычисления – это про “NoOps” и масштабируемость

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

Автоматизированные средства обеспечения бессерверной инфраструктуры высвобождают ценные временные ресурсы высококвалифицированных инженеров и дают им возможность сосредоточиться на решении бизнес-задач, а не на управлении кластерами. Это позволяет делегировать операционное обеспечение ИТ-процессов экспертам DevOps из AWS. У них, пожалуй, столько наработок в области управления вычислительными ресурсами, сколько не снилось ни одной другой компании.

Сценарии использования, которые сильно выигрывают от бессерверных вычислений

Представьте себе, что вы только что основали стартап. В начале вам может и не понадобиться большой кластер ресурсов, да и разработчик, вероятно, всего один. Концепция бессерверных вычислений позволяет вам начать с малого и автоматически масштабировать свои ресурсы по мере роста стартапа, используя принцип оплаты по мере использования («pay-as-you-go»).

Еще одна группа, которой очень выгодны бессерверные вычисления – это малый бизнес с небольшим ИТ-отделом. Возможность управлять всем жизненным циклом приложения, имея в распоряжении ресурс единственного профильного DevOps-инженера (а не целой команды) – неоспоримое преимущество бессерверной модели.

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

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

Скорость выполнения кода и скорость циклов разработки

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

Если бессерверная технология оперативно предоставляет доступ к самым первым версиям вашего приложения всем заинтересованным лицам и ускоряет итерации в цикле разработки (одновременно снижая затраты), – может быть, иногда можно пережить задержку в несколько миллисекунд при эпизодических холодных запусках?

Бесшовная интеграция с другими облачными сервисами

По примеру AWS все бессерверные сервисы интегрировались с CloudWatch – для поддержки логирования, с IAM – для управления правами доступа, с CloudTrail – для сбора метрик и трассировки, а также со многими другими системами. Помимо этого, бессерверные платформы обычно предоставляют базовые конструктивные блоки для создания более крупных слабо связанных микросервисных архитектур, включая интеграцию с бессерверной очередью сообщений (SQS), бессерверной шиной сообщений «publish-subscribe» (SNS), бессерверным хранилищем данных NoSQL (DynamoDB), а также объектным хранилищем данных (S3).

Недостатки бессерверных технологий, не рассмотренные в видеоролике

Обсудив все преимущества бессерверных вычислений, мы не должны упускать из вида и ряд недостатков, не упомянутых в ролике. Я хотела бы их здесь перечислить, чтобы у вас была полная картина без прикрас.

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

  • Вы рискуете попасть в зависимость от поставщика: облачные провайдеры стараются сделать свои услуги настолько удобными и экономически эффективными, что риск остаться на конкретной платформе присутствует с самого начала.
  • По сравнению с размещением ресурсов на собственном хостинге, использование бессерверной инфраструктуры дает вам несколько меньший контроль над вычислительными ресурсами. Например, вы не можете подключиться по SSH к вычислительным инстансам и выполнить настройки вручную. Также у вас меньше свободы и в выборе типа инстанса. Например, вы не можете запускать свои бессерверные функции или контейнеры на вычислительных инстансах с GPU (по крайней мере, на текущий момент).
  • Если у вас есть регламентные требования, не позволяющие обрабатывать данные на общем клиенте в облаке, то бессерверное решение может вам не подойти.
  • Несмотря на то, что разделение ИТ-инфраструктуры на автономные микросервисы помогает управлять зависимостями и ускорить релизный цикл приложения, при этом создается проблема, связанная с управлением большим количеством «подвижных деталей». Притом что многие системы мониторинга, например, Dashbird, позволяют в значительной степени решить эту конкретную задачу, необходимо осознавать компромиссы, на которые вы идете.

Выводы по критике бессерверных технологий

В целом не вполне правильно применять к новым парадигмам, таким как «бессерверные вычисления» или «облачные сервисы», тот же подход, что и к традиционным локальным инфраструктурам на собственном хостинге . Такой подход в данном случае не особенно полезен. Слепо копируя существующие рабочие процессы при переносе в облако, вы теряете множество преимуществ облачных сервисов, либо используете их не по назначению. Не существует какого-то универсального решения. Не стоит ожидать, что какая-то технология будет одновременно пригодна для всех возможных сценариев, окажется самой быстрой в мире и практически ничего не будет стоить, – да еще и недостатков у нее не будет (например, эпизодических холодных запусков).

Я считаю, что мы не должны говорить о бессерверных вычислениях (впрочем, как и о каких-либо других информационных технологиях) в контексте какого-то одного аспекта, игнорируя другие, не менее важные, – особенно те, для которых эта технология исходно разрабатывалась. В этом ключе в бессерверных технологиях ЕСТЬ смысл, если знать, КОГДА и КАК их использовать.

Подписывайтесь на блог Yandex.Cloud, чтобы узнавать еще больше новостей и историй об IT и бизнесе.

Другие истории, которые активно читают наши подписчики:

77
43 комментария

Почему-то говоря о серверлесс, часто забывают или лишь вскользь упоминают про "ноготок увяз - всей птички пропасть". Что серверлесс это не просто вынести одну функцию в облако, это сразу предполагает кучу дополнительных сервисов приобретать у облака и как-то интегрировать с существующими. Задаёшь вопросы типа а как логи будут попадать в наш эластик, метрики в наш прометей, а в ответ купите то, купите это, переведите своё легаси на EC2, постгресс на managed наш и выкиньте свои эластики и прометеи - тогда сможете экономить на воркере переведя его на лямбду , но при этом в три раза больше платить будете за всё остальное и в штат ещё девопса нужно брать, который будет поддерживать облако, в дополнении к имеющемуся админу, который будет поддерживать так называемое легаси в EC2. И легко затраты на порядок могут вырасти только за счёт зарплаты этого девопса

11

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

2

Как активный пользователь Y.functions могу сказать следующее - напрямую их использовать немного страшно, так как флудер легко может покушать ваши деньги. Поэтому оборачиваю в cloudflare.workers, тогда можно придумать и простейший csrf, и вписаться в бесплатный лимит, и сделать базовые методы защиты в духе csrf. Лично мне не хватает дешевого serverless KV-хранилища(такое есть у cf от 5$ в месяц вместе с прочими плюшками) для простейшей логики, платить за Redis дороговато для простого интернет-магазина(про RDBMS речи нет вообще, serverless тоже не хватает, но хотя бы KV). В итоге приходится делать следующую связку:
- cf as nginx
- cf as proxy for Y.functions
- persistance storage at S3/B2/YOS, cache on cf
получается дешево и приятно. Но пока нет под это хорошего фреймворка приходится писать кучу легаси-кода и интегрировать несколько систем.
Serverless прекрасен и его уже можно использовать как PoC или mvp для несложных сайтов/ИМ, но это легаси-легаси.

Я понимаю, что развернуть CMS на serverless легко и если у вас фронт отдельно(грузим в s3/b2/yos), бек отдельно(api на serverless или кеш в s3/b2/yos), то получается всё красиво, но если у вас CMS(для примера django framework с внутренним jinja шаблонизатором), то serverless для средненагруженного сайта без защит может скушать как простая vds(а учитывая, что базово для CMS нужен RDBMS/Redis/memcached, то влетает в копеечку). В итоге приходится рисовать костыли в виде легаси или юзать это для решения каких-то частичных задач. В общем, коробки не хватает под это и кучки сервисов рядом(serverless KV, serverless RDBMS, balancer/router/antiddos). Уже сейчас мы имеем интернет-магазины со не очень большой посещаемостью за копейки в месяц, но это легаси и не каждый масс-маркет разработчик это поймет и сможет связать. Им проще взять хост за 100 руб в месяц и установить, условно, wordpress - поэтому они еще не юзают Y.functions. А если к вам заказчик приходит с запросом какой-нибудь Magento/Bitrix, то тут уже никаким serverless as main не пахнет, только под микросервисы. Такие проблемы.

2

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

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

3

приходится писать кучу кода ради экономии на vps, чтобы поставить redis? великолепная математика

интересно либо сколько у тебя стоит написать кучу кода (300рублей чтоли?) или сколько тебе заплатили яндекс.клоуд, чтобы ты заманивал в эти сети

по итогу я видел как такие заманившиеся за обычные пару сервисов, где хватил бы vps за 20 евро, платят по 800-1200 евро в месяц за «умные» слова

разводка на уровне наперсточника на базаре

1

Уточните пожалуйста насчет
- cf as nginx
- cf as proxy for Y.functions
1) cf - в данном случае это Cloudflare Workers?
2) Если ответ на вопрос 1 да, то как маршрутизируете в воркерах и как отсекаете флудеров чтобы они не долбились в Y.functions?

Скажите а почему не хотите в качестве serverless KV-хранилища попробовать использовать Yandex Database в режиме serverless?