Как мы разгружаем разработчиков благодаря архитектуре Serverless

Серверную инфраструктуру, как и многие другие услуги, можно получить в облаке и передать все задачи по управлению, поддержке и масштабированию серверов провайдеру. Лев Немировский, руководитель направления по развитию инструментов внедрения ПСБ,  рассказал, как работает архитектура Serverless и почему стоит попробовать это решение.

eee1bbf9a3c6769b79a0fc29e3f4eb45.png

Serverless (от англ. «бессерверная») архитектура — это логическое продолжение эволюции облачных сервисов. Бессерверные технологии экономят время на управление серверами и серверными приложениями: все задачи, кроме CI/CD и написания кода, берет на себя провайдер.

В базовый Serverless пакет у большинства провайдеров входят облачные функции (в 2014 году эта технология начиналась с Lambda), контейнеры, object storage, базы данных, Message Queue и API Gateway.

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

02d3eedbacddab4f5cf4785e32ea3b7a.png

Все это довольно сильно меняет подход компаний к деплою и обслуживанию приложений. Serverless архитектура подходит не для всех задач. Но если использовать ее по назначению, она обеспечивает команду разработчиков дополнительными ресурсами:

Время

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

Деньги

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

Безопасность

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

Как понять, когда выгодно использовать Serverless, а когда нет? Главное: если у вас высокая, предсказуемая и постоянная нагрузка, то этот подход не для вас. Эта архитектура по-настоящему «взлетает» во всех случаях, когда нагрузка меняется: сезонные всплески, приток пользователей по вечерам, запуск рекламной кампании. В таких ситуациях выгоднее платить за те ресурсы, которые вам нужны, а не за оборудование, которое простаивает в ожидании притока пользователей.

22f1223163f74ae52bce18891802ef66.png

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

Разберем пример функции Handler для Telegram-бота. В силу низкой и непостоянной нагрузки, боты — одна из самых частых областей применения Serverless.

c2146ae965d2bcc03722c2a44aad734b.png

На вход принимаем запрос, обрабатываем его и отдаем HTTP ответ клиенту со статусом 200 (положительно). Выбираем язык и то, как мы загружаем (как правило, это встроенный редактор):

8723ad596a94cd2f2a63c98c70763b60.png

Далее указываем точку входа и таймаут:

ed1332b164daff467ed4af56ede4da05.png

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

Даже этот нехитрый процесс можно оптимизировать. Например, написать простой bash-скрипт при помощи API, предоставленного облачным провайдером. После этого мы вообще можем не выходить из IDE, код будет автоматически публиковаться.

e35e2d060157ce094cd718938bfa50f3.png

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

Возьмем для примера конвертацию файлов:

Дано:

Запросов: 5 в секунду
Потребляет: 1 CPU, 128 MB RAM
Исполнение: 0,5 с

На стандартном виртуальном сервере нам потребуется:

CPU: 5 RPS x 1 CPU = 5 CPU
RAM: 5 RPS x 128 MB = 640 MB = 0.61 GB

При этом брать, скорее всего, придется больше, так как далеко не все VPS провайдеры позволяют гибко настраивать, сколько ядер и ОЗУ требуется, есть предложения по тарифной сетке.

Допустим, мы взяли тариф на RAM: 12 Гб и CPU: 8. Получаем стоимость: 1 833 рублей в месяц.

В Serverless мы не думаем об инфраструктуре, поэтому параметры для расчета другие:

RAM: 128 MB
Количество вызовов: 12 960 000 в месяц
Исполнение: 0,5 c

Формула выглядит так:

5,47 × ((128 / 1024) × (500 / 3 600 000) × 12 960 000 — 10) + 16 × ((12 960 000 — 1 000 000) / 1 000 000)

Где:

5,47 — цена за 1 ГБ×час
128 / 1024 — перевод МБ в ГБ, так как время выполнения считается в ГБ×час
500 / 3 600 000 — перевод мс в часы, так как время выполнения считается в ГБ×час
10 000 000 — количество вызовов функции
10 — вычитаем, потому что первые 10 ГБ×час не тарифицируются
16 — цена за 1 миллион вызовов функции
12 960 000 — количество вызовов функции
1 000 000 — вычитаем, потому что первые миллион вызовов не тарифицируются
1 000 000 — делим, чтобы посчитать количество миллионов вызовов функции

Итого: 1 367,41 рублей в месяц

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

Например, у нас есть Telegram-бот, который обрабатывает один запрос в секунду. На пиковой нагрузке потребляет: 100 Мб, выполняется 200 мс. При аренде виртуального сервиса получится около 188 рублей в месяц (опять же, с учетом того, что взять ровно нужное количество мощностей скорее всего не получится).

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

ef1c322f2a2190330e3a518f7099a6f3.png

У функций в этой архитектуре есть и сложности:

Холодный старт

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

Время выполнения функции

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

Зависимость от провайдера

Вся серверная инфраструктура в этой архитектуре зависит от провайдера — у вас нет никаких настроек, все происходит автоматически. Это здорово и освобождает много времени, но создает свои риски.

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

1a52ad64afe0df4ff0fc9379a5ae950b.png

Разделение приложений на функции многим напомнит о микросервисной архитектуре, и Serverless действительно во многом похожа на нее. Еще точнее ее можно сравнить с Event-driven architecture (EDA) — при разработке под Serverless действуют те же подходы и ограничения. Однако гранулярность здесь гораздо сильнее — функции выполняют единственную задачу: например, в Serverless функции Create, Read будут отдельными микросервисами.

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

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

4497ad4a5730bf2ae8556e2eb26990e9.png

Еще один пример Serverless архитектуры для выполнения одной функции — обработка данных.

f1e18f995d9d1a9cc4ef0ba9db2620f0.png

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

02aa9d25d945e4f70ad74451766a659a.png

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

472ffb814ea6edff5b465f656a9c7dfc.pngf7bcaed58031b5e3d50954faf0a6a952.png

Итак, что мы поняли про Serverless:

1. Это альтернативный подход к обеспечению серверов: вы платите только за ресурсы, которые фактически используете, а поставщик автоматически предоставляет необходимое количество мощностей.

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

3. Serverless снимает с команды нагрузку, связанную с интеграцией, мониторингом, поддержкой серверов и отчетности по ним.

В силу особенностей архитектуры Serverless подойдет не для всех задач. Но там, где этот подход работает, попробовать его стоит каждой команде. Кроме прямого сокращения расходов он позволяет экономить самый ценный ресурс — время и труд разработчиков.

© Habrahabr.ru