- записи, метаданные и файлы съехались под один каталог данных; появилась панель владельца, а gin, goqu, goose и требование CGO ушли - захват задачи стал одним запросом с RETURNING; заведены число попыток, состояние dead и нарастающая пауза вместо признака is_error - имя файла в хранилище задаёт сервис и в журнал не идёт: вместе с идентификатором записи оно собирало бы ссылку на скачивание
61 lines
4.8 KiB
Markdown
61 lines
4.8 KiB
Markdown
## Why
|
|
|
|
Записи, их метаданные и сами файлы лежат порознь, и владелец сервиса не видит их
|
|
ничем, кроме консоли на сервере: чтобы посмотреть задачу или послушать запись,
|
|
он идёт руками в базу и в каталог на диске. Заодно принятая запись держится на
|
|
захвате из двух шагов подряд, между которыми задачу может перехватить соседний
|
|
воркер, а задача, падающая на каждой попытке, падает вечно и никем не считается.
|
|
|
|
## What Changes
|
|
|
|
- Записи, их метаданные и файлы съезжаются в одно хранилище, и владелец получает
|
|
панель, где видит задачу строкой, правит её и слушает саму запись.
|
|
- **BREAKING** Раскладка файлов на диске меняется: плоского каталога с именами по
|
|
идентификатору не остаётся, файл ложится в раскладку хранилища. Момент перехода
|
|
назначает человек.
|
|
- **BREAKING** Прежние данные не переносятся. Сервис начинает с чистого каталога
|
|
и заводит свою схему сам.
|
|
- Файл перестаёт отдаваться чтением с диска и отдаётся ссылкой, которую хранилище
|
|
строит по записи.
|
|
- Захват задачи воркером становится одним неделимым шагом: две задачи одному
|
|
состоянию больше не достаются.
|
|
- У задачи появляется число попыток. Задача, исчерпавшая их, переходит в
|
|
состояние «мертва»: из выборки исчезает, но остаётся видна владельцу и
|
|
возвращается в работу снятием состояния.
|
|
- Пауза перед повтором нарастает с номером попытки.
|
|
- Сборка перестаёт требовать CGO.
|
|
- Появляется секрет, которого не было: пароль владельца от панели. В
|
|
конфигурации он не лежит.
|
|
|
|
## Capabilities
|
|
|
|
### New Capabilities
|
|
|
|
- `storage`: где живут запись, её метаданные и её файл; как файл попадает в
|
|
хранилище и как отдаётся обратно; что владелец видит и правит в панели; с
|
|
каким состоянием сервис поднимается на чистом каталоге.
|
|
|
|
### Modified Capabilities
|
|
|
|
- `pipeline`: захват задачи становится неделимым; появляются число попыток,
|
|
нарастающая пауза и состояние «мертва» вместо признака ошибки, исключающего
|
|
задачу навсегда; описывается срок протухания захвата.
|
|
- `intake`: принятая запись уезжает в хранилище, а не в плоский каталог;
|
|
требование «имя отправителя в хранилище не попадает» остаётся в силе и в новой
|
|
раскладке.
|
|
|
|
## Impact
|
|
|
|
- Хранилище задач и файлов целиком: прежний слой запросов, построитель запросов и
|
|
механизм миграций уходят вместе с каталогом `migrations/`.
|
|
- Договор между ядром и хранилищем: интерфейсы репозиториев задач и файлов.
|
|
- Состав полей задачи: прибавляется число попыток, признак ошибки уступает место
|
|
состоянию в перечне состояний.
|
|
- Ключи конфигурации: путь к базе и путь к каталогу файлов заменяются одним
|
|
каталогом данных.
|
|
- Приём по HTTP и приём из Telegram — в части того, куда кладётся принятая
|
|
запись.
|
|
- Сборка образа: набор зависимостей меняется, требование CGO уходит.
|
|
- Документы: схема хранилища, инварианты и запреты с путями, модель угроз в части
|
|
того, из чего строятся пути.
|