【发布时间】:2020-01-12 07:24:53
【问题描述】:
我们正在使用 Flower 来监控 Celery 任务,并在我们的项目中使用 Redis 作为代理。
当我们使用 SSL 配置 Redis 作为代理时,在代理选项卡中我们可以看到下一条消息:
不支持'redis'代理
我们尝试(并成功)通过下一个 URL 从 Celery 连接到 Redis:
rediss://{REDIS_HOST}:{REDIS_PORT}/{REDIS_DB_NAME}?{SSL_OPTIONS}
如 Celery 文档中所示。
此外,我们尝试了 --broker 和 --broker_api 参数,结果相同。
工作人员和任务工作正常(在工作人员内部,代理正常显示)但代理选项卡为空。
如果我们查看 Celery 代码,我们会发现 Celery 如何管理 url 解析以设置 Redis 作为代理的 ssl 选项和配置:
if scheme == 'redis':
# If connparams or query string contain ssl params, raise error
if (any(key in connparams for key in ssl_param_keys) or
any(key in query for key in ssl_param_keys)):
raise ValueError(E_REDIS_SSL_PARAMS_AND_SCHEME_MISMATCH)
if scheme == 'rediss':
connparams['connection_class'] = redis.SSLConnection
# The following parameters, if present in the URL, are encoded. We
# must add the decoded values to connparams.
for ssl_setting in ssl_param_keys:
ssl_val = query.pop(ssl_setting, None)
if ssl_val:
connparams[ssl_setting] = unquote(ssl_val)
如果我们查看 Flower 代码,我们可以发现 Flower 如何管理 url 解析以设置代理:
class Broker(object):
def __new__(cls, broker_url, *args, **kwargs):
scheme = urlparse(broker_url).scheme
if scheme == 'amqp':
return RabbitMQ(broker_url, *args, **kwargs)
elif scheme == 'redis':
return Redis(broker_url, *args, **kwargs)
elif scheme == 'redis+socket':
return RedisSocket(broker_url, *args, **kwargs)
else:
raise NotImplementedError
如我们所见,Flower 似乎不支持带 SSL 的 Redis(仅支持 redis,不支持 redis)。
这是真的吗?有什么方法可以在 Celery 和 Flower 中使用 redis 连接 Redis 或使用 SSL 连接 Redis 而不使用 redis?
谢谢!
【问题讨论】:
标签: redis django-celery flower