You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确使用AWS Redis Cluster作为Celery消息代理?

AWS Redis Cluster 作为Celery消息代理的端口转换错误

错误信息

ValueError: Couldn't import '<module_name>': Port could not be cast to integer value as '<redis_host>:6379'

我的配置尝试

初始配置(触发报错)

REDIS_ENDPOINT = config('REDIS_ENDPOINT')  # 格式应为 'hostname:port'
REDIS_HOST, REDIS_PORT = REDIS_ENDPOINT.split(':')
redis_url = f'redis://{REDIS_HOST}:{REDIS_PORT}'

app.conf.update(
    broker_url=redis_url,
    # worker_concurrency=1,
    worker_prefetch_multiplier=worker_prefetch_multiplier,
)

可正常工作的Django配置

REDIS_HOST, REDIS_PORT = REDIS_ENDPOINT.split(':')

CACHES = {
    'default': {
        'BACKEND': 'django_redis.cache.RedisCache',
        'LOCATION': f'redis://{REDIS_HOST}:{REDIS_PORT}/0',
        'OPTIONS': {
            'CLIENT_CLASS': 'django_redis.client.DefaultClient',
        },
        'KEY_PREFIX': 'my_cache',
        'TIMEOUT': CACHE_TTL,  # 使用CACHE_TTL设置缓存超时
    }
}

使用redis-py-cluster的尝试(仍失败)

REDIS_ENDPOINT = config('REDIS_ENDPOINT')  # 格式应为 'hostname:port'
REDIS_HOST, REDIS_PORT = REDIS_ENDPOINT.split(':')
redis_broker = Redis(host=REDIS_HOST, port=REDIS_PORT)
REDIS_NODES = [{"host": REDIS_HOST, "port": REDIS_PORT}]

app.conf.update(
    broker=redis_broker,
    # result_backend=result_backend,
    broker_url='redis://',
    broker_transport_options={
        'master_name': 'mymaster',
        'startup_nodes': REDIS_NODES
    },    # result_backend=result_backend,
    # worker_concurrency=1,
    worker_prefetch_multiplier=worker_prefetch_multiplier,
)

直接使用redis库的尝试(同样报错)

REDIS_ENDPOINT = config('REDIS_ENDPOINT')  # 格式应为 'hostname:port'
REDIS_HOST, REDIS_PORT = REDIS_ENDPOINT.split(':')
result_backend = f'redis://{REDIS_HOST}:{REDIS_PORT}/0'
broker_url = f'redis://{REDIS_HOST}:{REDIS_PORT}/0'
redis_broker = Redis(host=REDIS_HOST, port=REDIS_PORT)

app.conf.update(
    broker=redis_broker,
    result_backend=result_backend,
    # result_backend=result_backend,
    # worker_concurrency=1,
    worker_prefetch_multiplier=worker_prefetch_multiplier,
)

问题说明

已确认Redis无需密码,端点格式完全正确(同一份端点配置在Django应用中能正常连接),但Celery始终抛出端口无法转换为整数的错误,求可行的解决方法。

解决办法

  • 先强制转换端口为整数:split得到的端口是字符串类型,显式转换后再使用:
REDIS_HOST, REDIS_PORT = REDIS_ENDPOINT.split(':')
REDIS_PORT = int(REDIS_PORT)  # 强制转为整数类型

(注:Django能正常工作,大概率不是这个问题,但可以先排查排除)

  • 安装Celery的Redis Cluster支持库:Celery默认不兼容Redis Cluster,需安装专用依赖:
pip install celery-redis-cluster

然后使用集群专属配置:

REDIS_ENDPOINT = config('REDIS_ENDPOINT')
REDIS_HOST, REDIS_PORT = REDIS_ENDPOINT.split(':')
REDIS_PORT = int(REDIS_PORT)

app.conf.update(
    broker_url=f'redis://{REDIS_HOST}:{REDIS_PORT}/0',
    broker_transport='rediscluster',
    broker_transport_options={
        'startup_nodes': [{'host': REDIS_HOST, 'port': REDIS_PORT}],
        # 仅哨兵模式需要master_name,普通Redis Cluster无需添加
    },
    worker_prefetch_multiplier=worker_prefetch_multiplier,
)
  • 避免直接传入Redis实例:Celery优先识别URL格式的代理配置,直接传入Redis实例容易触发内部解析错误,建议只用broker_url参数配置代理。

  • 检查集群节点完整性:AWS Redis Cluster可能包含多个节点,若单个节点配置无效,可将所有集群节点地址添加到startup_nodes列表中,让Celery客户端自动发现整个集群。

内容的提问来源于stack exchange,提问作者Burak Üren

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 10:35:15