编写与具有速率限制且有时长时间丢失(无响应)的服务通信的 celery 任务时,正确的方法是什么?
我必须使用任务重试吗?如果服务缺少太多时间怎么办?有没有办法存储这些任务以便在很长一段时间后执行?
如果这是长任务中的子任务怎么办?
编写与具有速率限制且有时长时间丢失(无响应)的服务通信的 celery 任务时,正确的方法是什么?
我必须使用任务重试吗?如果服务缺少太多时间怎么办?有没有办法存储这些任务以便在很长一段时间后执行?
如果这是长任务中的子任务怎么办?
首先,我建议您设置套接字超时以避免长时间等待响应。比您可以捕获套接字 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.