如何禁用Celery的任务默认超时,和/或阻止它重试?

时间:2015-12-02 10:34:04

标签: celery

我在吃芹菜方面遇到了一些麻烦。不幸的是,设置它的人不再在这里工作了,直到现在我们从来没有遇到过问题,并且认为我们理解它是如何工作的。现在已经很清楚,我们没有,并且经过几个小时的搜索文档和其他帖子在这里,我不得不承认失败。希望这里有人可以解释我所缺少的内容。

我们正在使用多个任务,所有这些任务都在CELERYBEAT_SCHEDULE中定义,如下所示:

CELERYBEAT_SCHEDULE = {
    'runs-every-5-minutes': {
    'task': 'tasks.webhook',
    'schedule': crontab(minute='*/5'),
    'args': (WEBHOOK_BASE + '/task/refillordernumberbuffer', {'refill_count': 1000})
    },
    'send-sameday-delivery-confirmation': {
    'task': 'tasks.webhook',
    'schedule': crontab(minute='*/2'),
    'args': (WEBHOOK_BASE + '/task/sendsamedaydeliveryconfirmation', {})
    },
    'send-customer-hotspot-notifications': {
    'task': 'tasks.webhook',
    'schedule': crontab(hour=9, minute=0),
    'args': (WEBHOOK_BASE + '/task/sendcustomerhotspotnotifications', {})
    },
}

这不是全部,但它们都是这样的。所有这些实际上都是PHP脚本,不了解整个芹菜概念。它们只是执行某些操作的脚本,并在必要时发送通知。完成后,他们只是吐出一个JSON响应,上面写着 success = true

据我所知,芹菜只是用来定期执行它们。除了我的代码片段中的最后一个,我们没有任何问题。该任务/脚本发送电子邮件,通常为5到10,但有时甚至更多。这就是问题开始的地方,因为(当我在celery events中观察时,我可以诚实地在任何地方的文档中找不到任何确认),当PHP脚本的成功JSOn响应没有在3分钟内到达,芹菜重试任务,脚本再次发送大量电子邮件。而且,因为只有少量电子邮件从初始运行的任务中保存为“完成”。这通常导致4或5次重​​试,直到最后足够的电子邮件被先前的重试标记为“成功发送”,最后重试在此神秘的3分钟限制下完成。

我的问题:

  1. 是否有默认时间限制?它在哪里设置?我该如何覆盖它?我读过关于time_limitsoft_time_limit的内容,但我在配置中尝试的任何内容似乎都没有帮助。如果这是解决方案,我将需要协助如何正确应用设置。
  2. 我不能“只是”完全禁用整个重试概念(对于一项任务或者对所有任务而言,并不重要)?在我看来,我们不需要它,因为我们定期运行我们的任务,由于临时错误而丢失一个任务并不重要。我想这意味着我们不应该首先使用芹菜,因为我们误用它,但是现在我只是想更好地理解芹菜。
  3. 感谢您提供任何帮助,如果我发现任何不清楚的事情,我很抱歉 - 很高兴回答任何后续问题并在必要时提供更多详细信息。

    配置文件的其余部分如下:

    ## Broker settings.
    databases = parse_databases_xml()
    settings  = parse_custom_settings_xml()
    
    BROKER_URL = 'redis://' + databases['taskqueue']['host'] + '/' + databases['taskqueue']['dbname']
    
    # List of modules to import when celery starts.
    CELERY_IMPORTS = ("tasks", )
    
    ## Using the database to store task state and results.
    CELERY_RESULT_BACKEND = BROKER_URL
    
    CELERY_TASK_SERIALIZER = 'json'
    CELERY_RESULT_SERIALIZER = 'json'
    
    CELERY_ANNOTATIONS = {
        "*": {"rate_limit": "100/m"},
        "ping": {"rate_limit": "100/m"},
    }
    

    在任何地方都没有time_limit,所以我认为我们不是自己设置它。我省略了python导入和从我们的config xml文件中读取的函数,因为这些东西都运行正常,只是涉及一些数据库身份验证数据。

0 个答案:

没有答案