закрыта задача job-queue-choice
This commit is contained in:
@@ -23,7 +23,6 @@
|
||||
- [🐞 Не писать имя файла пользователя в журнал](items/no-user-filename-in-log.md) — Приём кладёт имя файла, данное пользователем, в журнал контейнера на каждой принятой записи — инвариант приватности объявляет это критическим и необратимым.
|
||||
- [🐞 Убирать записанный файл, когда приём отказал на середине](items/orphan-file-on-failed-intake.md) — Отказ чтения метаданных и отказ записи на диск оставляют файл в каталоге хранения без задачи и без учёта: сопоставить его не с чем, удалять приходится руками.
|
||||
- [🧹 Задать таймауты обращениям к внешним сервисам](items/external-call-timeouts.md) — Ни у Telegram, ни у Object Storage, ни у SpeechKit нет таймаута: молчащий собеседник держит шаг конвейера до истечения часового захвата.
|
||||
- [🔬 Очередь задач: своя таблица или готовая библиотека](items/job-queue-choice.md) — Очередь написана вручную: захват двумя запросами без транзакции, протухание временем, опрос раз в секунду вхолостую тремя воркерами.
|
||||
- [🧹 Перевести хранилище и файлы записей на встроенный PocketBase](items/pocketbase-storage.md) — Записи, метаданные и файлы лежат порознь, и владелец не видит их ничем, кроме консоли на сервере: панель PocketBase покажет их, только если они переедут к ней. Заодно переписывается захват задачи: сегодня это два запроса без транзакции, а падающая всегда задача падает вечно.
|
||||
- [✨ Пускать в приложение только после входа через OIDC](items/oidc-login.md) — HTTP API открыт наружу без аутентификации: любой из интернета заводит задачи за наши деньги и читает чужие расшифровки по идентификатору.
|
||||
- [✨ Привязать запись к владельцу и отдавать только свои](items/record-ownership.md) — У задачи и файла нет владельца, поэтому знание UUID задачи и есть право её читать.
|
||||
|
||||
@@ -1,46 +0,0 @@
|
||||
# 🔬 Очередь задач: своя таблица или готовая библиотека
|
||||
|
||||
- **Тип:** research
|
||||
- **Категория:** Очередь
|
||||
- **Зачем:** Очередь написана вручную: захват двумя запросами без транзакции, протухание временем, опрос раз в секунду вхолостую тремя воркерами.
|
||||
|
||||
Сегодняшняя очередь — принцип «очередь таблицей» из
|
||||
[architecture.md](../../docs/architecture.md) плюс `FindAndAcquire` в
|
||||
репозитории. Работает она на единицах записей в день, но написана целиком
|
||||
своими руками, и вот чего в ней нет:
|
||||
|
||||
- **захват не транзакционен** — `UPDATE` проставляет `acquisition_id`, отдельный
|
||||
`SELECT` читает строку по нему; сегодня это безопасно только потому, что три
|
||||
воркера читают три разных состояния и одну строку не делят;
|
||||
- **повторов с нарастающей паузой нет** — задача либо повторяется каждую
|
||||
секунду, либо ждёт истечения захвата целый час;
|
||||
- **число попыток не считается** — задача, падающая всегда, падает вечно;
|
||||
- **опрос вхолостую** — три воркера дёргают базу раз в секунду независимо от
|
||||
того, есть ли работа;
|
||||
- **очереди мёртвых задач нет** — `is_error = 1` исключает запись из выборки
|
||||
навсегда и молча.
|
||||
|
||||
Разведка идёт **перед** `pocketbase-storage`: смена хранилища перепишет захват
|
||||
задачи в любом случае, и переписывать его дважды незачем.
|
||||
|
||||
## Вопрос
|
||||
|
||||
Берём ли готовую очередь на Go поверх той же базы, и если да — какую, или
|
||||
оставляем свою таблицу, дописав к ней повторы, счётчик попыток и очередь мёртвых
|
||||
задач.
|
||||
|
||||
## Куда ляжет ответ
|
||||
|
||||
`docs/research/job-queue.md` — сравнение кандидатов с числами: зависимости,
|
||||
какая база нужна, переживает ли перезапуск, есть ли повторы и очередь мёртвых
|
||||
задач. Решение и причина отказа от остальных — в `docs/adr/`: принцип «очередь
|
||||
таблицей» записан в архитектуре, и его пересмотр обратной правкой не
|
||||
откатывается. Следом правится раздел «Принципы» в
|
||||
[architecture.md](../../docs/architecture.md).
|
||||
|
||||
## Рамки
|
||||
|
||||
Внешнего брокера (Redis, RabbitMQ, NATS) не рассматриваем: он добавляет к
|
||||
выкладке процесс, которого там нет, ради нагрузки в единицы записей в день.
|
||||
Кандидаты — библиотеки, работающие поверх той же встроенной базы. Ответ обязан
|
||||
учесть, что хранилище скоро сменится на PocketBase.
|
||||
Reference in New Issue
Block a user