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

Redis/Celery/Django/Kombu连接异常:无法执行Celery任务

解决Celery+Flower Kombu连接拒绝(Errno 111)问题

核心问题定位

从错误日志中的kombu/transport/pyamqp.py调用栈可以明确:你的Celery实际使用的是RabbitMQ作为Broker,而非你配置的Redis。这直接导致连接被拒绝(大概率是RabbitMQ未启动、未配置或端口未开放),和你声称的“Redis配置核对一致”矛盾,说明Redis配置未正确加载到Celery中。

排查与解决步骤

1. 强制验证Celery的Broker配置

  • 在你的Celery应用代码中添加打印语句,确认实际生效的Broker地址:
    from celery import Celery
    
    app = Celery('your_app')
    app.config_from_object('your_config_module')
    print(f"当前Broker配置: {app.conf.broker_url}")  # 检查输出是否为Redis地址
    
  • 启动Celery时显式指定Broker,覆盖可能的配置问题:
    celery -A your_app worker --loglevel=debug --broker=redis://<redis-host>:<redis-port>/<db-number>
    
  • 启动Flower时必须同步指定相同的Broker:
    flower -A your_app --broker=redis://<redis-host>:<redis-port>/<db-number>
    

2. 验证Redis服务的可访问性

  • 在Celery运行的服务器上,用Redis客户端直接测试连接:
    redis-cli -h <redis-host> -p <redis-port>
    # 输入PING,返回PONG则表示连接正常
    
  • 检查Redis配置文件(redis.conf):
    • 确保bind参数不是仅绑定127.0.0.1(如果Celery和Redis不在同一容器/主机,需改为0.0.0.0或允许访问的IP)
    • 确认protected-mode已关闭(或配置了密码/允许的IP)
  • 检查服务器防火墙/安全组,确保Redis默认端口6379对Celery所在地址开放

3. 修复配置加载问题

  • 检查配置文件路径是否正确,确保Celery启动时能读取到你的Redis配置
  • 排查环境变量:是否有CELERY_BROKER_URL环境变量覆盖了代码中的配置
  • 确认虚拟环境一致性:Celery和Flower必须使用同一虚拟环境,避免依赖版本冲突

4. 解决Flower事件连接错误

错误日志中触发点是enable_events,需确保:

  • 启动Celery Worker时添加--events参数,开启事件系统:
    celery -A your_app worker --loglevel=info --events --broker=redis://<redis-host>:<redis-port>/0
    
  • 检查Flower是否有权限访问Celery的事件队列

5. 输出任务ID的方法

在提交任务时直接获取并打印任务ID:

# 提交任务时
task = update_sendgrid_contact.delay(contact_data)
print(f"任务已提交,ID: {task.id}")

# 或在任务函数内部获取
@app.task
def update_sendgrid_contact(contact_data):
    print(f"当前任务ID: {update_sendgrid_contact.request.id}")
    # 执行Sendgrid API逻辑

内容的提问来源于stack exchange,提问作者Jeff Roszell

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 23:27:00