Вам нужно установить
CELERY_ACKS_LATE = True
Позднее подтверждение означает, что сообщения задачи будут подтверждены после ее выполнения, а не только до этого, что является поведением по умолчанию,Таким образом, если рабочий сбой, у кролика MQ все равно будет сообщение.
Очевидно, что полного сбоя (Кролик + рабочие) в то же время нет способа восстановить задачу, кроме случаев, когда вы ведете журналирование.о начале и завершении задачи.Лично я пишу в mongodb строку каждый раз, когда запускается задача, и другую, когда задача завершается (независимо формирует результат), таким образом я могу узнать, какая задача была прервана, анализируя журналы mongo.
Выэто можно легко сделать, переопределив методы __call__
и after_return
базового класса задач сельдерея.
Ниже вы увидите фрагмент моего кода, который использует класс taskLogger в качестве диспетчера контекста (с точкой входа и выхода)).Класс taskLogger просто записывает строку, содержащую информацию о задаче в экземпляре mongodb.
def __call__(self, *args, **kwargs):
"""In celery task this function call the run method, here you can
set some environment variable before the run of the task"""
#Inizialize context managers
self.taskLogger = TaskLogger(args, kwargs)
self.taskLogger.__enter__()
return self.run(*args, **kwargs)
def after_return(self, status, retval, task_id, args, kwargs, einfo):
#exit point for context managers
self.taskLogger.__exit__(status, retval, task_id, args, kwargs, einfo)
Надеюсь, это может помочь