Фоновые задачи
Все внешние задачи Chassis используют WorkerTaskDTO, WorkerProvider и
WorkerService. Обработчик, очередь и правила выполнения описываются один раз.
Только провайдер импортирует библиотеку worker и переводит правила в её API.
Импорт/экспорт — первая встроенная задача; новые задачи используют тот же контракт.
Выбор провайдера
CHASSIS_WORKER_PROVIDER = 'auto' выбирает первый доступный провайдер из
CHASSIS_WORKER_PROVIDERS. По умолчанию это Dramatiq, затем Celery. Выберите
провайдер по его name либо отключите workers значением 'none'. Явный выбор
не переключается на другой провайдер при недоступности; неизвестное имя вызывает
ImproperlyConfigured. Помимо установки библиотеки нужна настройка в проекте.
CHASSIS_WORKER_PROVIDER = 'dramatiq'
Chassis использует брокер проекта. Настройте его до регистрации задач. Проверка доступности определяет наличие настройки, а не здоровье брокера и worker.
Задачи и отправка
from django_chassis.dto import WorkerTaskDTO
from django_chassis.services import WorkerService
refresh_report = WorkerTaskDTO(
name='project.refresh_report',
handler='project.tasks.refresh_report',
queue='project-reports'
)
WorkerService.register_tasks(tasks=(refresh_report,))
WorkerService.enqueue(task=refresh_report, kwargs={'report_id': '123'})
Обработчик — импортируемая по строковому пути функция с именованными аргументами.
Сообщения содержат только JSON-значения: передавайте идентификаторы вместо моделей
и объектов UUID. Отправка сразу проверяет и копирует сообщение, а публикует после
transaction.on_commit(). При rollback ничего не отправляется. Это не
транзакционный outbox; для гарантии доставки при сбое между commit и публикацией
нужен outbox приложения.
WorkerTaskDTO.run(**kwargs) выполняет обработчик. Совместимые вызовы
task(**kwargs) и task.delay(**kwargs) выполняют или отправляют задачу через
тот же контракт; delay() возвращает None, независимо от транспорта.
Правила по умолчанию: три повтора, задержка 1–30 секунд, лимит выполнения пять
минут, возраст сообщения одни сутки, очередь chassis-default. Длительности
задаются в миллисекундах; провайдер переводит единицы при необходимости.
Переопределяйте правила в описании задачи, а не в копиях её обработчика.
Регистрация в worker-процессах
После инициализации Django и брокера используется один вызов регистрации:
import django
django.setup()
from django_chassis.services import WorkerService
WorkerService.register_tasks()
Он регистрирует встроенный реестр django_chassis.worker_tasks.TASKS у выбранного
провайдера. Импорт django_chassis.tasks также регистрирует его для интеграций,
которые обнаруживают Django-модули задач. Повторная регистрация безопасна у
встроенных провайдеров. При ограничении worker по очередям включите очереди из
описаний задач. Middleware очистки Django-соединений настраивается в проекте.
Дополнительные провайдеры
WorkerProvider — структурный протокол с одним name, is_available(),
register(task=...) и enqueue(task=..., kwargs=...). Оба метода принимают
WorkerTaskDTO, без аргументов, специфичных для импорта/экспорта. Адаптеры
регистрируют обработчик, переводят правила выполнения, публикуют JSON-сообщения
и обеспечивают безопасную повторную регистрацию. Commit контролирует сервис
Chassis, поэтому провайдер публикует сразу при вызове своего enqueue().
Третий провайдер не требует изменений форм, задач, отправки или исходников Chassis:
CHASSIS_WORKER_PROVIDERS = (
'project.workers.CustomWorkerProvider',
'django_chassis.providers.dramatiq_worker_provider.DramatiqWorkerProvider',
'django_chassis.providers.celery_worker_provider.CeleryWorkerProvider'
)
CHASSIS_WORKER_PROVIDER = 'custom' # CustomWorkerProvider.name
Порядок реестра задаёт приоритет в режиме 'auto'. Устаревший
CeleryAvailabilityService оставлен только для прежних интеграций; общий код
использует WorkerService.is_available().
См. также
Локальная Python-очередь
PythonQueueWorkerProvider использует те же описания задач и контракт отправки
в daemon-поток процесса. Он не входит в стандартный список выбора 'auto':
передайте provider=PythonQueueWorkerProvider() в WorkerService.enqueue() или
добавьте путь класса в свой реестр провайдеров. Прежний вариант импорта/экспорта
PYTHON_QUEUE теперь отправляет задачу через этот адаптер после commit.
Локальная очередь не гарантирует доставку: нет постоянного хранения, планировщика повторов и жёсткого таймаута. Метаданные повторов, возраста и времени выполнения внешних workers в этом режиме не применяются. Он подходит для разработки или одного web-процесса.