Подтвердить что ты не робот

Результат использования сельдерея (Redis) не работает

У меня есть веб-приложение, использующее Django, и я использую Celery для обработки асинхронных задач.

Для сельдерея я использую Rabbitmq в качестве брокера, а Redis - как результат.

Rabbitmq и Redis работают на одном сервере Ubuntu 14.04, размещенном на локальной виртуальной машине.

Работники сельдерея работают на удаленных машинах (Windows 10) (на сервере Django не работает).

У меня три проблемы (я думаю, что они как-то связаны!).

  • Задачи остаются в состоянии "PENDING" независимо от того, выполняются или не выполняются задачи.
  • задачи не будут выполняться при неудачной попытке. и я получаю эту ошибку при попытке повторить попытку:

reject requeue = False: [WinError 10061] Соединение не может быть выполнено потому что целевая машина активно отказалась от нее.

  1. Бэкэнд результатов не работает.

Я также смущен о моих настройках, и я точно не знаю, откуда могут возникнуть эти проблемы!

так вот мои настройки:

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 ...

4b9b3361

Ответ 1

Я предполагаю, что ваша проблема заключается в пароле. В вашем пароле есть @, который может быть интерпретирован как разделитель между разделами user:pass и host.

Рабочие остаются в ожидании, потому что они не могут правильно подключиться к брокеру. Из документации сельдерея http://docs.celeryproject.org/en/latest/userguide/tasks.html#pending

ОЖИДАНИЕЗадача ждет выполнения или неизвестна. Любой идентификатор задачи, который неизвестен, подразумевается, что он находится в состоянии ожидания.

Ответ 2

Добавление CELERY_STORE_ERRORS_EVEN_IF_IGNORED = True в мои настройки разрешило эту проблему для меня.