我正在尝试将 Amazon SQS 设置为 Django 应用程序中 Celery 的默认消息代理。您可以在下面找到我的工人的输出。
以下是我在项目中的一些配置。我的 celery.py 如下所示:
from __future__ import absolute_import
import os
from celery import Celery
# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'dance.settings')
app = Celery('dance')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()
@app.task(bind=True)
def debug_task(self):
print('Request: {0!r}'.format(self.request))
负责设置代理 url 的 Django 芹菜设置的基本部分是:
BROKER_URL = 'sqs://{}:{}@'.format(AWS_ACCESS_KEY_ID, quote(AWS_SECRET_ACCESS_KEY, safe=''))
BROKER_TRANSPORT_OPTIONS = {
'region': 'eu-west-1',
'polling_interval': 3,
'visibility_timeout': 300,
'queue_name_prefix':'dev-celery-',
}
当我尝试在虚拟环境中启动 worker 时:
celery -A dance worker -l info
我收到以下输出:
-------------- celery@universe v4.0.0 (latentcall)
---- **** -----
--- * *** * -- Linux-4.8.0-28-generic-x86_64-with-debian-stretch-sid 2016-12-02 14:20:40
-- * - **** ---
- ** ---------- [config]
- ** ---------- .> app: dance:0x7fdc592ca9e8
- ** ---------- .> transport: amqp://guest:**@localhost:5672//
- ** ---------- .> results:
- *** --- * --- .> concurrency: 8 (prefork)
-- ******* ---- .> task events: OFF (enable -E to monitor tasks in this worker)
--- ***** -----
-------------- [queues]
.> celery exchange=celery(direct) key=celery
[tasks]
...
task1
task2
...
列出了任务,所以我猜 Celery 会获取并处理相关的 Django 设置。如果要将设置从 SQS 切换到 Redis,我会遇到同样的问题。
正如我从阅读教程中了解到的那样,工人的输出应该看起来很相似。
- ** ---------- .> transport: sqs://*redacted*:**@localhost//
- ** ---------- .> results: djcelery.backends.database:DatabaseBackend
此外,我也没有使用过时的djcelery
。相反,我正在使用django_celery_results
,因为它在 Celery 设置页面上推荐。最后一个输出只是来自副项目的猜测。
我发现的唯一可能的解决方案是显式指定代理和数据库后端。
对我来说,这看起来很奇怪,因为 Django settings.py 中的设置没有完全加载,或者我可能错过了一些东西,否则它是 Celery 的错误。
app = Celery('dance', broker='sqs://', backend='django-db')
真正的解决方案:
这就是我遇到问题的原因:
Django 中的所有 Celery 变量都应该从 CELERY 开始,所以我不得不使用 CELERY_BROKER_URL 和 CELERY_BROKER_TRANSPORT_OPTIONS,而不是使用 BROKER_URL 和 BROKER_TRANSPORT_OPTIONS
不正确:使用 CELERY 命名空间时需要使用CELERY_BROKER_URL。但默认情况下,某些选项带有 CELERY 前缀,例如 CELERY_RESULT_BACKEND。如果使用 CELERY 命名空间,则需要编写CELERY_CELERY_RESULT_BACKEND。