6.3 KiB
ADR-012: Сводка брокерских счетов агрегируется на frontend
Статус: Accepted
Дата: 2026-06-19
Контекст
Страница списка брокерских счетов должна показывать общую стоимость, дневной результат, свободные
деньги и распределение активов, а также подробные показатели каждого счёта. Endpoint
GET /api/v1/broker/accounts возвращает только метаданные счетов. Все необходимые финансовые данные
уже доступны через GET /api/v1/broker/accounts/:accountId/portfolio.
Текущий продуктовый сценарий предполагает один–три открытых счёта. Backend кеширует ответы портфеля и ограничивает запросы к T-Bank через общую очередь.
Рассмотренные варианты
1. Агрегация существующих ответов на frontend
Frontend получает список счетов, параллельно запрашивает портфель каждого счёта и строит общую сводку из успешно загруженных ответов.
Преимущества:
- не появляется новый API-контракт с данными, уже доступными в portfolio endpoint;
- каждый счёт может загружаться и восстанавливаться после ошибки независимо;
- при одном–трёх счетах число запросов остаётся ограниченным;
- используются существующие backend cache и rate limiting.
Недостатки:
- страница выполняет
1 + NHTTP-запросов; - ответы могут иметь разные значения
asOfи не образуют атомарный снимок; - правила презентационной агрегации находятся на frontend.
2. Новый aggregate endpoint
Добавить endpoint, который возвращает список счетов, их портфели и общую сводку одним ответом.
Преимущества:
- один HTTP-запрос с frontend;
- единый серверный контракт агрегации;
- проще переиспользовать сводку другими клиентами.
Недостатки:
- новый контракт дублирует существующие portfolio-данные;
- нужно определить семантику частичных ошибок и кеширования составного ответа;
- endpoint всё равно получает портфели нескольких счетов и не гарантирует атомарность данных T-Bank.
3. Расширение endpoint списка счетов
Добавить финансовую сводку каждого счёта в GET /api/v1/broker/accounts.
Преимущества:
- frontend получает всё одним запросом;
- карточки становятся простыми потребителями ответа.
Недостатки:
- лёгкий endpoint метаданных превращается в дорогой составной запрос;
- меняются его кеширование, время ответа и семантика ошибок;
- потребители списка счетов вынужденно получают финансовые данные.
Решение
Использовать вариант 1: агрегировать существующие portfolio-ответы на frontend.
Frontend параллельно запрашивает портфели после получения списка счетов. Общая сводка строится только из успешно загруженных ответов и явно помечается как частичная, если часть счетов недоступна. Ошибка одного портфеля не блокирует остальные карточки.
Денежные значения группируются по валюте. Frontend не выполняет неявную валютную конвертацию и не
складывает несопоставимые суммы. Значения asOf отдельных ответов сохраняют свой смысл; сводка не
считается транзакционно согласованным снимком.
Последствия
- Страница выполняет один запрос списка и до трёх параллельных запросов портфелей.
- Backend остаётся источником финансовых данных отдельного счёта, а frontend владеет только их представлением и агрегацией для этой страницы.
- Частичные ошибки становятся штатным состоянием интерфейса и должны быть покрыты тестами.
- API, OpenAPI и frontend codegen для этой фичи не меняются.
- Решение следует пересмотреть, если выполняется хотя бы одно условие:
- продукт поддерживает более трёх одновременно отображаемых счетов;
- измерения показывают неприемлемую задержку или нагрузку от
1 + Nзапросов; - нескольким клиентам нужна одинаковая серверная сводка;
- появляется требование к согласованному серверному снимку или серверной валютной конвертации;
- правила агрегации становятся самостоятельной бизнес-логикой, а не логикой представления.