芹菜重启失去预定的任务

Iva*_*sek 8 python django redis celery

我使用Celery来安排将来发送电子邮件.我把这个任务放在芹菜中,使用apply_async(),有时将来会设置ETA.

当我看到花时,我发现未来安排的所有任务都已收到状态.

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

我使用redis作为经纪人.

EDIT1

在文档中我发现:

如果在"可见性超时"内未确认任务,则该任务将重新传送给另一个工作人员并执行.

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

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

请注意,Celery将在工作人员关闭时重新发送消息,因此具有较长的可见性超时将仅在发生电源故障或强制终止工作时延迟"丢失"任务的重新传递.

可见性超时不会影响定期任务,因为这是与ETA /倒计时分开的概念.

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

BROKER_TRANSPORT_OPTIONS = {'visibility_timeout':43200}

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

但我的任务的ETA可以用几个月或几年来衡量.

编辑2

这是我输入时得到的:

$ celery -A app inspect scheduled

{u'priority':6,u'eta':u'2015-11-22T11:53:00-08:00',u'request':{u'args':你'(16426,)',你'TIME_START':无,u'name ':u'core.tasks.action_du E',u'delivery_info ':{u'priority':0,u'redelivered ':无,u'routing_key':u'celery" ,u'exchange ':u'celery'},u'hostname ':u'celery@app.myplanmap.com',u'ack那位博 ':虚假,u'kwargs':U '{}',u'id ':u'8ac59984-f8d0-47ae-ac9e-c4e3ea9c4a c6',u'worker_pid':无}}

如果你仔细观察,任务还没有被确认,所以它应该在芹菜重新启动后保持redis,对吧?

Die*_*nte 3

你必须使用 RabbitMq 而不是 redis。

\n\n

RabbitMQ 功能齐全、稳定、耐用且易于安装。它\xe2\x80\x99是生产环境的绝佳选择。

\n\n

Redis 的功能也很齐全,但在突然终止或断电时更容易丢失数据。

\n\n

使用rabbit mq,重启时丢失消息的问题就消失了。

\n

  • 差不多3年后uu (2认同)