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

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

作者: wn777 | 来源:发表于2024-05-31 23:08 被阅读0次

    工作多年,随着项目的不断研发落地,大大小小做了有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使用。 相对较为原始。 很重,很复杂。

    选择

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

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

    相关文章

      网友评论

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

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