我在使用 Celery、Redis 和 Django 时遇到问题
I have problem using Celery, Redis and Django
我在使用 Celery、Redis 和 Django 时遇到问题。
我正在尝试使用它们来创建一个简单的任务。
但是任务刚执行不久就出现错误
我会在下面详细说明部分代码,以便更好understand.I感谢您的关注。
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.',):
任务未完成。
考虑到您的结果后端 URL 没有身份验证令牌,并且您使用显然期望它的同一台服务器,我认为发生的情况如下:您可以成功 运行任务(因为后端 URL 是正确的),但是一旦任务 运行s,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://...
。
我在使用 Celery、Redis 和 Django 时遇到问题。
我正在尝试使用它们来创建一个简单的任务。
但是任务刚执行不久就出现错误
我会在下面详细说明部分代码,以便更好understand.I感谢您的关注。
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.',):
任务未完成。
考虑到您的结果后端 URL 没有身份验证令牌,并且您使用显然期望它的同一台服务器,我认为发生的情况如下:您可以成功 运行任务(因为后端 URL 是正确的),但是一旦任务 运行s,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://...
。