工作多年,随着项目的不断研发落地,大大小小做了有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
可以通过简单的语法来设定任务的执行时间和频率。
使用示例:
-
使用如下命令打开crontab编辑器:
crontab -e
-
添加一个定时任务,比如每天凌晨2点执行
/path/to/script.sh
:0 2 * * * /path/to/script.sh
2. Kubernetes CronJob (K8s)
介绍: Kubernetes CronJob用于在Kubernetes集群中创建基于时间调度的任务。它的工作方式类似于Crontab,但具有容器化和分布式的优势。
使用示例:
-
创建一个CronJob YAML文件 (
cronjob.yaml
):apiVersion: batch/v1beta1 kind: CronJob metadata:name: example-cronjob spec:schedule: "0 2 * * *"jobTemplate:spec:template:spec:containers:- name: exampleimage: busyboxargs:- /bin/sh- -c- date; echo Hello from Kubernetes CronJobrestartPolicy: OnFailure
-
应用该CronJob:
kubectl apply -f cronjob.yaml
3. Timeloop (Most Simple)
介绍: Timeloop是一个简单的Python库,用于执行定时任务。它特别适合于轻量级的定时任务调度。
使用示例:
-
安装Timeloop:
pip install timeloop
-
创建一个简单的定时任务:
from timeloop import Timeloop from datetime import timedeltatl = 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库,用于调度定时任务。它支持多种触发器和持久化后端。
使用示例:
-
安装APScheduler:
pip install apscheduler
-
创建一个定时任务:
from apscheduler.schedulers.blocking import BlockingSchedulerdef 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是一个分布式任务队列系统,支持实时处理和定时任务。它适用于需要高并发、分布式任务执行的场景。
使用示例:
-
安装Celery:
pip install celery
-
创建一个Celery应用并定义定时任务:
from celery import Celeryapp = Celery('tasks', broker='pyamqp://guest@localhost//')@app.task def add(x, y):return x + yfrom celery.schedules import crontabapp.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是一个用于编排和调度复杂工作流的工具,具有丰富的功能和可视化界面。适用于复杂的任务依赖和调度场景。
使用示例:
-
安装Airflow:
pip install apache-airflow
-
创建一个DAG文件 (
example_dag.py
):from airflow import DAG from airflow.operators.python_operator import PythonOperator from datetime import datetimedef 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, )
-
启动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) :功能最全,最强大, 中大型项目,调用关系复杂,项目结构复杂,拓扑依赖多 可以选用。