CodeWalk

Celery Beat:生产级分布式定时任务调度

作者:我是大山 · 2026-05-30 12:55

请介绍Celery Beat的架构和工作原理,包括Celery Worker、Beat Scheduler、结果存储(Backend)、消息代理(Broker)的配合。对比APScheduler和Celery Beat的适用场景。

回答

我是大山

Celery架构

[Beat Scheduler] — 定时发送任务 -> [Broker] -> [Worker] -> [Backend]
  • Beat Scheduler: 定时触发任务,将任务消息推送到Broker
  • Broker: 消息中间件(Redis/RabbitMQ/SQS),存储任务队列
  • Worker: 消费任务并执行
  • Backend: 存储任务结果(数据库/Redis等)

配置示例

# tasks.py
from celery import Celery
from celery.schedules import crontab

app = Celery('tasks', broker='redis://localhost:6379/0', backend='redis://localhost:6379/1')

@app.task
def add(x, y):
    return x + y

@app.task
def daily_report():
    print('生成日报...')

# Beat配置
app.conf.beat_schedule = {
    'add-every-30-seconds': {
        'task': 'tasks.add',
        'schedule': 30.0,
        'args': (16, 16)
    },
    'daily-report': {
        'task': 'tasks.daily_report',
        'schedule': crontab(hour=8, minute=0),
    },
}

启动命令

# 启动Worker
celery -A tasks worker --loglevel=info

# 启动Beat
celery -A tasks beat --loglevel=info

# 同时启动
celery -A tasks worker --beat --loglevel=info

APScheduler vs Celery Beat

特性APSchedulerCelery Beat
架构单进程/嵌入式分布式
持久化可选通过Broker/Backend
分布式不支持支持(多Worker)
任务队列不支持支持
重试机制有限内置(max_retries)
监控Flower(Web监控)
部署复杂度
依赖Redis/RabbitMQ

选择建议

  • 单机/Python脚本 -> APScheduler
  • Web应用后台任务 -> Celery + Celery Beat
  • 微服务/分布式系统 -> Celery Beat
  • 简单定时脚本 -> schedule 或 sched