Переход на Serverless: как выстроить архитектуру своего приложения

Привет, Хабр! Как менеджер продукта и один из амбассадоров serverless я регулярно рассказываю о преимуществах этого подхода и показываю, как с помощью бессерверных вычислений повысить эффективность затрат на инфраструктуру. Но как и у любого подхода, у serverless есть свои ограничения, которые важно учесть в своей IT‑стратегии.

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

Что говорят айтишники: state of serverless 2023

Осенью совместно с аналитической компанией Ipsos мы провели исследование рынка бессерверных вычислений и спросили разработчиков, архитекторов и IT‑руководителей об их опыте использования serverless. Всего в опросах и интервью поучаствовало более 400 IT‑специалистов, уже знакомых с подходом.

Сценарии и задачи. В 2023 году чаще всего бессерверные решения используют для:

  • загрузки и хранения данных (41%),

  • оптимизации работы поиска в приложениях, а также обработки файлов с использованием контейнеров (по 24%),

  • для проведения вычислений, создания и хранения API сервисов, хранения и управления ключами, доступами и секретами (по 23%).

Если рассматривать укрупнённо, то наиболее популярными сценариями в этом году стали:

  • аналитика данных (48%),

  • сбор и поставка данных в системы хранения (44%),

  • управление облачной инфраструктурой (34%).

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

  • нарушения взаимосвязей и основ интеграции между разными сервисами,

  • возникновение ошибок в коде,

  • сбои в конфигурациях разных сервисов.

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

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

Техническая изнанка проблем

При создании бессерверных приложений важна событийно ориентированная архитектура (event-driven architecture, EDA). Напомню, что это архитектурный паттерн, построенный из децентрализованных сервисов, которые публикуют, обрабатывают или маршрутизируют события — сообщения, отправляемые между сервисами. Такой подход облегчает масштабирование, обновление и независимый деплой различных компонентов системы. 

Приложения, построенные на базе происходящих в системе событий, можно встретить не только в serverless-мире. Но при бессерверном подходе это довольно принципиальный момент.

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

В частности, код, запущенный в бессерверном режиме, может быть исполнен, только если вызван через HTTP/HTTPS: напрямую, через триггер или через сервис для создания API-шлюзов, который консолидирует HTTP-эндпоинты API. 

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

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

  1. Сервисы, с помощью которых исполняется бизнес‑логика задач.

    • Облачные функции (Cloud Functions) — сервис для запуска кода в виде функции.

    • Бессерверные контейнеры (Serverless Containers) — про такой сервис мы уже рассказывали подробнее в прошлый раз.

  2. Сервисы для работы с данными.

    • База данных в режиме serverless.

    • Сервис для управления потоками данных (Data Streams).

    • Сервис очередей (Message Queue).

    • Объектное хранилище (Object Storage).

  3. Интеграционные сервисы, которые являются точками входа для обработки нагрузки. 

Типовые сценарии для serverless-архитектуры 

Обратимся к конкретным задачам, которые решаются при бессерверном подходе. 

Event-driven-веб-сервис. Представим приложение, которое реализует для пользователя такую базовую функциональность:  

  • авторизация пользователя;  

  • просмотр каталога кино;  

  • выставление оценок понравившейся кинокартине;  

  • добавление фильма в каталог. 

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

  • статические объекты находятся в объектном хранилище;  

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

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

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

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

2a31d01b426b2b1ae7b8286cab620e3d.png

Выделенный микросервис. Но мы не всегда хотим строить тотальный serverless. Поэтому бессерверные вычисления можно интегрировать в инфраструктуру и отдельными микросервисами — какой архитектура будет в этом случае?

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

Для загрузки видеозаписей используем объектное хранилище, что позволит недорого хранить довольно объёмные файлы. При этом конвертация видеофайлов может потребовать аппаратных ресурсов (ASIC‑/FPGA‑чипы или GPU), так что эту логику удобно оставить в существующем контуре виртуальных машин или нод Kubernetes‑кластера.

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

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

9b4891cc09a638dcb6fa63d0a473adc9.png

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

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

Для приёма данных из разных источников по HTTP мы можем использовать связку:

API‑шлюз → управление потоками данных → облачные функции / Data Transfer.

Это позволит нам в потоковом режиме принимать, трансформировать и сохранять данные в управляемом ClickHouse и объектном хранилище, из которых удобно визуализировать данные на дашбордах или анализировать их с помощью сервиса для выполнения потоковых запросов.

e887c0e35b700935ae94392bbdd2a1c0.png

Эти три примера хорошо описывают характерные для serverless архитектурные паттерны. Их знание поможет не только упростить переход на бессерверные вычисления, но и сделать этот переход выгодным для компаний. Для сравнения, перенос постоянной и высокой нагрузки на serverless‑инфраструктуру может обойтись дороже, чем при традиционном подходе. А вот «насмотренность» с точки зрения того, какие элементы архитектуры легко и дёшево перенести в бессерверный режим, поможет комбинировать разные инструменты с наибольшей эффективностью.

© Habrahabr.ru