Question

Quelle est la bonne approche lors de l'écriture des tâches de céleri qui communiquent avec le service qui ont une limite de taux et parfois manque (ne répond pas) pendant une longue période de période?

Dois-je utiliser nouvelle tentative de tâche? Que faire si le service manque trop de temps? Est-il un moyen de stocker ces tâches pour une exécution ultérieure après une longue période de temps?

Et si cela est une sous-tâche dans une longue tâche?

Était-ce utile?

La solution

Tout d'abord, je vous suggère de définir un délai d'attente de prise pour éviter une longue attente d'une réponse. Que vous pouvez attraper la prise TimeoutException et dans ce cas particoular à une nouvelle tentative avec une grande quantité de temps, comme 15 minutes. Quoi qu'il en soit normalement j'utilise un incrementalRetry avec un pourcentage d'augmentation, cela augmentera le temps à chaque fois que la nouvelle tentative de tâche, ce qui est utile lorsque vous écrivez tâche qui dépend des services externes qui peuvent être disponibles depuis longtemps. Vous pouvez définir la tâche d'un grand nombre de nouvelles tentatives comme 50 et que régler l'heure de nouvelle tentative standard en utilisant le var

#20 seconds
self.default_retry_delay = 20 

après que vous pouvez mettre en œuvre une méthode comme celui-ci pour votre tâche

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)

Et si cela est une sous-tâche dans une longue tâche?

Si vous n'avez pas besoin le résultat que vous pouvez le lancer en mode asynchrone en utilisant task.delay (args = []) Une caractéristique intéressante est aussi le groupe de travail qui vous permettent de lancer différentes tâches et après tout sont finis vous pouvez à autre chose en vous flux de travail.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top