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

2024-05-31  本文已影响0人  wn777

工作多年,随着项目的不断研发落地,大大小小做了有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
    

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

一表对比

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

选择

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

上一篇下一篇

猜你喜欢

热点阅读