Вопрос проверяет понимание паттерна BFF и умения проектировать слой API, адаптированный под конкретный клиент, что важно для архитектуры современных веб- и мобильных приложений.
BFF (Backend for Frontend) — это архитектурный паттерн, при котором для каждого типа клиента создаётся собственный промежуточный backend. Вместо того чтобы фронтенд напрямую обращался к десяткам микросервисов, он общается с одним BFF, который знает, какие данные нужны конкретному экрану или сценарию.
Допустим, есть сервисы пользователей и заказов. BFF собирает данные для главного экрана мобильного приложения:
const express = require('express');
const app = express();
app.get('/api/home', async (req, res) => {
const [user, orders] = await Promise.all([
fetch('http://users-service/users/1').then(r => r.json()),
fetch('http://orders-service/orders?userId=1').then(r => r.json())
]);
res.json({
userName: user.name,
avatar: user.avatarUrl,
lastOrders: orders.slice(0, 3).map(o => ({
id: o.id,
total: o.total,
status: o.status
}))
});
});
app.listen(3000);BFF особенно полезен в микросервисной архитектуре, когда разные клиенты требуют разного набора данных. Например, мобильному приложению нужен компактный ответ, а веб-версии — расширенный. Также BFF помогает при постепенной миграции с монолита на микросервисы.
Итог: BFF стоит применять, когда клиентов несколько и у них разные потребности в данных, либо когда фронтенд вынужден делать слишком много запросов к разным сервисам. Это упрощает клиент, ускоряет разработку и снижает связанность систем.