Heroku + Celery - 拒绝连接

Posted

技术标签:

【中文标题】Heroku + Celery - 拒绝连接【英文标题】:Heroku + Celery - Connection Refused 【发布时间】:2021-12-04 13:34:17 【问题描述】:

我在 Heroku 上部署了一个 Flask 应用程序。我正在尝试使用 Redis 作为消息代理来设置 Celery。

heroku 日志中出现此错误:

2021-10-16T15:08:12.851586+00:00 app[worker.1]: [2021-10-16 15:08:12,851: ERROR/MainProcess] consumer: Cannot connect to amqp://guest:**@127.0.0.1:5672//: [Errno 111] Connection refused.

Procfile: worker: celery -A my_app.celery worker --loglevel=debug

Heroku Redis 插件已安装,我使用此命令启动 dyno:heroku ps:scale worker=1

app/__init__.py

...
from extensions import celery

...

def create_app(config_class=Config):
    app = Flask(__name__)
    app.config.from_object(Config)

    ...

    celery.init_app(app)

app/extensions.py

import flask
from celery import Celery

class FlaskCelery(Celery):
    def __init__(self, *args, **kwargs):

        super(FlaskCelery, self).__init__(*args, **kwargs)
        self.patch_task()

        if 'app' in kwargs:
            self.init_app(kwargs['app'])

    def patch_task(self):
        TaskBase = self.Task
        _celery = self

        class ContextTask(TaskBase):
            abstract = True

            def __call__(self, *args, **kwargs):
                if flask.has_app_context():
                    return TaskBase.__call__(self, *args, **kwargs)
                else:
                    with _celery.app.app_context():
                        return TaskBase.__call__(self, *args, **kwargs)

        self.Task = ContextTask

    def init_app(self, app):
        self.app = app
        self.config_from_object(app.config)


celery = FlaskCelery()

config.py

class Config(object):
    ...
    
    CELERY_BROKER_URL = os.environ.get('REDIS_URL') or 'redis://localhost:6379/0'
    CELERY_BACKEND_URL = os.environ.get('REDIS_URL') or 'redis://localhost:6379/0'
    ...

我想知道我是否在 Procfile 中使用了错误的命令。 Heroku documentation 建议使用 worker: celery worker --app=tasks.app,但这会产生错误,指出语法已过时。我正在使用的命令与我在本地运行以启动 celery worker 的命令相同

我还尝试将代理和后端 url 手动设置为 Heroku Redis url redis://:p8... .amazonaws.com:1...,但我收到了同样的错误。

【问题讨论】:

“ampq”表明存在配置问题。您确定这些配置变量吗?我使用broker_urlresult_backend。见docs.celeryproject.org/en/stable/userguide/… 是的,这似乎解决了问题,但 Heroku 配置变量与 Celery 文档中推荐的不同 【参考方案1】:

更改配置变量可解决此问题:

CELERY_BROKER_URL -> BROKER_URL

CELERY_BACKEND_URL -> CELERY_RESULT_BACKEND

这在Heroku Documentation中有描述

但是,这些配置变量不会根据Celery documentation 更新。在那里,建议使用 broker_urlresult_backend,如果使用其他变量名称,您将收到弃用警告。

【讨论】:

以上是关于Heroku + Celery - 拒绝连接的主要内容,如果未能解决你的问题,请参考以下文章

Django/Celery 和 CloudAMQP/Heroku 的连接错误

Heroku/Postgres:引起:java.net.ConnectException:连接被拒绝(连接被拒绝)

将 Celery 与 SQS 一起使用时 Errno 111 连接被拒绝

celery + redis 无法连接到 amqp://guest:**@127.0.0.1:5672//: [Errno 111] 连接被拒绝

Heroku部署,带有MongoDB错误:连接被拒绝

带有 Java ECONNREFUSED 的 Heroku Websockets(连接被拒绝)