Как обеспечить задачу Сельдерея - Предотвращение дублирования задач на сельдерей

Как вы препятствуете выполнению периодической задачи Сельдерей до завершения предыдущего выполнения?

У меня есть кластер серверов, связанных с общим сервером базы данных, выполняющий задачи Celery, и я нахожу, что каждый сервер может иногда запускать одну и ту же задачу одновременно, а также разные серверы, выполняющие эту же задачу одновременно. Это вызывает множество условий гонки, которые искажают мои данные болезненно тонкими способами.

Я читал Документы Celery, но я не могу найти какой-либо опции, которая явно разрешает это. Я нашел аналогичный вопрос, но предлагаемое исправление кажется взломом, поскольку оно основывается на структуре кэширования Django и, следовательно, может не использоваться всеми серверами в кластере, позволяя нескольким серверам выполнять одну и ту же задачу одновременно.

Есть ли какой-либо вариант в Celery для записи того, какие задачи выполняются в настоящее время в базе данных, и не запускаться снова до тех пор, пока запись базы данных не будет очищена?

Я использую модуль Django-Celery, и даже если он предоставляет страницы /admin/djcelery/taskstate/and/admin/djcelery/workerstate/, я никогда там появляются рабочие задачи или рабочие.

Ответ 1

Если бы я был вами, я бы установил специальную очередь для любых заданий, которые невозможно выполнить одновременно. Затем вы можете просто запустить отдельного работника только для этой очереди.

Ответ 2

Стандартный способ - использовать общий замок через стандартный механизм кэширования django. См. этот рецепт из официальной документации