Архитектура BFF (Backend for Frontend): зачем нужна прослойка
Один API для веба, мобилки и IoT — плохая идея. BFF создаёт слой для каждого типа клиентов и адаптирует данные под потребности конкретного фронтенда. Рассмотрим особенности архитектуры.
1К открытий5К показов

Знакомы с архитектурой?
Да
Нет
Представьте ситуацию: ваш REST API для CRM-системы отлично работает с веб-версией. Создаёте мобильное приложение для курьеров и упираетесь в стену. Эндпоинт заказов тащит 40 лишних полей с финансовой отчётностью, а нужной геолокации складов нет.
Может плодить новые эндпоинты или заставлять мобилку делать несколько запросов вместо одного? Каждый запрос жрёт трафик и батарею!
Элегантное решение — архитектура Backend for Frontend (BFF). Это прослойка между клиентскими приложениями и основным API, которая адаптирует данные под потребности конкретного клиента.
Основная идея backend for frontend
Один API не может эффективно обслуживать разные типы клиентов. Сайт, приложение для iOS, Android, умные часы — у каждого свои потребности в данных, ограничения по производительности и особенности интерфейса.
Монолитный API создают с расчётом на универсальность — на практике это приводит к компромиссам. Веб-версии нужны данные для сортировки, мобильному приложению — минимальный набор для экономии трафика.
Следуя архитектуре BFF, вы можете создать логику для каждого типа клиента и не засорять основной API. Вместо одного эндпоинта /api/products, который пытается угодить всем, появляются слои:
- один — оптимизирует данные для веба,
- второй — для мобильных устройств,
- третий — для умных часов.
Обычно данные приходят в неудобном виде: несколько связанных сущностей нужно запрашивать отдельно и склеивать на клиенте. BFF берёт эту работу на себя.
Прослойка знает, что мобильному приложению нужны цены в рублях с округлением до целых, а веб-версии — точные значения в долларах. Для списка товаров мобилке достаточно названия и цены, а десктопной версии нужны ещё категории, рейтинги и количество отзывов.
Каждый клиент получает данные в том виде, в котором может их сразу отобразить. Вместо загрузки 50 полей, из которых используется 5, BFF отдаёт только нужные данные.
«Можете добавить поле user_avatar в ответ?»
— «Это сломает мобилку».
«Тогда сделайте отдельный эндпоинт».
— «У нас нет времени».
С BFF этого диалога нет. Фронтенд-команда получает свой API и крутит его, как хочет.
Мобильное приложение съедает 10к запросов в секунду? Пишите BFF на Go. Веб-версию делает стажёр, который знает только JavaScript? Ставьте Node.js. Никто не заставляет выбирать одну технологию на все случаи жизни.
Как работает backend for frontend (BFF)
BFF размещается между клиентскими приложениями и основными бэкенд-сервисами, выполняя роль посредника. В отличие от API Gateway, который просто перенаправляет запросы, BFF трансформирует данные.
Архитектура взаимодействия
Классическая схема выглядит так: мобильное приложение обращается к своему BFF, веб-приложение — к своему, умные часы — к третьему. Каждый BFF знает особенности своего клиента и общается с основными сервисами на их «языке».
Когда мобильное приложение запрашивает список заказов, его BFF делает несколько вызовов к микросервисам:
- берёт базовую информацию о заказах,
- подтягивает данные о товарах,
- получает статусы доставки.
Затем склеивает всё в один ответ, отбрасывая ненужные поля и добавляя вычисляемые значения.
Веб-версия для того же списка заказов получит расширенную информацию: подробные описания товаров, историю изменений статусов, данные для аналитики.
Обработка и агрегация данных
BFF не просто перекладывает данные из одного формата в другой. Он выполняет бизнес-логику.
Например, мобильный BFF может кешировать часто запрашиваемые данные, чтобы уменьшить количество сетевых запросов.
Если API возвращает цены в центах, мобильный BFF конвертирует их в рубли и округляет для отображения. Веб-версия получает точные значения с копейками для расчётов.
Независимость и масштабирование
Когда нагрузка на приложение растёт, масштабируется только его BFF. Проблемы с веб-версией не влияют на работу мобильных клиентов.
4 ключевых преимущества BFF
Оптимизация передачи данных
Самое очевидное преимущество — экономия трафика. Приложение не тащит 2 МБ JSON с полным каталогом товаров на мобильное устройство? BFF отдаёт только нужные поля.
Количество запросов тоже сокращается. Например, чтобы показать профиль пользователя, фронтенд делает 5 запросов:
- за основными данными,
- аватаром,
- списком друзей,
- последними постами,
- настройками приватности.
BFF объединяет всё в один запрос, получая данные параллельно от разных сервисов.
Упрощение фронтенда
Половина фронтенд-кода уходит на трансформацию ответов API:
- парсинг дат,
- группировку массивов,
- вычисление производных значений.
BFF может взять эту работу на себя.
Безопасность через изоляцию
BFF создаёт барьер между клиентами и сервисами. Мобильное приложение никогда напрямую не обращается к БД пользователей или платёжке — только через свой BFF.
Можно настроить разные уровни доступа:
- мобильный BFF видит только публичные данные,
- API для партнёров работает в песочнице.
Если мобильное приложение скомпрометировано, злоумышленник не получит доступ к внутренним сервисам.
Независимое масштабирование
Когда приложение попадает в топ App Store, нагрузка взлетает в разы. Но страдает только мобильный BFF — веб-версия продолжает работать стабильно. Можно быстро поднять дополнительные серверы только для мобильного трафика.
Появляется возможность экспериментировать с технологиями без риска. Хотите попробовать GraphQL для веб-версии? Внедряйте в один BFF. Тестируете новую базу данных? Подключайте к экспериментальной прослойке, не трогая продакшн.
Когда стоит использовать backend for frontend
BFF — инструмент для конкретных ситуаций.
Когда интерфейсы кардинально отличаются
Если ловите себя на мысли: «этот эндпоинт нужен только для веба» или «мобилка использует 10% полей из ответа», — пора задуматься о BFF.
Красный флаг — когда фронтенд-разработчики начинают писать костыли для обработки «неудобных» данных. Если половина JavaScript-кода занимается парсингом и трансформацией ответов API, что-то пошло не так.
Когда интерфейсы эволюционируют быстрее джунов
Стартапы и продукты в активной фазе развития меняют интерфейсы каждую неделю.
Классическая проблема: дизайнеры придумали новый способ отображения товаров в каталоге. Теперь нужны дополнительные поля, другая группировка, новые фильтры.
Без BFF это означает изменения в основном API, которые могут сломать другие клиенты. С BFF — правки только в одном месте.
Когда команды работают независимо
Если у вас несколько фронтенд-команд, которые постоянно конфликтуют из-за API, BFF даст им свободу.
Команды получат свой API, который смогут развивать в нужном темпе. Это важно в больших компаниях, где бэкенд не успевает обрабатывать запросы от всех фронтендеров.
BFF распределяет ответственность: каждая команда поддерживает свой слой.
Когда НЕ стоит использовать BFF
Если у вас простое приложение с одним клиентом, BFF добавит лишнюю сложность. Если API уже идеально подходит всем клиентам, зачем что-то менять?
3 типичные ошибки при внедрении BFF
Дублирование логики
Начинается незаметно: мобильный и веб BFF нуждаются в одинаковой валидации пользователей. Разработчик копирует функцию из одного проекта в другой. Через полгода одинаковый код валидации живёт в четырёх местах, и каждое изменение превращается в квест.
Хуже, когда дублируется бизнес-логика. Расчёт скидок, обработка промокодов, правила доступа — это должно жить в основных сервисах, а не размазываться по BFF-слоям.
Избыточная сложность вместо упрощения
Пример: команда создаёт «универсальный BFF-фреймворк» с конфигурацией через YAML, поддержкой плагинов и собственным DSL. В итоге простое добавление поля в ответ требует изучения документации на 50 страниц.
Другая крайность — микро-BFF для каждой мелочи. Отдельный слой для авторизации, отдельный для форматирования дат, отдельный для валидации.
Неправильная гранулярность
Один BFF на все мобильные платформы может быть слишком общим: iOS и Android имеют разные особенности интерфейса. Но отдельный BFF для каждой версии приложения — явный перебор.
Частая ошибка — создание BFF по организационному принципу, а не по техническому. У нас три фронтенд-команды, значит нужно три прослойки. Но если все команды работают с похожими данными и интерфейсами, логичнее объединить усилия.
Практические примеры использования BFF
Netflix
Компания сделала разные API для веб-версии, мобильных приложений, Smart TV и игровых консолей. Каждый BFF оптимизирован под особенности устройства, например, TV-версия предзагружает больше контента из-за медленной навигации пультом.
Spotify
Используют BFF для разных клиентов: веб-плеер, мобильные приложения, десктопное приложение. Мобильный BFF агрессивно кеширует данные для офлайн-режима, веб-версия работает в реальном времени.
SoundCloud
Публично описывали переход на BFF-архитектуру. У них отдельные слои для веб-версии и мобильных приложений, которые по-разному обрабатывают аудиопотоки и метаданные треков.
Заключение
Страдают все, когда один API пытается обслуживать веб-версию, мобилки и что-то ещё. Фронтенд получает неудобные данные, бэкенд обрастает костылями, пользователи — медленными приложениями.
Backend for Frontend создаёт слой между клиентами и основными сервисами. Каждый тип устройства получает API, заточенный под его потребности.
Внедряйте BFF, когда интерфейсы кардинально отличаются, продукт быстро развивается, а текущий API снижает производительность.
Ты уже программист, если читаешь это! Больше про кодинг — здесь.
1К открытий5К показов