【问题标题】:Celery Tasks Lost after sending to rabbitmq broker发送到rabbitmq经纪人后芹菜任务丢失
【发布时间】:2017-06-02 20:33:02
【问题描述】:

我遇到了一个奇怪的问题,即我的一些任务在发送给代理后被丢弃。这发生在大约十分之一的任务中。我已经检查过没有老芹菜工人正在消耗这项任务。

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

然后我使用 celery 信号来了解发生了什么。我发现对于丢失的任务,只有 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 忽略了,还是因为某种原因默默地放弃了。

【问题讨论】:

  • 找到原因了吗?
  • 还没有,我从rabbitmq搬到sqs,也更新到最新的celery版本

标签: rabbitmq celery celery-task


【解决方案1】:

偶尔 celery 在执行之前会丢失任务。如果您不想丢失它们,则应设置启用task_acks_late(旧版本为CELERY_ACKS_LATE)。

在你的芹菜设置中,设置

task_acks_late = True

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

【讨论】:

  • 这并不能解决我的问题。 tcpdump 显示 amqp 数据包正在发送到 rabbitmq 服务器,但在另一端没有收到数据包。客户端和服务器位于不同的 Azure 帐户上。可能是 Azure 的 tcp 连接超时配置影响了它,但是使用 keepalive 或 heartbeat 也没有解决它。
猜你喜欢
  • 1970-01-01
  • 2016-10-22
  • 2019-04-07
  • 2016-08-25
  • 2015-06-23
  • 2018-12-26
  • 2016-02-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多