Django1.x使用Celery+redis哨兵模式
已于 2025年07月24日 23:54 修改
访问次数:0
好的!下面是针对 Django 1.11 + Celery 4.4 + Kombu 4.6 + redis-py 3.5 + Redis Sentinel 的完整配置示例,包括 celery.py 和必要的说明,确保你能正确连接 Redis Sentinel 作为 Broker。
一、安装依赖
pip install Django==1.11.29
pip install celery==4.4.7
pip install kombu==4.6.11
pip install redis==3.5.3
二、项目结构(示例)
apitest/
├── __init__.py
├── celery.py # Celery 配置文件
├── settings.py # Django 设置
├── tasks.py # 你的任务
└── ...
三、celery.py
from __future__ import absolute_import
import os
from celery import Celery
from redis.sentinel import Sentinel
# 设置 Django settings 模块
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'apitest.settings')
# 通过 Redis Sentinel 发现主节点
sentinel = Sentinel(
[('43.166.2.211', 26379), ('sentinel2_host', 26379), ('sentinel3_host', 26379)],
socket_timeout=0.1,
password='tq113211', # Redis 密码,如果无密码则去掉
)
# 获取当前主节点地址
master = sentinel.discover_master('mymaster')
redis_host, redis_port = master
# 构造 broker URL
broker_url = 'redis://:{}@{}:{}/0'.format('tq113211', redis_host, redis_port)
app = Celery('apitest', broker=broker_url)
# 从 Django settings.py 中加载配置(命名空间 CELERY)
app.config_from_object('django.conf:settings')
# 自动发现所有 app 中 tasks.py 文件里的任务
app.autodiscover_tasks()
# 可选:定义一个任务,方便测试
@app.task(bind=True)
def debug_task(self):
print('Request: {0!r}'.format(self.request))
四、在 apitest/__init__.py 中加入
from .celery import app as celery_app
__all__ = ['celery_app']
这样 -A apitest 时,Celery CLI 能找到 app 实例。
五、Django settings.py 相关配置示例
# Celery 配置
CELERY_ACCEPT_CONTENT = ['json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_BACKEND = 'redis://:tq113211@43.166.2.211:6379/1' # 结果存储,可以和 broker 不同端口
CELERY_TIMEZONE = 'Asia/Shanghai'
CELERY_ENABLE_UTC = False
六、任务示例 tasks.py
from celery import shared_task
@shared_task
def add(x, y):
return x + y
七、启动命令
Windows 开发环境(单线程池,避免权限问题):
celery -A apitest worker --loglevel=info --pool=solo
Linux 生产环境(多进程):
celery -A apitest worker --loglevel=info
八、总结说明
- Redis Sentinel 的主节点地址由 redis.sentinel.Sentinel 自动发现并写入 broker_url,避免写死 IP。
- Celery 4.4 + Kombu 4.6 + redis-py 3.5 完美支持这种方式。
- 你需要保证 Redis Sentinel 集群和主节点名称 mymaster 正确无误。
- 任务调度和结果存储可用 Redis 的不同数据库或节点。
如果你需要,我还能帮你写 celery beat 定时任务配置或 Django 集成示例,告诉我哦!
评论(0)