From f1524fefd80500d09bb27217147d717713666b8f Mon Sep 17 00:00:00 2001 From: Anton Vakhrushev Date: Tue, 11 Aug 2026 14:13:41 +0300 Subject: [PATCH] =?UTF-8?q?=D0=B7=D0=B0=D0=BA=D1=80=D1=8B=D1=82=D0=B0=20?= =?UTF-8?q?=D0=B7=D0=B0=D0=B4=D0=B0=D1=87=D0=B0=20job-queue-choice?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tasks/BACKLOG.md | 1 - tasks/items/job-queue-choice.md | 46 --------------------------------- 2 files changed, 47 deletions(-) delete mode 100644 tasks/items/job-queue-choice.md diff --git a/tasks/BACKLOG.md b/tasks/BACKLOG.md index b71a95f..83c6cd6 100644 --- a/tasks/BACKLOG.md +++ b/tasks/BACKLOG.md @@ -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 задачи и есть право её читать. diff --git a/tasks/items/job-queue-choice.md b/tasks/items/job-queue-choice.md deleted file mode 100644 index f6e2f6c..0000000 --- a/tasks/items/job-queue-choice.md +++ /dev/null @@ -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.