У меня есть веб-приложение, использующее 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 ...