Замечание воспроизведено на стенде: настоящие файлы консоли под локальным макетом Control API. Пачка из 15 накопленных событий при подключении к потоку даёт 22 обновления дашборда, то есть 44 запроса примерно за 0,1 секунды с одной вкладки. В установившемся режиме слияния соседних событий нет ни одного. В задании было написано, что эффект не измерен — исправлено. Туда же уточнение проверки: мерить нужно пачку, а не установившийся режим. В задание по тестам добавлен найденный при показе дефект текста: строка подтверждения направления заканчивается двумя точками. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
82 lines
5.3 KiB
Markdown
82 lines
5.3 KiB
Markdown
# Троттлинг обновления дашборда по событиям
|
||
|
||
- **Кому:** `antigravity`
|
||
- **Дата:** 2026-08-19
|
||
- **От кого:** главный агент (`claude`), по разбору PR #63 —
|
||
`agents/claude/done/2026-08-18-review-pr63-console-links.md`
|
||
- **Ветка:** `antigravity/console-events-throttle`
|
||
- **Файл отчёта:** `../done/2026-08-19-console-events-throttle.md`
|
||
|
||
## Что нужно сделать
|
||
|
||
Убрать усиление нагрузки на Control при пачке событий.
|
||
|
||
В `src/ServerMonitorManager.Control/wwwroot/app.js` обработчик события
|
||
делает так:
|
||
|
||
```js
|
||
const eventType = (ev.type || '').toLowerCase();
|
||
if (eventType.startsWith('link.') || eventType.startsWith('agent.')) {
|
||
loadDashboardData(false);
|
||
}
|
||
```
|
||
|
||
`loadDashboardData` выполняет два запроса — `/api/v1/control/agents` и
|
||
`/api/v1/control/links`. Ни debounce, ни throttle в файле нет: `setTimeout`
|
||
встречается трижды и ни разу для этой цели. Согласование политик Links в
|
||
Control работает непрерывно (`CHANGELOG.md`, Unreleased, #11), поэтому пачка
|
||
событий согласования по флоту превращается в удвоенный поток запросов от
|
||
**каждой** открытой вкладки консоли.
|
||
|
||
Нужно свести пачку событий к одному обновлению. Интервал выбираешь сам и
|
||
обосновываешь в отчёте; требование — консоль остаётся отзывчивой на
|
||
одиночное событие и не отправляет запрос на каждое событие в пачке.
|
||
Одновременные обновления не должны накладываться: пока запрос в полёте,
|
||
следующий не начинается, но и не теряется.
|
||
|
||
## Границы
|
||
|
||
Только `app.js`. Не менять эндпоинты Control, разметку, стили, серверную
|
||
часть, `deploy/**` и релизные workflow. Поведенческие тесты консоли —
|
||
отдельное задание `2026-08-19-console-behaviour-tests.md`.
|
||
|
||
## Как проверить результат
|
||
|
||
- предъявить количество запросов на пачке событий до и после правки:
|
||
на N событий подряд должно уйти одно обновление, а не N. В отчёт — способ
|
||
измерения и числа;
|
||
- показать, что одиночное событие по-прежнему обновляет дашборд;
|
||
- `dotnet test` — зелёный, с выводом;
|
||
- прогоны CI на PR — ссылками.
|
||
|
||
«Стало лучше» без чисел результатом проверки не является.
|
||
|
||
## Измерение, уже проведённое
|
||
|
||
Дефект найден чтением кода, но затем воспроизведён и измерен на стенде:
|
||
настоящие файлы консоли из `wwwroot` под локальным макетом Control API.
|
||
Числа получены из журнала сетевых запросов браузера.
|
||
|
||
- **Установившийся режим.** Одно событие → одно `loadDashboardData` → два
|
||
запроса (`/agents` и `/links`). Слияния соседних событий нет ни одного.
|
||
- **Пачка при подключении.** Поток отдал 15 накопленных событий разом —
|
||
консоль выпустила 22 обновления дашборда, то есть **44 запроса примерно
|
||
за 0,1 секунды**. Это одна вкладка и четыре узла.
|
||
- **Побочный эффект.** Каждое обновление перестраивает `innerHTML` таблицы
|
||
Links целиком. Во время пачки ссылки на элементы строки становятся
|
||
недействительными, и таблица перестраивается под курсором оператора.
|
||
|
||
Воспроизведение: открыть консоль под макетом Control, отдающим backlog
|
||
событий при подключении к `/api/v1/control/events`, и посмотреть журнал
|
||
сетевых запросов.
|
||
|
||
Отсюда следует уточнение к проверке: измерять надо именно пачку, а не
|
||
установившийся режим — в установившемся режиме при одном событии в 6 секунд
|
||
разница незаметна.
|
||
|
||
## Контекст и ограничения
|
||
|
||
Измерение сделано на макете API, а не на живом Hub: скорость поступления
|
||
событий на настоящем флоте не проверена. Если на живой машине окажется, что
|
||
пачек не бывает и усиления нет, — так и напиши в отчёте с числами; это
|
||
допустимый результат, а не провал задания.
|