Heroku 应用无法连接到 Celery worker

Heroku app cannot connect to Celery worker

我创建了一个 Django 应用程序,它使用 Celery 进行任务处理。它在本地运行良好,但是当我将其推送到 Heroku 时,我发现应用程序无法连接到 Celery worker。

我可以看到工人 运行 没有任何问题。

$ heroku ps

=== web (Free): gunicorn my_django_project.wsgi --log-file - (1)
web.1: up 2019/08/10 11:54:19 +0530 (~ 1m ago)

=== worker (Free): celery -A my_django_project worker -l info (1)
worker.1: up 2019/08/10 11:54:19 +0530 (~ 1m ago)

但是当我检查日志时,我发现了这个错误信息

2019-08-10T06:04:30.402781+00:00 app[worker.1]: [2019-08-10 06:04:30,402: ERROR/MainProcess] consumer: Cannot connect to amqp://guest:**@127.0.0.1:5672//: [Errno 111] Connection refused.
2019-08-10T06:04:30.402801+00:00 app[worker.1]: Trying again in 32.00 seconds...

应用似乎无法连接到 celery worker。

项目目录结构

Project
|
├── data/
├── db.sqlite3
├── manage.py
├── Procfile
├── README.md
├── requirements.txt
├── my_app/
│   ├── admin.py
│   ├── apps.py
│   ├── __init__.py
│   ├── tasks.py
│   ├── templates
│   ├── tests.py
│   ├── urls.py
│   └── views.py
├── my_django_project/
│   ├── celery.py
│   ├── __init__.py
│   ├── settings.py
│   ├── staticfiles
│   ├── urls.py
│   └── wsgi.py
├── runtime.txt
└── static/

Procfile

web: gunicorn my_django_project.wsgi --log-file -
worker: celery -A my_django_project worker -l info

celery.py

from __future__ import absolute_import, unicode_literals
import os
from celery import Celery

#set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', my_django_project.settings')

app = Celery(my_django_project)

# Using a string here means the worker doesn't have to serialize
# the configuration object to child processes.
# - namespace='CELERY' means all celery-related configuration keys
#   should have a `CELERY_` prefix.
app.config_from_object('django.conf:settings', namespace='CELERY')

# Load task modules from all registered Django app configs.
app.autodiscover_tasks()

@app.task(bind=True)
def debug_task(self):
    print('Request: {0!r}'.format(self.request))

tasks.py

from celery import shared_task

@shared_task
def task1():

   // do stuff

    return results

amqp://guest:**@127.0.0.1:5672指后端celery尝试使用,你需要设置一个后端或者rabbitMQ,Redis或者其他。

The docs

Celery 需要一个发送和接收消息的解决方案;通常这会以称为消息代理的单独服务的形式出现。

你可以选择

  • RabbitMQ
  • Redis
  • Amazon SQS(实验性)

您可以通过在您的 celery 配置中指定一个代理,在 Heroku 中设置之前在本地进行测试,例如:app = Celery('tasks', broker='pyamqp://guest@localhost//')

为此,您需要已经在本地启动了您的代理。

对于 redis 来说: pip install -U "celery[redis]" 然后将代理 url 设置为 redis 数据库的位置(默认 'redis://localhost:6379/0') url 遵循以下格式:redis://:password@hostname:port/db_number

  • 然后 运行 redis-server
  • 然后运行你的芹菜工人
  • 然后启动你的 django 应用程序

一旦您对所有这些感到满意,就可以使用 Heroku 附加组件 select 您选择的经纪人(有很多选择,例如 Redis Cloud)。然后更新您的环境变量以在您的 heroku 环境变量中使用附加后端 url。这将是这样的格式:redis://p%40ssw0rd@redis-16379.someservice.com:PORT_NUMBER/0