Heroku + Celery - 连接被拒绝
Heroku + Celery - Connection Refused
我在 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.
简介:
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
的命令相同
我也尝试手动将代理和后端 urls 设置为 Heroku Redis url redis://:p8... .amazonaws.com:1...
,但我收到了同样的错误。
更改配置变量修复了这个问题:
CELERY_BROKER_URL
-> BROKER_URL
CELERY_BACKEND_URL
-> CELERY_RESULT_BACKEND
中有描述
但是,这些配置变量并未根据 Celery documentation 进行更新。在那里,建议使用 broker_url
和 result_backend
,您将收到使用其他变量名称的弃用警告。
我在 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.
简介:
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
我也尝试手动将代理和后端 urls 设置为 Heroku Redis url redis://:p8... .amazonaws.com:1...
,但我收到了同样的错误。
更改配置变量修复了这个问题:
CELERY_BROKER_URL
-> BROKER_URL
CELERY_BACKEND_URL
-> CELERY_RESULT_BACKEND
但是,这些配置变量并未根据 Celery documentation 进行更新。在那里,建议使用 broker_url
和 result_backend
,您将收到使用其他变量名称的弃用警告。