美文网首页python测试开发
Celery架构原理和使用方法

Celery架构原理和使用方法

作者: 抚剑听琴 | 来源:发表于2018-10-22 17:23 被阅读0次

    1. Celery 简介

    Celery是一个自带电池的基于Python开发的分布式异步消息任务队列,它非常易于使用。通过它可以轻松的实现任务的异步处理, 如果你的业务场景中需要用到异步任务,就可以考虑使用Celery。它主要适用于两大类场景:

    • 异步:
      有的任务执行时间较长,你不想让程序一直等待结果返回,可以先将改任务放入celery任务队列中,并从Celery获取一个任务ID。后续通过询问Celery来得知任务执行状态和进度。
    • 定时:
      需要定时执行同样的任务,Celery任务队列支持定时触发,可以按照时间间隔或者crontab表达式来触发任务。

    Celery具有以下优点:

    • Simple(简单)
      Celery 使用和维护都非常简单,并且不需要配置文件。它有一个活跃、友好的社区,你可以去讨论问题、需求支持。包括一个mailing-list 和一个IRC channel.

    这有一个最简单的应用示例,你可以参照:

    from celery import Celery
        app = Celery('hello', broker='amqp://guest@localhost//')
        @app.task
        def hello():
              return 'hello world'
    
    • Highly Available(高可用)
      woker和client会在网络连接丢失或者失败时,自动进行重试。并且有的brokers 也支持“双主”或者“主/从”的方式实现高可用。

    • Fast(快速)
      单个的Celery进程每分钟可以处理百万级的任务,并且只需要毫秒级的往返延迟(使用 RabbitMQ, librabbitmq, 和优化设置时)

    • Flexible(灵活)
      Celery几乎每个部分都可以扩展使用,自定义池实现、序列化、压缩方案、日志记录、调度器、消费者、生产者、broker传输等等。

    2. Celery基本工作流程

    Celery基本工作流程

    3. Celery安装

    你可以安装Celery通过Python包管理平台(PyPI)或者源码安装
    使用pip安装:

    $ pip install -U Celery
    

    你也可以使用pip命令安装与Celery捆绑、依赖的组件:

    $ pip install "celery[librabbitmq]"
    $ pip install "celery[librabbitmq,redis,auth,msgpack]"
    

    4. Celery使用

    4.1 Brokers

    Celery支持多种消息中间件作为Broker,即中间人。来在应用程序和Worker之间传递消息。

    支持的消息中间件总览:

    消息中间件 支持适配状态 支持监控 支持远程控制
    RabbitMQ 稳定
    Redis 稳定
    Amazon SQS 稳定
    Zookeeper 实验

    RabbitMQ是默认的Broker它不需要其他额外的依赖和初始化配置。可参考我之前写的文章【RabbitMQ的Python客户端pika使用调研】和官方教程【Using RabbitMQ】,至于其他的消息中间件作为broker这里就不一一展开介绍了。

    4.2 Worker

    4.3 触发器

    4.3.1 定时触发器

    4.3.2 调用触发器

    4.3 管理获取任务状态

    http://docs.celeryproject.org/en/latest/userguide/tasks.html#states

    4.4 backend

    http://docs.celeryproject.org/en/latest/userguide/tasks.html#task-result-backends

    4.5 与Flask框架集成

    http://www.pythondoc.com/flask-celery/first.html#id1

    4.6 与Django框架集成

    踩过的一些坑

    任务重复执行

    使用 Celery Once 来防止 Celery 重复执行同一个任务

    celery 在执行task时有个机制,就是任务时长超过了 visibility_timeout 时还没执行完,就会指定其他worker重新开始task,默认的时长是一小时.

    相关文章

      网友评论

        本文标题:Celery架构原理和使用方法

        本文链接:https://www.haomeiwen.com/subject/ekywuftx.html