首页 文章

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

提问于
浏览
19

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

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

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

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

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

  • 无论任务是成功还是失败,任务都将保持在'PENDING'状态 .

  • 失败时任务不会重试 . 我试图重试时收到此错误:

reject requeue = False:[WinError 10061]无法 Build 连接,因为目标计算机主动拒绝它

  • 结果后端似乎不起作用 .

我也对我的设置感到困惑,我不知道这个问题可能来自哪里!

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

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 \ 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)

在 Worker 方面,我有一个文件'tasks.py',它具有任务的实际执行:

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@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)

我注意到的是:

  • 当我将我的工作人员中的代理设置更改为错误密码时,我无法连接到代理错误 .

  • 当我将我的worker中的结果后端设置更改为错误密码时,它会正常运行,好像一切正常 .

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

编辑

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

/etc/redis/redis.conf

...绑定0.0.0.0 ...

3 回答

  • 8

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

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

    PENDING任务正在等待执行或未知 . 任何未知的任务ID都暗示处于挂起状态 .

  • 1

    添加 CELERY_STORE_ERRORS_EVEN_IF_IGNORED = True 到我的设置为我解决了这个问题 .

  • 0

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

    Error 111 connecting to localhost:6379. Connection refused.
    

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

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

    看起来如果这个参数不存在,它将默认为localhost来获取任务的结果 .

相关问题