Долгий отчёт в веб-приложении: очередь, статус и скачивание
Долгий отчёт в веб-приложении лучше представлять как отдельное задание: запрос принят, работа ожидает или выполняется, затем появляется проверенный результат либо понятная ошибка. Пользователь должен вернуться к своему заданию после закрытия вкладки, не создавая копию. Принятие запроса, завершение вычисления и доступность файла — разные факты, которые интерфейс обязан различать.
Пользователь заказывает конкретный срез данных
Представим учебный отчёт по движениям оборудования за выбранный период. Сотрудник указал подразделение, даты и вид документа. Эти условия нужно сохранить вместе с заданием, чтобы позже не формировать результат по изменившемуся фильтру на странице. Название файла без описания среза не помогает понять, что именно в нём посчитано.
Отдельно выберите политику входных данных. Отчёт может строиться по согласованному состоянию или читать обновляющиеся записи по предусмотренному правилу. Одного времени начала в карточке недостаточно, чтобы обещать единый снимок базы. Если такой снимок требуется, его согласованность реализуют и проверяют отдельно. Пользователю нужно понимать, к какому моменту и условиям относится результат.
Задание переживает HTTP-запрос и вкладку
В шаблоне Asynchronous Request-Reply Microsoft описаны быстрое подтверждение приёма длительной операции и отдельный ресурс проверки состояния. В предложенной схеме HTTP 202 не означает завершения работы. Это один из вариантов организации интерфейса, а не обязательный код и маршрут для любого отчёта.
Для своего приложения сохраните идентификатор задания, владельца, условия и текущие события. При повторном открытии страницы пользователь должен получить существующую работу из своего списка. Закрытая вкладка не обязана хранить единственную информацию о её существовании. В разработку веб-приложения следует включить восстановление этого маршрута, а не только запуск из кнопки.
Повтор после неясного ответа требует отдельного правила. Если сервер уже принял запрос, потерянный ответ не должен автоматически приводить к постановке второго такого же задания. При этом человек может намеренно заказать новый отчёт по обновившимся данным. Различайте повтор той же команды и новый осознанный запуск, показывая пользователю результат принятого решения.
Что подтверждено в каждом состоянии
Это собственная модель экрана отчётов. Работа и файл имеют связанные, но разные состояния. В частности, удаление старого файла не означает, что ранее завершённое вычисление внезапно стало незавершённым.
| Состояние работы или результата | Что подтверждено | Что показать | Разрешённое действие | Следующее основание |
|---|---|---|---|---|
| Ожидает исполнения | Условия приняты, задание сохранено | Ожидание без вымышленного процента | Открыть условия, запросить отмену по правилам | Работник очереди принял задание |
| Выполняется | Началась обработка | Этап и достоверная доступная диагностика | Вернуться позже, запросить отмену | Подтверждённый результат, ошибка или остановка |
| Отмена запрошена | Принята просьба остановить | Ожидание решения по отмене | Проверить статус позднее | Исполнитель подтвердил остановку либо успел завершить |
| Завершено, файл доступен | Результат подготовлен и опубликован для владельца | Условия, время и способ получения | Скачать при наличии прав | Окончание срока хранения или изменение доступа |
| Ошибка | Попытка не дала готового результата | Понятная причина и допустимый следующий шаг | Повторить по принятой процедуре либо обратиться | Новая попытка или разбор |
| Остановлено | Исполнение прекращено по подтверждённому правилу | Итог отмены, судьба временных данных | Заказать новую работу при необходимости | Новая команда пользователя |
| Завершено, срок файла истёк | Работа была выполнена, но результат больше не хранится | Объяснение недоступности | Заказать новый отчёт при наличии прав | Самостоятельное новое задание |
Процент должен иметь проверяемый знаменатель
Если система знает число однородных записей и может посчитать обработанные, она может показывать долю этого объёма. Но доля записей не всегда равна доле времени: последняя группа или создание файла могут занимать иначе. Не обещайте пользователю точное оставшееся время только из отношения двух счётчиков.
Если общий объём неизвестен, честнее показать этап: поиск данных, расчёт, создание файла, подготовка скачивания. Не рисуйте постоянно растущий процент до условных 99, если за ним нет измерения. Время последнего обновления полезно, но старая метка сама по себе ещё не доказывает остановку: нужно сравнить её с реальными событиями исполнителя и выбранными пределами ожидания.
Готовность файла проверяют до появления ссылки
Создание временного файла не означает готовность результата. Сначала завершите запись и предусмотренную проверку состава, затем сделайте результат доступным. Иначе пользователь может скачать неполный документ. Зафиксируйте, как система распознаёт окончание публикации файла и восстанавливается после сбоя между вычислением и выдачей.
Доступ к карточке задания и скачиванию проверяется отдельно. Предсказуемый адрес или знание номера отчёта не должны давать чужой организации право получить файл. Если права сотрудника изменились после запуска, система должна применять согласованную политику выдачи результата. Эти случаи полезно включить в аудит SaaS.
Укажите срок хранения и поведение после него. Не оставляйте ссылку с необъяснимой ошибкой и не обещайте бессрочную доступность, если файл очищается. Сохранность истории задания и хранение самого документа можно регулировать по-разному. Для персональных данных и других ограниченных сведений состав и сроки требуют отдельного решения по конкретной задаче.
Отмена — запрос к исполнителю, а не закрытие окна
Microsoft отдельно описывает передачу просьбы об отмене обработчику и последующее обновление состояния. Для своего отчёта решите, где можно безопасно остановиться и что происходит с временными файлами. Прерывание запроса браузера не подтверждает остановку серверной работы, поэтому интерфейс не должен сразу объявлять итог «отменено» без основания.
Испытайте гонку отмены и завершения. Если готовый результат появился раньше обработки просьбы, покажите установленный фактический итог, а не два противоречивых сообщения. Если исполнитель перезапустился, нужно понять, продолжает ли он прежнюю попытку, начинает новую или передаёт ошибку. Повторное вычисление не должно бесконтрольно размножать публичные файлы и уведомления.
Испытания с потерей вкладки и перезапуском
- На учебных данных задайте условия и запустите отчёт. Закройте страницу до готовности, затем найдите ту же работу после повторного входа.
- Смоделируйте потерю ответа о приёме и повтор команды. Сверьте число заданий с выбранной политикой повторов.
- Проверьте очередь без свободного исполнителя. Ожидание должно отличаться от выполнения, не загружая сервер бесконечными запросами статуса.
- Прервите тестовую попытку между расчётом и публикацией файла. Убедитесь, что неполный результат не выдаётся как готовый.
- Запросите отмену во время работы и рядом с моментом завершения. Сопоставьте сообщение пользователю с подтверждённым итогом.
- Проверьте смену прав и истечение срока файла. Чужой отчёт не должен открываться, а отсутствующий результат — вызывать автоматический скрытый запуск.
Для больших отчётов согласуйте пределы очереди, допустимую параллельность и очистку временных данных. Это часть автоматизации и планирования поддержки сервера, а не повод бесконечно увеличивать тайм-аут. Хорошая карточка задания объясняет, что происходит, не создавая лишние вычисления от каждого обновления страницы.
Вопросы и ответы
Как async request-reply помогает долгому отчёту?
Клиент получает подтверждение приёма, а состояние длительной работы проверяет отдельно. Это позволяет не держать один исходный запрос открытым до появления файла, но требует собственной модели задания и ошибок.
Что должен показывать background job status?
Только подтверждённое состояние: ожидание, выполнение, готовность, ошибку или результат отмены по принятой модели. Процент уместен при измеряемом объёме и не должен подменять готовность файла.
Как отменить background task с формированием отчёта?
Передайте исполнителю запрос и дождитесь подтверждения результата. Закрытие вкладки или прерывание браузерного запроса само по себе не доказывает, что сервер перестал работать.
Читайте также
Весы в веб-приложении: USB ещё не означает совместимость
РазработкаPDF-отчёт режет таблицу: как задать правила страниц
РазработкаВеб-приложение или сайт: в чём разница и как это влияет на цену
РазработкаПриложение для мероприятия: как проверить очередь на регистрации
SaaSРезультат лаборатории обновился: статус и версия в клинике
SaaSТемпературный отчёт по рейсу: к какому грузу относятся данные