使用 `Celery` 配合 `RabbitMQ` 作为消息代理,实现异步任务的调度、重试、定时任务以及错误监控等功能

python基础代码、优化、扩展和监控的完整示例。此示例使用 Celery 配合 RabbitMQ 作为消息代理,实现异步任务的调度、重试、定时任务以及错误监控等功能。


项目结构

我们将项目结构组织如下,以便代码逻辑清晰且易于扩展:

project/
│
├── celery_app.py        # Celery应用的配置和初始化
├── tasks.py             # 异步任务的定义
├── monitor.py           # 异常监控和报警
└── main.py              # 测试异步任务调用

1. celery_app.py - 配置 Celery 应用

python 复制代码
# celery_app.py
from celery import Celery
from celery.schedules import crontab

app = Celery('tasks', broker='amqp://localhost//', backend='redis://localhost')

# 基础配置
app.conf.update(
    result_expires=3600,                     # 任务结果过期时间
    task_acks_late=True,                     # 确保任务执行后才确认完成
    worker_prefetch_multiplier=1,            # 单次预取任务数
    task_serializer='json',                  # 任务数据序列化格式
    result_serializer='json',                # 任务结果序列化格式
    accept_content=['json'],                 # 仅接收json格式
    task_soft_time_limit=300,                # 软超时时间
    task_time_limit=600,                     # 硬超时时间
    worker_hijack_root_logger=False,         # 不劫持主日志
    worker_log_format='[%(asctime)s: %(levelname)s/%(processName)s] %(message)s',
)

# 定时任务配置
app.conf.beat_schedule = {
    'scheduled_add': {
        'task': 'tasks.add',
        'schedule': crontab(hour=7, minute=30, day_of_week=1),
        'args': (16, 16),
    },
}

# 任务路由配置:不同的任务可以走不同的队列
app.conf.task_routes = {
    'tasks.add': {'queue': 'high_priority'},
}

2. tasks.py - 定义任务

python 复制代码
# tasks.py
from celery_app import app
from monitor import task_failure_handler
import time

# 定义基础任务
@app.task(bind=True, max_retries=3)
def add(self, x, y):
    try:
        time.sleep(5)  # 模拟耗时任务
        return x + y
    except Exception as exc:
        raise self.retry(exc=exc, countdown=5)  # 5秒后重试

3. monitor.py - 监控与报警

python 复制代码
# monitor.py
from celery.signals import task_failure

@task_failure.connect
def task_failure_handler(sender=None, exception=None, **kwargs):
    # 发送报警通知或记录错误日志
    print(f"[ALERT] Task {sender.name} failed due to {exception}")

4. main.py - 测试任务调用

python 复制代码
# main.py
from tasks import add
from celery_app import app

if __name__ == "__main__":
    # 启动异步任务
    result = add.delay(4, 6)
    print("Task state:", result.state)  # 打印任务状态
    print("Result:", result.get())      # 获取任务结果(阻塞等待)
    
    # 组合任务示例:Group
    from celery import group
    group_tasks = group(add.s(i, i) for i in range(10))
    group_result = group_tasks.apply_async()
    print("Group Result:", group_result.get())
    
    # 链式任务示例:Chord
    from celery import chord
    callback = add.s(10, 20)
    chord_tasks = chord((add.s(i, i) for i in range(10)), callback)
    chord_result = chord_tasks.apply_async()
    print("Chord Result:", chord_result.get())

运行和监控

  1. 启动 RabbitMQ 服务

    bash 复制代码
    sudo service rabbitmq-server start
  2. 启动 Celery Worker

    运行以下命令,指定 high_priority 队列处理高优先级任务。

    bash 复制代码
    celery -A celery_app worker -Q high_priority,default -l info
  3. 启动 Celery Beat(用于调度定时任务):

    bash 复制代码
    celery -A celery_app beat -l info
  4. 启动 Flower 实时监控(可选):

    bash 复制代码
    celery -A celery_app flower --port=5555

    访问 http://localhost:5555 进行任务和 worker 状态的实时监控。

  5. Prometheus 和 Grafana 监控(可选)

    配置 Celery 的自定义事件,并使用 Prometheus 采集数据,再通过 Grafana 可视化 Celery 的性能指标。


此示例项目具有以下特性:

  • 异步任务 :通过 delay() 方法调用。
  • 重试机制:在任务异常时自动重试。
  • 任务调度 :支持定时任务,利用 Celery Beat 实现周期性任务调度。
  • 报警机制:在任务失败时发送报警或日志记录。
  • 监控系统 :使用 Flower 进行实时监控,支持 Prometheus 和 Grafana 扩展。
相关推荐
power-辰南1 小时前
高并发系统架构设计全链路指南
分布式·系统架构·高并发·springcloud
roman_日积跬步-终至千里7 小时前
【分布式理论16】分布式调度2:资源划分和调度策略
分布式
DC_BLOG11 小时前
Linux-GlusterFS进阶分布式卷
linux·运维·服务器·分布式
点点滴滴的记录13 小时前
分布式之Raft算法
分布式
桃林春风一杯酒14 小时前
HADOOP_HOME and hadoop.home.dir are unset.
大数据·hadoop·分布式
逻各斯19 小时前
Redisson分布式锁java语法, 可重入性实现原理 ,(还有可重试性,超时不释放,主从一致性)
分布式
WeiLai111219 小时前
面试基础--微服务架构:如何拆分微服务、数据一致性、服务调用
java·分布式·后端·微服务·中间件·面试·架构
奔跑吧邓邓子20 小时前
【Python爬虫(44)】分布式爬虫:筑牢安全防线,守护数据之旅
开发语言·分布式·爬虫·python·安全
转身後 默落21 小时前
11.Docker 之分布式仓库 Harbor
分布式·docker·容器
奔跑吧邓邓子21 小时前
【Python爬虫(45)】Python爬虫新境界:分布式与大数据框架的融合之旅
开发语言·分布式·爬虫·python·大数据框架