Результат использования сельдерея (Redis) не работает
У меня есть веб-приложение, использующее Django, и я использую Celery для обработки асинхронных задач.
Для сельдерея я использую Rabbitmq в качестве брокера, а Redis - как результат.
Rabbitmq и Redis работают на одном сервере Ubuntu 14.04, размещенном на локальной виртуальной машине.
Работники сельдерея работают на удаленных машинах (Windows 10) (на сервере Django не работает).
У меня три проблемы (я думаю, что они как-то связаны!).
- Задачи остаются в состоянии "PENDING" независимо от того, выполняются или не выполняются задачи.
- задачи не будут выполняться при неудачной попытке. и я получаю эту ошибку при попытке повторить попытку:
reject requeue = False: [WinError 10061] Соединение не может быть выполнено потому что целевая машина активно отказалась от нее.
- Бэкэнд результатов не работает.
Я также смущен о моих настройках, и я точно не знаю, откуда могут возникнуть эти проблемы!
так вот мои настройки:
my_app/settings.py
# region Celery Settings
CELERY_CONCURRENCY = 1
CELERY_ACCEPT_CONTENT = ['json']
# CELERY_RESULT_BACKEND = 'redis://:[email protected]@[email protected]:6379/0'
BROKER_URL = 'amqp://soufiaane:[email protected]@[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 = "[email protected]@lue2016"
REDIS_CONNECT_RETRY = True
AMQP_SERVER = "cvc.ma"
AMQP_PORT = 5672
AMQP_USER = "soufiaane"
AMQP_PASSWORD = "[email protected]@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:[email protected]@[email protected]/cvcHost', backend='redis://:[email protected]@[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))
my_app__init __. Ру
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", который имеет фактическую реализацию задачи:
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:[email protected]@[email protected]/cvcHost', backend='redis://:[email protected]@[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)
я заметил, что это:
- когда я меняю настройки брокера у своих работников на плохой пароль, я не могу подключиться к ошибке брокера.
- когда я изменяю настройки бэкэнда результата у моих работников на плохой пароль, он работает нормально, как будто все в порядке.
Что может быть причиной моих проблем?
ИЗМЕНИТЬ
на моем сервере Redis, я уже включил удаленное соединение
/etc/redis/redis.conf
...
bind 0.0.0.0
...
Ответы
Ответ 1
Я предполагаю, что ваша проблема заключается в пароле.
В вашем пароле есть @
, который может быть интерпретирован как разделитель между разделами user:pass
и host
.
Рабочие остаются в ожидании, потому что они не могут правильно подключиться к брокеру.
Из документации сельдерея
http://docs.celeryproject.org/en/latest/userguide/tasks.html#pending
ОЖИДАНИЕЗадача ждет выполнения или неизвестна. Любой идентификатор задачи, который неизвестен, подразумевается, что он находится в состоянии ожидания.
Ответ 2
Добавление CELERY_STORE_ERRORS_EVEN_IF_IGNORED = True
в мои настройки разрешило эту проблему для меня.