芹菜(Redis)结果后端不工作
Celery (Redis) results backend not working
我有一个使用 Django 的 Web 应用程序,我正在使用 Celery 处理一些异步任务。
对于 Celery,我使用 Rabbitmq 作为代理,Redis 作为结果后端。
Rabbitmq 和 Redis 运行 在同一个 Ubuntu 14.04 服务器上托管在本地虚拟机上。
Celery worker 在远程机器上 运行 (Windows 10)(Django 服务器上没有 worker 运行)。
我有三个问题(我认为它们在某种程度上是相关的!)。
- 无论任务成功还是失败,任务都停留在'PENDING'状态。
- 任务失败时不会重试。我在尝试重试时收到此错误:
reject requeue=False: [WinError 10061] No connection could be made
because the target machine actively refused it
- 结果后端似乎不起作用。
我也对我的设置感到困惑,我不知道这个问题可能来自哪里!
到目前为止,这是我的设置:
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)
在工作人员方面,我有一个文件 '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)
不过我注意到的是:
- 当我将工作人员中的代理设置更改为错误密码时,出现无法连接到代理错误。
- 当我将 workers 中的结果后端设置更改为错误密码时,它运行正常,就好像一切正常。
是什么导致了我这些问题?
编辑
在我的 Redis 服务器上,我已经启用了远程连接
/etc/redis/redis.conf
...
绑定 0.0.0.0
...
我猜你的问题出在密码上。
您的密码中有 @
,这可以解释为 user:pass
和 host
部分之间的分隔符。
工作人员处于待定状态,因为他们无法正确连接到代理。
来自芹菜的文档
http://docs.celeryproject.org/en/latest/userguide/tasks.html#pending
PENDING
Task is waiting for execution or unknown. Any task id that is not known is implied to be in the pending state.
在我的设置中添加 CELERY_STORE_ERRORS_EVEN_IF_IGNORED = True
为我解决了这个问题。
我有一个设置,其中 'single instance servers'(dev 和 locahost 服务器)正在工作,但当 redis 服务器是另一台服务器时却没有。芹菜任务工作正常,但没有得到结果。我在尝试获取任务结果时遇到以下错误:
Error 111 connecting to localhost:6379. Connection refused.
使它起作用的原因只是将该设置添加到 Django:
CELERY_RESULT_BACKEND = 'redis://10.10.10.10:6379/0'
好像如果这个参数不存在,它会默认到 localhost 来获取任务的结果。
我有一个使用 Django 的 Web 应用程序,我正在使用 Celery 处理一些异步任务。
对于 Celery,我使用 Rabbitmq 作为代理,Redis 作为结果后端。
Rabbitmq 和 Redis 运行 在同一个 Ubuntu 14.04 服务器上托管在本地虚拟机上。
Celery worker 在远程机器上 运行 (Windows 10)(Django 服务器上没有 worker 运行)。
我有三个问题(我认为它们在某种程度上是相关的!)。
- 无论任务成功还是失败,任务都停留在'PENDING'状态。
- 任务失败时不会重试。我在尝试重试时收到此错误:
reject requeue=False: [WinError 10061] No connection could be made because the target machine actively refused it
- 结果后端似乎不起作用。
我也对我的设置感到困惑,我不知道这个问题可能来自哪里!
到目前为止,这是我的设置:
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)
在工作人员方面,我有一个文件 '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)
不过我注意到的是:
- 当我将工作人员中的代理设置更改为错误密码时,出现无法连接到代理错误。
- 当我将 workers 中的结果后端设置更改为错误密码时,它运行正常,就好像一切正常。
是什么导致了我这些问题?
编辑
在我的 Redis 服务器上,我已经启用了远程连接
/etc/redis/redis.conf
... 绑定 0.0.0.0 ...
我猜你的问题出在密码上。
您的密码中有 @
,这可以解释为 user:pass
和 host
部分之间的分隔符。
工作人员处于待定状态,因为他们无法正确连接到代理。 来自芹菜的文档 http://docs.celeryproject.org/en/latest/userguide/tasks.html#pending
PENDING Task is waiting for execution or unknown. Any task id that is not known is implied to be in the pending state.
在我的设置中添加 CELERY_STORE_ERRORS_EVEN_IF_IGNORED = True
为我解决了这个问题。
我有一个设置,其中 'single instance servers'(dev 和 locahost 服务器)正在工作,但当 redis 服务器是另一台服务器时却没有。芹菜任务工作正常,但没有得到结果。我在尝试获取任务结果时遇到以下错误:
Error 111 connecting to localhost:6379. Connection refused.
使它起作用的原因只是将该设置添加到 Django:
CELERY_RESULT_BACKEND = 'redis://10.10.10.10:6379/0'
好像如果这个参数不存在,它会默认到 localhost 来获取任务的结果。