Celery任务在发送给rabbitmq经纪人后丢失了

时间:2017-01-18 12:47:12

标签: rabbitmq celery celery-task

我遇到一个奇怪的问题,我的一些任务在发送给经纪人之后就被删除了。这种情况发生在大约十分之一的任务中。我已经检查过没有老芹菜工人在完成任务。

我使用数据库支持的后端和花来监视丢失的任务,但在apply_async之后返回的task_id不存在于数据库或花中。它的状态总是待定。

然后我用芹菜信号找出发生了什么。我发现,对于缺失的任务,只会触发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是否忽略了该任务,或者由于某种原因而无声地丢弃了该任务。

1 个答案:

答案 0 :(得分:3)

芹菜偶尔会在执行之前丢失任务。如果您不想丢失它们,则应在旧版本中设置启用task_acks_lateCELERY_ACKS_LATE)。

在芹菜设置中,设置

task_acks_late = True

这可确保将确认任务消息after the task has been executed