2017-01-18 18 views
5

У меня возникла странная проблема, когда некоторые из моих задач падают после отправки брокеру. Это происходит примерно в 1 из 10 задач. Я проверил, что нет старого работника сельдерея, потребляющего эту задачу.Задачи сельдерея Утеряны после отправки брокеру rabbitmq

Я использовал базу данных с поддержкой backend и flower для отслеживания недостающих задач, но task_id вернулся после того, как apply_async отсутствует в базе данных или в цветке. Его статус всегда приходит в ожидании.

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

Это мои сигналы

@before_task_publish.connect 
def before_task_publish_handler(sender=None, headers=None, body=None, **kwargs): 
# information about task are located in headers for task messages 
# using the task protocol version 2. 
    logger.info("BEFORE TASK SENT id:"+body['id']) 



@after_task_publish.connect 
def after_task_publish_handler(sender=None, headers=None, body=None, exchange=None, routing_key=None, **kwargs): 
# information about task are located in headers for task messages 
# using the task protocol version 2. 
    logger.info("AFTER TASK SENT id:"+body['id']) 


@task_prerun.connect 
def task_prerun_handler(sender=None, task_id=None, task=None, **kwargs): 
    logger.info("TASK PRERUN with TASK_ID:"+str(task_id)) 

Это то, что я нашел в журналах

$ cat gunicorn-access.log | grep -i 103de274-00dc-4765-844f-d319e9e199c2 
    BEFORE TASK SENT id: '103de274-00dc-4765-844f-d319e9e199c2' 
    AFTER TASK SENT id: '103de274-00dc-4765-844f-d319e9e199c2' 

Я не уверен, является ли задача игнорируется RabbitMQ или его молча упал на какой-то причине.

+0

Вы нашли причину? – melih

ответ

2

Время от времени сельдерей теряет задачи перед тем, как он будет выполнен. Если вы не хотите их потерять, вы должны установить разрешение task_acks_late (CELERY_ACKS_LATE в старых версиях).

В настройках сельдерея, установите

task_acks_late = True 

Это гарантирует, что сообщения задачи будут признаны after the task has been executed.

+0

, который не решает мою проблему. tcpdump показывает, что пакеты amqp отправляются на сервер rabbitmq, но нет пакетов, полученных на другом конце. Клиент и сервер находятся на разных учетных записях Azure. Возможно, это повлияло на конфигурацию тайм-аута соединения tcp Azure, но использование keepalive или heartbeat также не решило его. – melih