web-dev-qa-db-fra.com

Céleri (Redis) résultats backend ne fonctionne pas

J'ai une application Web utilisant Django et j'utilise Celery pour le traitement de certaines tâches asynchrones.

Pour Celery, j'utilise Rabbitmq en tant que courtier et Redis en tant que backend.

Rabbitmq et Redis s'exécutent sur le même serveur Ubuntu 14.04 hébergé sur une machine virtuelle locale.

Les travailleurs Celery s'exécutent sur des machines distantes (Windows 10) (aucun travailleur ne s'exécute sur le serveur Django).

j'ai trois problèmes (je pense qu'ils sont liés en quelque sorte!).

  1. Les tâches restent dans l'état 'PENDING', peu importe si les tâches ont réussi ou échoué.
  2. les tâches ne réessayent pas en cas d'échec. et j'obtiens cette erreur en essayant de réessayer: 

rejeu requeue = False: [WinError 10061] Aucune connexion n'a pu être établie parce que la machine cible l'a activement refusée

  1. Les résultats ne semblent pas fonctionner.

je suis également confus au sujet de mes paramètres, et je ne sais pas exactement d'où peuvent provenir ces problèmes!

alors voici mes réglages jusqu'à présent:

mon_app/settings.py

# region Celery Settings
CELERY_CONCURRENCY = 1
CELERY_ACCEPT_CONTENT = ['json']
# CELERY_RESULT_BACKEND = 'redis://:C@pV@[email protected]:6379/0'
BROKER_URL = 'amqp://soufiaane:C@pV@[email protected]:5672/cvcHost'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_TASK_SERIALIZER = 'json'
CELERY_ACKS_LATE = True
CELERYD_PREFETCH_MULTIPLIER = 1

CELERY_REDIS_Host = 'cvc.ma'
CELERY_REDIS_PORT = 6379
CELERY_REDIS_DB = 0
CELERY_RESULT_BACKEND = 'redis'
CELERY_RESULT_PASSWORD = "C@pV@lue2016"
REDIS_CONNECT_RETRY = True

AMQP_SERVER = "cvc.ma"
AMQP_PORT = 5672
AMQP_USER = "soufiaane"
AMQP_PASSWORD = "C@pV@lue2016"
AMQP_VHOST = "/cvcHost"
CELERYD_Hijack_ROOT_LOGGER = True
CELERY_Hijack_ROOT_LOGGER = True
CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler'
# endregion

mon_app/celery_settings.py

from __future__ import absolute_import
from Django.conf import settings
from celery import Celery
import Django
import os

# set the default Django settings module for the 'celery' program.
os.environ.setdefault('Django_SETTINGS_MODULE', 'my_app.settings')
Django.setup()
app = Celery('CapValue', broker='amqp://soufiaane:C@pV@[email protected]/cvcHost', backend='redis://:C@pV@[email protected]:6379/0')

# Using a string here means the worker will not have to
# pickle the object when using Windows.
app.config_from_object('Django.conf:settings')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)


@app.task(bind=True)
def debug_task(self):
    print('Request: {0!r}'.format(self.request))

mon_app__init__.py

from __future__ import absolute_import

# This will make sure the app is always imported when
# Django starts so that shared_task will use this app.

from .celery_settings import app as celery_app

mon_app\email\tasks.py

from __future__ import absolute_import
from my_app.celery_settings import app

# here i only define the task skeleton because i'm executing this task on remote workers !
@app.task(name='email_task', bind=True, max_retries=3, default_retry_delay=1)
def email_task(self, job, email):
    try:
        print("x")
    except Exception as exc:
        self.retry(exc=exc)

du côté des travailleurs, j'ai un fichier 'tasks.py' qui contient l'implémentation réelle de la tâche:

Worker\tasks.py

from __future__ import absolute_import
from celery.utils.log import get_task_logger
from celery import Celery


logger = get_task_logger(__name__)
app = Celery('CapValue', broker='amqp://soufiaane:C@pV@[email protected]/cvcHost', backend='redis://:C@pV@[email protected]:6379/0')

@app.task(name='email_task', bind=True, max_retries=3, default_retry_delay=1)
def email_task(self, job, email):
    try:
        """
        The actual implementation of the task
        """
    except Exception as exc:
        self.retry(exc=exc)

ce que j'ai remarqué, c'est:

  • lorsque je modifie les paramètres du courtier dans mes travailleurs en un mauvais mot de passe, je ne peux pas me connecter à l'erreur du courtier.
  • lorsque je modifie les paramètres de résultat de mes ouvriers en un mot de passe incorrect, il s'exécute normalement comme si tout allait bien.

Qu'est-ce qui pourrait me causer ces problèmes?

MODIFIER

sur mon serveur Redis, j'ai déjà activé la connexion à distance

/etc/redis/redis.conf

... bind 0.0.0.0 ...

19
Soufiaane

L'ajout de CELERY_STORE_ERRORS_EVEN_IF_IGNORED = True à mes paramètres a résolu ce problème pour moi.

1
Shaun Kruger

J'avais une configuration où les «serveurs à instance unique» (les serveurs dev et locahost) fonctionnaient, mais pas lorsque le serveur Redis était un autre serveur. Les tâches de céleri fonctionnaient correctement, mais pas le résultat. J'obtenais l'erreur suivante juste en essayant d'obtenir le résultat d'une tâche:

Error 111 connecting to localhost:6379. Connection refused.

Ce qui a fait son travail, c’était simplement d’ajouter ce paramètre à Django:

CELERY_RESULT_BACKEND = 'redis://10.10.10.10:6379/0'

Il semble que si ce paramètre n'est pas présent, il utilisera par défaut localhost pour obtenir le résultat des tâches.

0
mrmuggles