2013-08-14 3 views
2

Я запускаю Django Celery с брокером Redis и бэкэндом базы данных, той же самой почтой Postgres, которую я использую для основного приложения.Как восстановить из Django Celery упал соединение с Postgres

Недавно я столкнулся с ситуацией, когда сервер Postgres перезагружается, а рабочие процессы теряют соединение с БД. После этого не будет никаких проблем сельдерея снова, даже когда БД вернется, и основной сайт Django отвечает нормально. Мне нужно перезапустить процессы celeryd, прежде чем что-либо будет обработано. Все задачи сельдерея сообщить ту же ошибку:

DatabaseError: terminating connection due to administrator command 
SSL connection has been closed unexpectedly 

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

Итак, почему это произошло? Существует ли более низкий уровень поддержки соединения db? Как я могу сельдерей повторить эти задачи?

+1

Не уверен, что, если он полностью связаны, но у меня была эта ошибка с Django раньше: https://code.djangoproject.com/ticket/15802 – Wolph

+0

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

ответ

3

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

http://docs.celeryproject.org/en/latest/userguide/tasks.html#abstract-classes

class DBTask(celery.Task): 
    abstract = True 

    def after_return(self, *args, **kwargs): 
     connection.close() 

@celery.task(base=DBTask) 
def mytask(): 
    # Do Stuff with DB 
Смежные вопросы