У меня есть задача backsync_objects
, которая выбирает набор объектов из API и создает или обновляет их в моей базе данных.
Если я, например, изменяю порядок одного объекта на сервере, мой клиент отправляет несколько веб-крючков, потому что несколько объектов изменили порядок.
Проблема заключается в том, что задача такого типа не может выполняться несколько раз за один раз, поскольку она создает объект (ы), если такого объекта не существует. В моем случае он создает несколько одинаковых объектов, потому что объекты из предыдущего webhook еще не были зафиксированы.
def post(self, request, *args, **kwargs) -> HttpResponse:
tasks.backsync_all_stages.delay()
Я решил использовать сельдерей для этой цели, и есть два варианта
Выполняйте эти задачи синхронно, чтобы сохранить целостность
сельдерей -A myproj --concurrency = 1 рабочий -l информация
Запуск только первой или последней задачи (другими словами, предотвращение дублирования backsync_all_stages
задач в очереди)
Первое решение работает, но эта задача всегда повторяется 2,3 или даже 10 раз (зависит от того, сколько этапов изменило порядок).
Итак, я хотел бы проверить, есть ли такая задача в очереди или над ней работать, и либо добавить эту задачу в очередь, либо ничего не делать.
У вас есть какой-нибудь совет? Может быть, есть даже лучший вариант.
EDIT
В этом проекте будут, например, задачи для отправки электронной почты, поэтому я не могу просто заставить все задачи запускаться последовательно по понятным причинам.