Celery重新启动丢失计划任务



我使用Celery来安排将来的电子邮件发送。我用apply_async()把任务放在芹菜里,有时还会设置ETA。

当我看到花朵时,我看到所有为未来安排的任务都处于已接收状态。

如果我重新启动芹菜,所有的任务都会消失。他们为什么走了?

我用redis做经纪人。

EDIT1

在我发现的文档中:

如果某个任务在可见性超时内未得到确认,则该任务将重新传递给另一个工作进程并执行。

这会导致ETA/倒计时/重试任务出现问题,执行时间超过可见性超时;事实上,如果发生这种情况,它将被再次执行,并在循环中再次执行。

因此,您必须增加可见性超时,以匹配您计划使用的最长ETA的时间。

请注意,Celery将在工作人员关闭时重新传递消息,因此长时间的可见性超时只会在电源故障或强制终止工作人员时延迟"丢失"任务的重新传递。

周期性任务不会受到可见性超时的影响,因为这是一个独立于ETA/倒计时的概念。

您可以通过配置具有相同名称的传输选项来增加此超时:

BROKER_TRANSPORT_OPTIONS={"可见性超时":43200}

该值必须是描述秒数的int。

但我的任务预计到达时间可以用几个月或几年来衡量。

编辑2

这是我输入时得到的:

$celeni-一个应用程序检查预定的

{u'priority':6,u'eta':u'2015-11-22T11:53:00-08:00,u'request':{u'args':u'(16426,)',u'time_start':无,u'name':u'core.tasks.action_due',u'delivery_info':{u'priority':0,u'delivered':无,u'routing_key':u'selery',u'exchange':u'selery'},u'hostname':u`celery@app.myplanmap.com',u'ack已确认':错误,u'kwargs':u'{}',u'id':u'8ac59984-f8d0-47ae-ac9e-c4e3ea9c4ac6',u'worker_pid':无}}

若仔细观察,那个么任务还并没有被确认,所以它应该在芹菜重新启动后保留在redis中,对吧?

您必须使用RabbitMq而不是redis。

RabbitMQ功能完整、稳定、耐用且易于安装。这是生产环境的绝佳选择。

Redis也具有完整的功能,但在突然终止或电源故障的情况下更容易发生数据丢失。

使用rabbitmq,您在重新启动时丢失消息的问题必须解决。

相关内容

  • 没有找到相关文章

最新更新