Очередь задач без магии: что случится после перезапуска
Почему задача должна иметь владельца, срок выполнения и понятное состояние.
Сначала договоритесь о гарантиях
Фоновая задача может быть получена дважды, завершиться после тайм-аута или потерять соединение в момент записи результата. Не начинайте с обещания exactly once. Опишите, какие повторы безопасны и где хранится окончательный результат.
Забирайте работу атомарно
Блокировка записи и SKIP LOCKED позволяют нескольким работникам выбирать разные задания. Состояние processing фиксируется до тяжёлой операции. Длительное вычисление выполняется вне транзакции.
SELECT id FROM jobs
WHERE status = 'queued'
ORDER BY created_at
FOR UPDATE SKIP LOCKED
LIMIT 1;
Сбой должен быть виден
Храните время начала, номер попытки и безопасное сообщение об ошибке. Отдельно отслеживайте задания, которые слишком долго остаются в processing. Не запускайте бесконечные повторы повреждённого файла.
Проверка на практике
Остановите работника во время обработки тестового задания. Запустите его заново и убедитесь, что очередь сохраняется, соседние задания выполняются, а незавершённая работа получает явный статус. Метрика размера очереди без возраста старейшего задания не показывает всю картину.
Обсуждение 2
Обсуждаем идеи, делимся опытом и уважаем собеседника.
Полезный разговор начинается с вас.
Войти и обсудить ↗Что делать с задачей, которую работник забрал и завис? Сразу возвращать в очередь?
Сначала нужен явный срок и проверка живого работника. Повтор должен быть безопасным: промежуточные файлы не считаются завершённым результатом.