【定时任务知多少, 横跨10余项目,6种实践方式】

请添加图片描述

工作多年,随着项目的不断研发落地,大大小小做了有10+个项目,其中不少涉及到定时任务。今天来盘一下,这些项目中,定时任务的实现方式 。
通过项目的需求场景,可以看出定时任务需要有什么样的功能。

需求

1 调度需求

  • 任务,增,删,查。
  • 时效,实时发送 / 定时发送。

2 执行需求

  • 分布式,多机计算
  • 跨平台,跨语言

方案

这里列举6个方案 ,上手从简单到难,功能从基础到完备。
1,crontab (native in linux)
2,k8s cronjob (k8s)
3,timeloop (most simple)
4,apSchdule (simple)
5,celery (distribute)
6,airflow (most complete)

使用速览

定时任务在开发和运维中非常常见。这里是六种不同的定时任务框架及其基本使用示例:

1. Crontab (Native in Linux)

介绍: Crontab是Linux系统中用于定时执行任务的工具。它的配置文件crontab可以通过简单的语法来设定任务的执行时间和频率。

使用示例:

  1. 使用如下命令打开crontab编辑器:

    crontab -e
    
  2. 添加一个定时任务,比如每天凌晨2点执行/path/to/script.sh

    0 2 * * * /path/to/script.sh
    

2. Kubernetes CronJob (K8s)

介绍: Kubernetes CronJob用于在Kubernetes集群中创建基于时间调度的任务。它的工作方式类似于Crontab,但具有容器化和分布式的优势。

使用示例:

  1. 创建一个CronJob YAML文件 (cronjob.yaml):

    apiVersion: batch/v1beta1
    kind: CronJob
    metadata:
      name: example-cronjob
    spec:
      schedule: "0 2 * * *"
      jobTemplate:
        spec:
          template:
            spec:
              containers:
              - name: example
                image: busybox
                args:
                - /bin/sh
                - -c
                - date; echo Hello from Kubernetes CronJob
              restartPolicy: OnFailure
    
    
  2. 应用该CronJob:

    kubectl apply -f cronjob.yaml
    

3. Timeloop (Most Simple)

介绍: Timeloop是一个简单的Python库,用于执行定时任务。它特别适合于轻量级的定时任务调度。

使用示例:

  1. 安装Timeloop:

    pip install timeloop
    
  2. 创建一个简单的定时任务:

    from timeloop import Timeloop
    from datetime import timedelta
    
    tl = Timeloop()
    
    @tl.job(interval=timedelta(seconds=10))
    def sample_job():
        print("Job executed")
    
    if __name__ == "__main__":
        tl.start(block=True)
    

4. APScheduler (Simple)

介绍: APScheduler是一个轻量级但功能强大的Python库,用于调度定时任务。它支持多种触发器和持久化后端。

使用示例:

  1. 安装APScheduler:

    pip install apscheduler
    
  2. 创建一个定时任务:

    from apscheduler.schedulers.blocking import BlockingScheduler
    
    def job_function():
        print("Job executed")
    
    scheduler = BlockingScheduler()
    scheduler.add_job(job_function, 'interval', seconds=10)
    
    try:
        scheduler.start()
    except (KeyboardInterrupt, SystemExit):
        pass
    

5. Celery (Distributed)

介绍: Celery是一个分布式任务队列系统,支持实时处理和定时任务。它适用于需要高并发、分布式任务执行的场景。

使用示例:

  1. 安装Celery:

    pip install celery
    
  2. 创建一个Celery应用并定义定时任务:

    from celery import Celery
    
    app = Celery('tasks', broker='pyamqp://guest@localhost//')
    
    @app.task
    def add(x, y):
        return x + y
    
    from celery.schedules import crontab
    
    app.conf.beat_schedule = {
        'add-every-30-seconds': {
            'task': 'tasks.add',
            'schedule': 30.0,
            'args': (16, 16)
        },
    }
    
    if __name__ == '__main__':
        app.start()
    
    

6. Apache Airflow (Most Complete)

介绍: Apache Airflow是一个用于编排和调度复杂工作流的工具,具有丰富的功能和可视化界面。适用于复杂的任务依赖和调度场景。

使用示例:

  1. 安装Airflow:

    pip install apache-airflow
    
  2. 创建一个DAG文件 (example_dag.py):

    from airflow import DAG
    from airflow.operators.python_operator import PythonOperator
    from datetime import datetime
    
    def print_hello():
        print('Hello from Airflow')
    
    default_args = {
        'owner': 'airflow',
        'depends_on_past': False,
        'start_date': datetime(2023, 1, 1),
        'retries': 1,
    }
    
    dag = DAG('example_dag', default_args=default_args, schedule_interval='@daily')
    
    t1 = PythonOperator(
        task_id='print_hello',
        python_callable=print_hello,
        dag=dag,
    )
    
    
  3. 启动Airflow服务并加载DAG:

    airflow webserver
    airflow scheduler
    

以上是六种不同定时任务框架的简要介绍和基本使用示例。我们接下来用表格对比下,

一表对比

名称crontabk8s cronjobapSchedulertimeloopceleryairflow
介绍Linux 原生定时任务调度工具Kubernetes 定时任务调度简单的 Python 调度库最简单的 Python 任务调度工具分布式任务队列功能最完整的工作流调度工具
优点原生Linux等系统支持。灵活 ,好配置。简单易用,如果作为python 小型任务调度器 特别合适。使用最简单。架构天然适合分布式场景。功能最全,实时,延时任务, 分布式,拓扑编排,编程接口,跨语言等。
部署与运营成本简单简单,主要依赖k8s环境简单简单中等偏难,依赖多
缺点功能少,配套不全。扩展功能少。分布式支持弱(需要自己实现基类扩展),语言只能用python。功能很少,适合本地跑 或者 简单demo使用。相对较为原始。很重,很复杂。

选择

几种方案的优缺点很明显,选择困难症患者 也不用纠结。

  • crontab (native in linux):linux老鸟们都懂 ,最原始。物理机上跑一跑。
  • k8s cronjob: cronjob升级版,上云,灵活 ,好配置。用k8s服务的可以配套用。
  • timeloop (most simple):python语言,中小型项目 可选。
  • apschdule (simple) :python语言,中小型项目 可选。
  • celery (distribute ) :一般不单独使用,可以作为中间件。
  • airflow (most complete) :功能最全,最强大, 中大型项目,调用关系复杂,项目结构复杂,拓扑依赖多 可以选用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值