Как работает очередь Плавни
Плавня 1.1.6 · документация разработчика
Содержание главы
- Модель
- Хранение
- Доставка
Плавня — встраиваемая очередь фоновых задач: библиотека в процессе приложения, а не отдельный сервис. Задачи — функции в вашем коде, очередь — таблица в вашей же БД.
Модель
producer ──enqueue──> таблица задач ──poll──> worker pool ──> ваш код
(статусы: new/running/done/failed)
Один и тот же процесс может быть и продюсером, и воркером. Отдельный воркер-процесс необязателен, но полезен для тяжёлых задач, чтобы не грузить интерактивный процесс.
Хранение
Таблица с индексами по (status, run_at). Выборка —
SELECT ... WHERE status='new' AND run_at <= now() ORDER BY priority DESC, run_at
LIMIT n FOR UPDATE SKIP LOCKED. Конкурентные воркеры не забирают одну
задачу дважды.
Доставка
Гарантия — at-least-once: задача, упавшая посреди выполнения, будет
повторена. Обработчики должны быть идемпотентными или использовать
task.idempotency_key.
Примечание. Ровно-один-раз Плавня не даёт принципиально —
как и любая очередь поверх транзакционной БД.