芹菜(Redis)结果后端不起作用

时间:2016-02-21 18:00:08

标签: python django redis celery django-celery

我有一个使用Django的Web应用程序,我正在使用Celery进行一些异步任务处理。

对于Celery,我使用Rabbitmq作为经纪人,Redis作为后端的结果。

Rabbitmq和Redis正在本地虚拟机上托管的同一个Ubuntu 14.04服务器上运行。

Celery worker正在远程计算机上运行(Windows 10)(没有工作程序在Django服务器上运行)。

我有三个问题(我认为它们是以某种方式相关的!)。

  1. 任务留在' PENDING'状态,无论任务是成功还是失败。
  2. 任务在失败时不会重试。并且我在尝试重试时遇到此错误:
  3.   

    拒绝requeue = False:[WinError 10061]无法建立连接   因为目标机器主动拒绝它

    1. 结果后端似乎不起作用。
    2. 我也对我的设置感到困惑,而且我也不确切地知道这些问题的来源!

      所以这是我到目前为止的设置:

      程序my_app / settings.py

      # region Celery Settings
      CELERY_CONCURRENCY = 1
      CELERY_ACCEPT_CONTENT = ['json']
      # CELERY_RESULT_BACKEND = 'redis://:C@pV@lue2016@cvc.ma:6379/0'
      BROKER_URL = 'amqp://soufiaane:C@pV@lue2016@cvc.ma: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
      

      程序my_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@lue2016@cvc.ma/cvcHost', backend='redis://:C@pV@lue2016@cvc.ma: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))
      

      my_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
      

      程序my_app \电子邮件\ 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)
      

      在工人方面,我有一个文件' tasks.py'其中包含任务的实际执行情况:

      工人\ 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@lue2016@cvc.ma/cvcHost', backend='redis://:C@pV@lue2016@cvc.ma: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)
      

      我注意到的是:

      • 当我将我的工作人员中的代理设置更改为错误的密码时,我无法连接到代理错误。
      • 当我将我的工作人员的结果后端设置更改为错误的密码时,它会正常运行,好像一切正​​常。

      什么可能导致我这些问题?

      修改

      在我的Redis服务器上,我已经启用了远程连接

      /etc/redis/redis.conf

      ... 绑定0.0.0.0 ...

3 个答案:

答案 0 :(得分:8)

我的猜测是你的问题在密码中。 您的密码中包含@,可以将其解释为user:passhost部分之间的分隔符。

工作人员处于待处理状态,因为他们无法正确连接到代理。 来自芹菜的文档 http://docs.celeryproject.org/en/latest/userguide/tasks.html#pending

  

  任务正在等待执行或未知。任何未知的任务ID都隐含在待处理状态。

答案 1 :(得分:1)

在我的设置中添加CELERY_STORE_ERRORS_EVEN_IF_IGNORED = True为我解决了这个问题。

答案 2 :(得分:0)

我有一个设置,其中'单实例服务器'(dev和locahost服务器)正在工作,但不是当redis服务器是另一台服务器时。芹菜任务工作正常,但没有得到结果。在尝试获取任务结果时,我收到以下错误:

Error 111 connecting to localhost:6379. Connection refused.

使它工作的原因只是将该设置添加到Django:

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

似乎这个参数不存在,它默认为localhost来获取任务的结果。