基于celery及redis封装sanic的api

背景介绍

celery 简介

其实celery不是消息队列,是一任务异步调用及定时任务调用处理的工具,并提供了后端存储,整合消息队列, 象rabbitmq ,redis。提供很多常用的功能。

sanic 简介

sainc 是一个web框架,并发性很强,基于 uvloop事件处理。

封装一起的意义

项目中,常常需要定时任务处理,临时用了crontab。也需要异步处理,临时基于redis写了一个队列,虽功能都暂时满足实现。
但是,如果这些需求多了,这些就显得很乱,对于高并发,没有很好的承载。

整合sanic和celery就很有必要。sanic提供api, celery处理异步任务和定时任务。flower作任务监控工具。

项目结构

image.png

celery架构

image.png

稍微深入的celery说明

celery 配置方式

基本默认方式

 app = Celery('tasks', broker='redis://127.0.0.1/12', backend='redis://127.0.0.1/13')

配置文件方式

 app.config_from_object("celery_config")

类加载方式

app.config_from_object(Config)

具体可参考官方文档
http://docs.celeryproject.org/en/latest/userguide/configuration.html

celery 启动方式

多个队列一起启动

celery -A celery_queue worker -l info -Q default,priority_high,priority_low  -c 5  -P eventlet

也可以单独启动或是在不同的虚拟环境中启动

启动定时任务

celery -A celery_queue beat

启动flower监控任务队列执行情况

celery flower -A celery_queue  --basic_auth=hugo:3456

参考官方文档
https://flower.readthedocs.io/en/latest/

要点总结

  • 可以基于默认队列配置或自定义队列
  • 如果是自定队列,就要在启动的时候指定异步加入的队列或是装饰器方式
  # 任务加入队列
    task_routes = {
        'celery_queue.scheduler_task_1': {'queue': 'priority_high', 'routing_key': 'priority_high'},
        'celery_queue.scheduler_task_2': {'queue': 'priority_low', 'routing_key': 'priority_low'}
    }

# 装饰器方式指定
@app.task(queue="default", name="remote_comm_task_call")
def task_call(*args, **kwargs):
    logger.info("logging test")
    return "celery queue exec success"
  • return xxx 并不是返回的结果,而是写入存储的result,返回的是队列对象,里面包含队列id,状态,结果等等信息


    image.png
  • 还有实用的功能, 项目中用到,再慢慢加入
    比如执行重试,异常处理,处理时间.......

参考

http://docs.celeryproject.org/en/latest/index.html
https://flower.readthedocs.io/en/latest/

https://www.jianshu.com/p/66707b1e7787
CELERY 相关函数介绍
https://www.jianshu.com/p/3833f0f07be5
celery稍微深入说明
https://www.jianshu.com/p/027538ffb8c1
celery 中文文档
https://www.jianshu.com/p/a556cac5bf7d
celery 集群管理的实现
https://www.jianshu.com/p/a7d453abed3c
分布式异步任务队列神器-Celery
https://www.jianshu.com/p/fb3de1d9508c

你可能感兴趣的:(基于celery及redis封装sanic的api)