文章目录
项目案例:基于Celery、Redis和Flower的异步邮件报警与监控
一、项目背景
异步任务队列的主要应用场景在:
- 无须实现响应,性能占用较大,任务处理时间较长的任务,如占用网络性能的发送邮件,占用IO 性能的视频处理。 和经常我们在注册信息的时候,发送激活邮箱,手机发送验证码
- 按时发布的定时任务,如定期对服务器的检查,对当天网站的监测分析。
补充
(1) 同步和异步的概念:
同步:你去饭店吃饭,点了餐付了钱,一直站着等待饭菜做好你拿到手然后坐下来吃
异步:你去饭店吃饭,点了餐付了钱,拿到一个号码牌等待饭菜做好,期间你可以去干其他事情,等叫号的时候去拿饭。
Celery组件简介
Celery(芹菜)是一个Python编写的异步任务队列/基于分布式消息传递的作业队列。用于处理数以百万计的任务。
三大组件: 消息中间件(Broker),任务执行单元(Worker)和任务执行结果存储 (Backend)。
Celery支持RabbitMQ、Redis、ZoopKeeper等作为Broker,而对这些消息队列的抽象,都是通过 Kombu实现的。
Flower是基于web的监控和管理Celery的实时监控工具。
Redis(Remote Dictionary Server)远程字典数据服务的缩写,由意大利人开发的是一款内存高速缓存数 据库。可以作为消息队列,队列可以让不同的主机来访问。
二、安装项目所需软件
pip install celery
pip install flower
太慢使用豆瓣源
pip install -i https://pypi.douban.com/simple celery
pip install -i https://pypi.douban.com/simple flower
三、项目实现
1、项目结构
- config文件:项目的一些配置信息
- main文件:主程序,启动异步任务
- tasks文件:要执行的异步任务
2、项目程序
(1)主程序main.py
""" 主程序代码 """
from celery import Celery
# include指定任务存储文件位置
app = Celery('app', include=['tasks'])
# 加载配置文件
app.config_from_object('config')
if __name__ == '__main__':
# 启动异步任务
app.run()
(2)任务程序tasks.py
这里只是简单模拟了一些任务,项目中要实现的异步发送邮件完整代码在后面详细给出
""" 异步要执行的任务程序:发送邮件、发送短信 """
import time
from main import app
@app.task
def send_email(mail):
"""模拟发送邮件"""
print('sending mail to %s....' %(mail['to']))
time.sleep(2)
print('mail end')
return 'send mail successful'
@app.task
def add(x, y):
"""模拟计算函数"""
time.sleep(0.5)
return x + y
(3)配置文件config.py
""" 项目的配置文件,存储配置信息 """
from datetime import timedelta
# 使用redis作为消息代理
BROKER_URL = 'redis://127.0.0.1:6379/2'
# 将任务执行结果存入redis , 也可以是mysql
CELERY_RESULT_BACKEND = 'redis://127.0.0.1:6379/3'
# 任务序列化和反序列化格式为msgpack(类似json格式) #celery在执行时任务传输的格式
CELERY_TASK_SERIALIZER = 'msgpack'
# 任务结果序列化存储格式为JSON(可读性好)
CELERY_RESULT_SERIALIZER = 'json'
# 任务过期时间
CELERY_TASK_RESULT_EXPIRES = 60 * 60 * 24
# 任务需要接收的内容
CELERY_ACCEPT_CONTENT = ['json', 'msgpack']