分布式Celery

125 阅读2分钟

Celery

分布式任务调度框架。由5大基本组件构成:生产者,消息队列,执行者,结果队列,定时调度器。

需要注意的是worker可不依赖beat,单独使用 worker 就能处理即时提交的任务delay()apply_async()

如何构建celery集群

在小型任务量上,但为了解耦。可以将消息队列,调度器,执行者统统部署在一个服务器上。基本要8G内存才不会导致服务器运行卡顿。下文主要基于3台服务器实现百万级的任务调度处理。

服务器规划

服务器主要角色推荐配置运行服务
服务器1任务调度中心2核4GCelery Beat + Redis/MQ主节点
服务器2任务处理节点4核8GCelery Worker + Redis从节点
服务器3任务处理节点+备用调度4核8GCelery Worker + Redis从节点

消息队列选择

# 在所有服务器安装Redis
sudo apt-get install redis-server -y

# 服务器1(主节点)配置
sudo vim /etc/redis/redis.conf
# 修改以下参数:
bind 0.0.0.0
requirepass yourpassword
masterauth yourpassword
appendonly yes

为何在redis中没有使用集群,其实在业务中对redis要求不高,主要作用是中转,完全没有必要做哨兵模式或者主从架构

python环境选择

# 所有服务器
python -m venv /opt/celery_env
source /opt/celery_env/bin/activate
pip install celery redis flower

下一个简单的脚本

from celery import Celery
from .config import BROKER_URL, RESULT_BACKEND

app = Celery('proj',
             broker=BROKER_URL,
             backend=RESULT_BACKEND,
             include=['proj.tasks'])

app.conf.timezone = 'Asia/Shanghai'
app.conf.enable_utc = True

app.conf.task_routes = {
    'proj.tasks.*_high': {'queue': 'high_priority'},
    'proj.tasks.*_low': {'queue': 'low_priority'}
}

app.conf.beat_schedule = {
    'daily-report': {
        'task': 'proj.tasks.generate_report',
        'schedule': crontab(hour=23, minute=30),
        'options': {'queue': 'high_priority'}
    }
}

服务启动

启动调度中心【服务器1】
sudo systemctl start redis-server

# 启动Celery Beat
celery -A proj beat -l INFO --pidfile=/var/run/celerybeat.pid \
       --scheduler=redbeat.RedBeatScheduler \
       --redbeat_redis_url=redis://:yourpassword@服务器1:6379/0

# 启动监控面板
flower -A proj --port=5555 --broker=redis://:yourpassword@服务器1:6379/0
启动任务执行者【服务器1,2号】
celery -A proj worker -l INFO -c 8 -Q high_priority,low_priority \
       --autoscale=4,12 \
       --without-gossip \
       --without-mingle \
       --without-heartbeat

celery的核心应用

队列分类
# proj/celery.py
app.conf.task_routes = {
    'orders.*': {'queue': 'orders'},
    'logs.*': {'queue': 'logs'}
}

# 启动专用Worker
# 终端1:处理订单
celery -A proj worker -Q orders -c 4 -l INFO

# 终端2:处理日志 
celery -A proj worker -Q logs -c 2 -l INFO

分解解释:
celery:调用 Celery 命令行工具
-A proj:指定 Celery 应用所在的模块,这里是指 proj 模块(通常是包含 celery.py 的 Python 包)
worker:表示要启动工作进程
-Q logs:指定这个 worker 只处理名为 logs 的队列中的任务
-c 2:设置并发 worker 数量为 2(即同时处理 2 个任务)
-l INFO:设置日志级别为 INFO