我使用Celery来安排将来发送电子邮件。我把这个任务放在芹菜中,使用apply_async(),有时将来会设置ETA。
当我看到花时,我发现未来安排的所有任务都已收到状态。
如果我重新启动芹菜,所有任务都将消失。为什么他们走了?
我使用redis作为经纪人。
EDIT1
在文档中我发现:
如果在“可见性超时”中未确认任务,则该任务将重新传送给另一个工作人员并执行。
这导致ETA /倒计时/重试任务出现问题,执行时间超过可见性超时;事实上,如果发生这种情况,它将再次执行,并再次循环执行。
因此,您必须增加可见性超时以匹配您计划使用的最长ETA的时间。
请注意,Celery将在工作人员关闭时重新发送消息,因此具有较长的可见性超时只会延迟在发生电源故障或强行终止工作时重新发送“丢失”任务。
定期任务不会受到可见性超时的影响,因为这是与ETA /倒计时分开的概念。
您可以通过配置具有相同名称的传输选项来增加此超时:
BROKER_TRANSPORT_OPTIONS = {' visibility_timeout':43200}
该值必须是描述秒数的int。
但我的任务的ETA可以用几个月或几年来衡量。
编辑2
这是我输入的内容:
$ celery -A app检查预定的
{u' priority':6,u':' 2015-11-22T11:53:00-08:00',u'请求& #39;:{u' args':你'(16426,)',你' time_start':无,你'姓名':你' ; core.tasks.action_du e',u' delivery_info':{u' priority':0,u' redelivered':无,你' routing_key':你'芹菜',u'交换':u' celery'},u'主机名':你' celery@app.myplanmap.com',你&# 39; ACK 咆哮':是的,你' kwargs':你' {}',你':你' 8ac59984-f8d0-47ae-ac9e-c4e3ea9c4a c6',u' worker_pid':无}}
如果你仔细观察,任务还没有被确认,所以它应该在芹菜重启后保持红色,对吗?
答案 0 :(得分:2)
您必须使用RabbitMq代替redis。
RabbitMQ功能齐全,稳定,耐用且易于安装。这是生产环境的绝佳选择。
Redis的功能也很完善,但是在突然终止或断电的情况下更容易丢失数据。
使用Rabbit MQ,您必须重新启动时丢失消息的问题就消失了。