Skip to content

ADR 0022: Управляемая очередь проверяемых скачиваний ​

Статус: accepted. Дата: 2026-09-24.

Контекст ​

У шлюза уже есть bounded admission, квоты bytes/s и отмена сокетов; SDK умеет Range/retry и проверку SHA-256. Консоль запускала одно неуправляемое скачивание прямо в destination. Нужны пользовательская очередь, пауза, продолжение, отмена, очистка и управление количеством потоков/задержками без ослабления проверки содержимого и без привязки native UX к внешнему протоколу.

Решение ​

Добавить portable DownloadQueue в SDK, checkpointedDownload поверх существующего downloadVerified и узкий DownloadStorage. Состояния очереди и пределы задаются явно. Слот занят до закрытия writer/commit/cleanup, а не только до получения HTTP headers. Пауза прерывает запрос и сохраняет завершённые записи в приватный checkpoint; продолжение перечитывает hash prefix и запрашивает suffix. Задание фиксирует credentials и repository/artifact; смена identity отменяет старые задания.

Браузерный адаптер использует OPFS для staging, Web Lock для защиты сессии вкладки и File System Access для финального сохранения. Прежний destination остаётся неизменным до успешной проверки. Saving является короткой по смыслу, но не ограниченной по времени неотменяемой фазой: её результат нужно дождаться. Длительный commit на медленном диске не выдаётся за отменённое скачивание.

Отмена и очистка очереди не удаляют содержимое Arkvory или пользовательский готовый файл. Cleanup ошибки видны; успешный commit сохраняет статус успеха при последующей ошибке удаления staging. Ограничения очереди включают историю. Первоначальное ограничение восстановления после reload снято в ADR 0041: приватный журнал, сегментные checkpoints и повторный выбор назначения.

Дополнительно параметризовать существующие серверные waiting limits/timeouts и показать их в readiness. HTTP inventory и авторизация не меняются; additive OpenAPI 0.6.1 и прежняя схема БД 11.

Альтернативы и границы ​

Хранение всего файла/всего prefix в JS-массиве отклонено для 5 GiB. Запись частичной копии прямо в выбранный финальный файл отклонена: потребитель может принять её за готовую. Долговременная пауза с открытым HTTP-потоком отклонена: удерживает серверные ресурсы. Попытка отменить финальный commit отклонена из-за неоднозначного результата публикации.

Клиентская очередь не является распределённым scheduler. Динамическая балансировка шлюзов, durable download intents и административное прерывание чужих соединений требуют отдельного контракта и прав. Наличие UI не повышает local filesystem до HA. Эксплуатация и проверки: DOWNLOAD_QUEUE.

Arkvory · ProAnimaStudio