Celery
分布式任务调度框架。由5大基本组件构成:生产者,消息队列,执行者,结果队列,定时调度器。
需要注意的是worker可不依赖beat,单独使用 worker 就能处理即时提交的任务
delay()或apply_async()
如何构建celery集群
在小型任务量上,但为了解耦。可以将消息队列,调度器,执行者统统部署在一个服务器上。基本要8G内存才不会导致服务器运行卡顿。下文主要基于3台服务器实现百万级的任务调度处理。
服务器规划
| 服务器 | 主要角色 | 推荐配置 | 运行服务 |
|---|---|---|---|
| 服务器1 | 任务调度中心 | 2核4G | Celery Beat + Redis/MQ主节点 |
| 服务器2 | 任务处理节点 | 4核8G | Celery Worker + Redis从节点 |
| 服务器3 | 任务处理节点+备用调度 | 4核8G | Celery 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