ADR 021 фиксирует решение о тихом чтении и видимом состоянии источника; ui-resilience и затронутые domains приведены к AS-IS.
67 lines
5.9 KiB
Markdown
67 lines
5.9 KiB
Markdown
# 021. Тихое чтение и редкие подтверждения
|
|
|
|
**Status:** Accepted. Заменяет manual-refresh часть
|
|
[ADR 019](019-hourly-reads-and-online-instrument-reference.md) на стороне
|
|
интерфейса и уточняет клиентскую часть
|
|
[ADR 007](007-react-query-fetch-policy.md). Не меняет владельцев обновления
|
|
и границы чтения из ADR 019.
|
|
|
|
## Context
|
|
|
|
Экраны просмотра перекладывали на пользователя контроль над получением данных:
|
|
кнопки «Обновить» и «Повторить», индикатор фонового обновления и сообщение
|
|
о неудачной синхронизации повторялись в разных разделах. Пользователь приходит
|
|
смотреть финансы, а не обслуживать загрузку; восстановление после временного
|
|
сбоя не должно зависеть от нажатия кнопки.
|
|
|
|
При этом состояние самих данных остаётся значимым: время последнего успешного
|
|
результата источника, устаревание и исход часовой попытки влияют на доверие
|
|
к показанным суммам и не могут быть просто скрыты.
|
|
|
|
## Decision
|
|
|
|
- Автоматическое чтение клиента не сообщает о себе. Экраны просмотра не
|
|
показывают кнопок ручного обновления и повтора, индикаторов фонового
|
|
перечитывания и технических предупреждений о собственном запросе.
|
|
- Временные сбои GET восстанавливаются сами: ограниченный срок ожидания запроса
|
|
и не более двух повторов с возрастающими паузами, затем возврат к штатной
|
|
работе при появлении результата. Пользователь не инициирует восстановление.
|
|
- Состояние источника из `meta` остаётся видимым. Время последнего успешного
|
|
результата, признак устаревания, исход последней часовой попытки и неполнота
|
|
показываются текстом либо доступно именованным элементом, а не только цветом.
|
|
Это свойство данных, а не отчёт о техническом процессе, и оно не превращается
|
|
в действие пользователя.
|
|
- Доступный результат сохраняется при обновлении и временной ошибке. Неполнота
|
|
и подтверждённая пустота остаются различимыми: неизвестная сумма не становится
|
|
нулём, незавершённый расчёт не выдаётся за окончательный, незагруженный список
|
|
не выдаётся за отсутствие записей.
|
|
- Первичное ожидание ограничено по времени и показывает структуру будущего
|
|
содержимого. По его истечении экран переходит в спокойную локальную
|
|
недоступность вместо бесконечной загрузки и сам заменяет её содержимым после
|
|
восстановления. Сбой одного блока не скрывает остальные доступные блоки.
|
|
- Ошибки явных действий пользователя сохраняются и остаются видимыми. Решение
|
|
касается только чтения; отправка формы, изменение данных и сброс фильтра
|
|
по-прежнему сообщают результат, в том числе неуспешный.
|
|
|
|
## Consequences
|
|
|
|
Пользователь не может ускорить обновление вручную: нормальным владельцем
|
|
обновления остаётся часовой обход из ADR 019, и отсутствие кнопки не меняет его
|
|
срок. Если источник недоступен долго, экран показывает прежние данные с
|
|
обозначением устаревания, а не приглашение повторить.
|
|
|
|
Автоматический повтор ограничен: он покрывает короткие сетевые сбои, но не
|
|
длительную недоступность. Ошибки доступа, домена и отмены не повторяются,
|
|
mutations не повторяются вовсе.
|
|
|
|
Состояние источника и состояние клиентского чтения описывают разные вещи и
|
|
не подменяют друг друга. `Portfolio.isStale` сохраняет смысл возраста снимка;
|
|
ошибка клиентского перечитывания его не меняет.
|
|
|
|
Детали поведения — в
|
|
[ожидании и восстановлении интерфейса](../architecture/cross-cutting/ui-resilience.md)
|
|
и [свежести данных](../architecture/cross-cutting/data-freshness.md).
|
|
Согласованные требования принадлежат workspace-спецификациям
|
|
`frontend-user-feedback`, `frontend-data-resilience` и
|
|
`frontend-loading-presentation`.
|