Разведка job-queue-choice — очередь написана вручную: захват не транзакционен, повторов и счётчика попыток нет, очереди мёртвых задач нет. Стоит перед сменой хранилища, чтобы не переписывать захват дважды. Цель text-insights: заголовок, пересказ и темы внешним сервисом с OpenAI-совместимым интерфейсом. Граница паспорта сдвинута — «понимание сказанного» было записано как то, чем проект не является; за границей остались ответы на вопросы по записи и поиск по смыслу. Цель service-observability в сопровождении и разведка opentelemetry-fit: /metrics остаётся и развивается, способ решает замер.
47 lines
3.5 KiB
Markdown
47 lines
3.5 KiB
Markdown
# 🔬 Очередь задач: своя таблица или готовая библиотека
|
|
|
|
- **Тип:** 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.
|