3

编写与具有速率限制且有时长时间丢失(无响应)的服务通信的 celery 任务时,正确的方法是什么?

我必须使用任务重试吗?如果服务缺少太多时间怎么办?有没有办法存储这些任务以便在很长一段时间后执行?

如果这是长任务中的子任务怎么办?

4

1 回答 1

2

首先,我建议您设置套接字超时以避免长时间等待响应。比您可以捕获套接字 TimeOutException 并在这种特殊情况下重试大量时间,例如 15 分钟。无论如何,通常我使用增量百分比的增量重试,这将增加每次任务重试的时间,这在您编写依赖于可以长时间可用的外部服务的任务时很有用。您可以在任务上设置大量重试次数,例如 50 次,然后使用 var 设置标准重试时间

#20 seconds
self.default_retry_delay = 20 

在您可以为您的任务实现这样的方法之后

def incrementalRetry(self, exc, perc = 20, args = None):
    """By default the retry delay is increased by 20 percent"""
    if args:
        self.request.args = args

    delay = self.default_retry_delay

    if self.request.kwargs.has_key('retry_deleay'):
        delay = self.request.kwargs['retry_deleay']

    retry_delay = delay+round((delay*perc)/100,2)
    #print "delay"+str(retry_delay)

    self.retry(self.request.args,
               self.request.kwargs.update({'retry_deleay':retry_delay}),
               exc=exc,countdown=retry_delay, max_retries=self.max_retries)

如果这是长任务中的子任务怎么办?

If you don't need the result you can launch it in async mode by using task.delay(args=[]) A nice feature is also the task group that allow you to launch different tasks and after all are finished you can to something else in you work flow.

于 2011-03-17T13:32:53.770 回答