【问题标题】:Django + Celery + SQS setup. Celery connects to default RabbitMQ via ampqDjango + Celery + SQS 设置。 Celery 通过 ampq 连接到默认的 RabbitMQ
【发布时间】:2017-04-17 07:31:07
【问题描述】:

我正在尝试将 Amazon SQS 设置为 Django 应用程序中 Celery 的默认消息代理。 Celery worker 正在启动,但代理设置为默认 RabbitMQ。您可以在下面找到我的工人的输出。

这是我在项目中的一些配置。我的 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 celery 设置的基本部分是:

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-',
}

当我尝试在虚拟环境中启动工作人员时:

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,我会遇到同样的问题。

据我从阅读教程中了解到,worker 的输出应该类似于。

- ** ---------- .> transport:   sqs://*redacted*:**@localhost//
- ** ---------- .> results:     djcelery.backends.database:DatabaseBackend

我也没有使用djcelery,因为它已经过时了。相反,我使用django_celery_results,因为它在 Celery 设置页面上被推荐。最后的输出只是来自项目的猜测。

【问题讨论】:

    标签: python django celery


    【解决方案1】:

    我找到的唯一可能的解决方案是明确指定代理和数据库后端。

    对我来说这看起来很奇怪,因为来自 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

    【讨论】:

      【解决方案2】:

      错误:使用 CELERY 命名空间时需要使用 CELERY_BROKER_URL。但有些选项默认带有 CELERY 前缀,例如 CELERY_RESULT_BACKEND。如果你使用 CELERY 命名空间那么你需要写 CELERY_CELERY_RESULT_BACKEND。

      【讨论】:

        猜你喜欢
        • 2019-01-25
        • 2022-10-17
        • 1970-01-01
        • 2020-03-04
        • 2021-12-08
        • 1970-01-01
        • 2011-07-18
        • 2011-07-17
        • 1970-01-01
        相关资源
        最近更新 更多