我在使用 Celery、Redis 和 Django 时遇到问题

Posted

技术标签:

【中文标题】我在使用 Celery、Redis 和 Django 时遇到问题【英文标题】:I have problem using Celery, Redis and Django 【发布时间】:2019-12-08 18:06:23 【问题描述】:

我正在尝试使用它们来创建一个简单的任务。

但是,在任务执行后不久就会发生错误。

我将在下面指定一部分代码以便更好地理解。感谢您的关注。

CELERY_BROKER_URL = 'redis://:password@REDIS:6379/0'
CELERY_RESULT_BACKEND = 'redis://REDIS:6379/0'
CELERY_ACCEPT_CONTENT = ['application/json']
CELERY_RESULT_SERIALIZER = 'json'
CELERY_TASK_SERIALIZER = 'json'
CELERY_TIMEZONE = 'America/Recife'
CELERY_BEAT_SCHEDULE = 
    'task-send': 
        'task': 'app.tasks.task_send_email',
        'schedule': crontab(hour=5, minute=44)
    

控制台芹菜

[config]
app:         sistema:0x7fa254a5d6f4
transport:   redis://:**@redis:6379/0
results:     redis://redis:6379/0
concurrency: 1 (prefork)
task events: OFF (enable -E to monitor tasks in this worker)

[queues]
exchange=celery(direct) key=celery

[tasks]
app.tasks.task_send_email

INFO/MainProcess] Connected to redis://:**@redis:6379/0
INFO/MainProcess] mingle: searching for neighbors
INFO/MainProcess] mingle: all alone

执行任务后出现错误

RuntimeWarning: Exception raised outside body: ResponseError('NOAUTH Authentication required.',):

任务未完成。

【问题讨论】:

【参考方案1】:

考虑到您的结果后端 URL 没有身份验证令牌,并且您使用显然期望它的同一台服务器,我认为发生的情况如下:您可以成功运行任务(因为后端 URL 是正确的),但是一旦任务运行,Celery 会尝试存储结果(在结果后端),但是由于结果后端 URL 无效(redis://redis:6379/0,应该类似于代理,即redis://:**@redis:6379/1 - 使用不同的数据库名称) Celery 抛出异常,因为它无法连接到 Redis(NOAUTH Authentication required 来自 Redis 服务器)。

假设您的 Redis 服务器是 redis.local,而您的 Redis 身份验证令牌是 my53cr3tt0ken。你的 Celery 配置应该有这两个:

broker_url = "redis://:my53cr3tt0ken@redis.local:6379/0"
celery_result_backend = "redis://:my53cr3tt0ken@redis.local:6379/1"

请注意,我为代理和结果后端使用不同的数据库 - 我建议您也这样做。

如果你的 Redis 加密通信,那么你应该使用rediss://...

【讨论】:

两种方法都试过了,还是不行。 redis://:**@redis:6379/1 和 redis://:**@celerydb:6379/1 必须由 CELERY_BROKER_URL = 'redis://:**@REDIS:6379/0' CELERY_RESULT_BACKEND = 'redis://REDIS:6379/1' ? Celery 4.0 及以上版本使用小写配置变量。我已经更新了答案给你更多的细节,看看...

以上是关于我在使用 Celery、Redis 和 Django 时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章

将使用 Celery 和 Redis 的 Flask 应用程序部署到 AWS:直接使用 Elastic Beanstalk 还是 EC2?

如何限制 django 网站的 redis/celery 任务?

django_celery_beat

Celery、Redis 和 ConnectionPool

数字海洋应用平台上的 Django Celery 与 Redis 问题

如何使用ssl设置Docker redis容器