Django / Celery - синхронно запускать один тип задач или предотвращать дублирование задач - PullRequest
0 голосов
/ 21 марта 2019

У меня есть задача backsync_objects, которая выбирает набор объектов из API и создает или обновляет их в моей базе данных.

Если я, например, изменяю порядок одного объекта на сервере, мой клиент отправляет несколько веб-крючков, потому что несколько объектов изменили порядок.

Проблема заключается в том, что задача такого типа не может выполняться несколько раз за один раз, поскольку она создает объект (ы), если такого объекта не существует. В моем случае он создает несколько одинаковых объектов, потому что объекты из предыдущего webhook еще не были зафиксированы.

def post(self, request, *args, **kwargs) -> HttpResponse:
     tasks.backsync_all_stages.delay()

Я решил использовать сельдерей для этой цели, и есть два варианта

  1. Выполняйте эти задачи синхронно, чтобы сохранить целостность

    сельдерей -A myproj --concurrency = 1 рабочий -l информация

  2. Запуск только первой или последней задачи (другими словами, предотвращение дублирования backsync_all_stages задач в очереди)

Первое решение работает, но эта задача всегда повторяется 2,3 или даже 10 раз (зависит от того, сколько этапов изменило порядок).

Итак, я хотел бы проверить, есть ли такая задача в очереди или над ней работать, и либо добавить эту задачу в очередь, либо ничего не делать.

У вас есть какой-нибудь совет? Может быть, есть даже лучший вариант.

EDIT

В этом проекте будут, например, задачи для отправки электронной почты, поэтому я не могу просто заставить все задачи запускаться последовательно по понятным причинам.

...