面试之Celery

Celery

什么是Celery?

  • 一个简单、灵活且可靠、处理大量消息的分布式系统,可以在一台或者多台机器上运行。
  • 单个 Celery 进程每分钟可处理数以百万计的任务。
  • 通过消息进行通信,使用消息队列(broker)在客户端和消费者之间进行协调。

我们的代码是自上而下同步执行的,当遇到一些耗时的操作时,系统有可能会被阻塞,那么对用户的响应将会被延迟,这样势必会导致用户界面的倒计时延时,这样就会很影响用的体验。

那么我们可以考虑将耗时操作进行异步操作,将耗时操作的任务从我们的主体任务中分离出来,也就是系统解耦

生产者消费者设计模式

  • 生产者消费者设计模式即寻找中间人搭桥,保证两个业务没有直接关联
  • 这种设计模式由三部分组成:生产者=》消息队列《=消费者
    • 生成者负责生成消息,缓存到消息队列中,消费者要读取消息队列中的消息并执行
  • 中间人broker(消息队列)
    • Celery需要一种解决消息的发送和接收的方式,那这种用来存储中间装置的一般称为message broker,即消息中间人
    • 1、RabbitMQ
      • RabbitMQ是一个功能完备,稳定的并且易于安装的broker. 它是生产环境中最优的选择。
      • RabbitMQ的应用场景
        • 1、异步处理
        • 2、流量削峰
          • MQ可以将任务收集起来然后转交给不同的工人去做,可以有效的避免流量的峰值
        • 3、日志处理
          • 主要是针对kakfa的,大数据的平台日志非常大
        • 4、应用解耦
          • 可以降低系统的耦合度
      • 使用了MQ,会带来的问题
        • 1、系统的可用性会降低,且MQ挂掉了,影响非常大
        • 2、可能会导致系统复杂性增加,比如说消息的幂等性、消息怎么去进行可靠的传输或者消息突然丢掉了
        • 3、一致性,我们应该思考如何保证业务的一致性
    • Redis
      • Redis也是一款功能完备的broker可选项,但是其更可能因意外中断或者电源故障导致数据丢失的情况。

Celery的使用

  • Celery安装
    • pip install -U Celery
  • 创建Celery实例并加载配置
    • 1、需要先创建一个Celery的包
    • 2、创建Celery实例
      • from celery import Celery
      • 为celery使用django配置文件进行配置
      • import os
      • os.environ.setdefault(“DJANGO_SETTINGS_MODULE”,“项目名称.settings”)
      • 创建celery实例对象
      • celery_app = Celery(“celery_tasks”)
    • 3、加载Celery配置
      • 创建配置文件
        • Redis配置
          • broker_url = “redis://127.0.0.1/14”
          • result_backend = “redis://127.0.0.1/15”
        • RabbitMQ
      • 加载celery配置
        • celery_app.config_form_object(“celery_tasks.config”)
    • 4、定义要加入到Celery的任务
      • 自动注册celery任务
        • celery_app.autodiscover_tasks([‘任务名路径’])
      • 定义任务
        • 在要加入到队列中的任务函数上加入如下装饰器:
        • @celery_app.task(bind=True,name=“被装饰函数”,retry_backoff=异常自动充实的时间间隔/max_retries=异常自动重试次数的上限)
    • 5、启动Celery服务
      • 启动命令行
      • celery -A celery_tasks.main worker -l info
      • 参数解析
        • -A是指对应的应用程序,其参数是项目中Celery实例的位置
        • worker指这里要启动的worker
        • -l 指日志等级,比如info等级
    • 6、调用异步任务
      • 任务名.delay(传入的参数)
    • 7、Celery worker的工作模式
      • 默认是进程池方式,进程数以当前机器的CPU核数为参考,每个CPU开四个进程
      • 还可以自己指定进程数: celery worker -A proj --concurrency=4
      • 可以改变进程池方式为协程方式:
        • celery worker -A proj --concurrency=1000 -P eventlet -c 1000

你可能感兴趣的:(面试)