Паттерн Backend for Frontend (BFF) применяется, когда необходимо предоставить разные API или интерфейсы для различных клиентов (например, мобильного приложения, веб-приложения, IoT-устройства), чтобы оптимизировать их взаимодействие с бэкендом и скрыть внутреннюю сложность микросервисов. Каждый тип клиента получает свой собственный сервер BFF, который реализует специализируемое API, наилучшим образом подходящее под нужды клиента.
Это удобно при работе над крупными системами — разные BFF позволяют:
Пример архитектуры на Node.js:
// Express для BFF const express = require('express'); const axios = require('axios'); const app = express(); app.get('/profile', async (req, res) => { // Агрегация данных из разных сервисов const [user, settings] = await Promise.all([ axios.get('http://user-service/api/user'), axios.get('http://settings-service/api/settings') ]); res.json({ name: user.data.name, theme: settings.data.theme }); }); app.listen(3000);
Ключевые особенности:
BFF — это просто прокси между клиентами и микросервисами?
Нет. Главное отличие BFF от обычного прокси — наличие бизнес-логики и адаптации данных. BFF транслирует и агрегирует данные, а не просто перенаправляет запросы.
Можно ли использовать один BFF для всех клиентов?
Нет, один из принципов BFF — выделение BFF под каждый тип клиента. Если использовать единый BFF, теряются смыслы оптимальной настройки под разные интерфейсы и типы устройств.
BFF увеличивает слабую связанность между командами?
Часто отвечают "да", но это не так: добавление BFF чаще всего усиливает связанность, так как поддержка BFF требует общей работы фронтенд- и бэкенд-команд, что требует координации изменений.