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

Django中Celery+SQS配置异常:不遵循broker_transport_options设置

问题

在Django中配置Celery使用AWS SQS作为消息中间件,但Celery始终忽略指定的ap-southeast-2区域和自定义队列,反而在us-east-1自动创建并使用scraperQueue队列。已在ap-southeast-2创建目标队列,相关配置和启动脚本如下:

Celery配置代码:

app = Celery("celery")
CELERY_CONFIG = {
    "task_serializer": "json",
    "accept_content": ["json"],
    "result_serializer": "json",
    "result_backend": None,
    "worker_enable_remote_control": False,
    "task_acks_late": True,
    "worker_prefetch_multiplier": 1,
    "broker_url": broker_url,
    "task_default_queue": "scraperQueue",
    "broker_transport": "sqs",
    "broker_transport_options ": {
            "region": "ap-southeast-2",
            "visibility_timeout": 700,
            "polling_interval": 5,
            'queue_name_prefix': 'celery',
            'predefined_queues': {
                    'scraperQueue': {
                        'url': os.environ.get('SQS_URL'),
                        'access_key_id': os.environ.get('SQS_ACCESS_KEY_ID'),
                        'secret_access_key': os.environ.get('SQS_SECRET_ACCESS_KEY'),
                    }
                }
            },
}
app.conf.update(**CELERY_CONFIG)
app.autodiscover_tasks()

Worker启动命令:

celery -A celery_file worker --loglevel=INFO --concurrency=1 -P solo --logfile=/var/log/celery.log --without-gossip --without-mingle --without-heartbeat -O fair

现象:ap-southeast-2区域的scraperQueue无消息流入,切换到us-east-1区域后,发现Celery自动创建了同名队列并正常收发消息。尝试修改/移除task_default_queue配置、更换区域、重建队列均未解决问题。

解决方法
  • 修复配置键名的语法错误:broker_transport_options 键名末尾多了一个空格,Celery无法识别该配置项,直接忽略了区域和预定义队列的设置, fallback到默认的us-east-1。删掉空格,改为"broker_transport_options":。
  • 检查broker_url的优先级:如果broker_url已包含区域信息(如sqs://ap-southeast-2/)或指向us-east-1的队列URL,会覆盖broker_transport_options中的区域配置。确保broker_url要么不指定区域,要么与目标区域一致,或者直接使用预定义队列的URL。
  • 清理队列前缀干扰:配置中设置了queue_name_prefix: 'celery',这会让Celery实际使用的队列名为celeryscraperQueue,而非你指定的scraperQueue。不需要前缀的话直接移除该配置;需要前缀则确保AWS上的队列名与拼接后的名称一致。
  • 验证预定义队列URL正确性:确认os.environ.get('SQS_URL')返回的是ap-southeast-2区域scraperQueue的完整URL(例如https://sqs.ap-southeast-2.amazonaws.com/1234567890/scraperQueue),且环境变量已正确加载。
  • 重启Worker并核对日志:修改配置后完全停止Celery Worker进程再重新启动,查看启动日志中是否有Connected to sqs://...@ap-southeast-2/类的信息,确认区域和队列加载正确。

内容的提问来源于stack exchange,提问作者Curunir The Colorful

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 04:17:08