新一代 Cron-Job分布式任务调度平台 部署指南

本文涉及的产品
任务调度 XXL-JOB 版免费试用,400 元额度,开发版规格
Serverless 应用引擎免费试用套餐包,4320000 CU,有效期3个月
性能测试 PTS,5000VUM额度
简介: 简单易用、超低延迟,支持用户权限管理、多语言客户端和多租户接入的分布式任务调度平台。支持任何Cron表达式的任务调度,支持常用的分片和随机策略;支持失败丢弃、失败重试的失败策略;支持动态任务参数。

👉官方文档链接:部署文档

👉项目官网:https://cronjob.horace.cn

👉Gitee仓库:https://gitee.com/horacedh/cron-job

👉GitHub仓库:https://github.com/horacedh/cron-job


一、环境要求

  • OS:支持Linux、Windows、MacOS,文中以CentOS为例。
  • Java:1.8+,官方用的是:1.8.0_391,64位。
  • MySQL:5.7+,官方用的是: 5.7.35-log Source distribution。


二、发行版下载地址

  • 下载发行版
  • 解压文件,这里以gitee仓库为例,下载最新的版本,解压后会得到如下文件内容:

  • cronjob-examples:示例代码,可直接运行
  • 包含原生Java版本的 example-executor
  • SpringBoot版本的 example-executor-starter
  • cronjob-managerui:管理后台UI
  • cronjob-scheduler:调度器,负责任务调度的服务端
  • mysql.sql:完整的数据库初始化脚本

三、初始化数据库

  • 初始化SQL,找到mysql.sql文件,进入到MySQL命令行中,执行以下命令即可完成初始化,其中path替换为自己的路径:
source /path/mysql.sql
  • 成功后,会产生cron-job库,并包含如下表:

四、调度器服务端部署

1. 部署第一台实例

1.1 修改配置文件
  • 文件路径etc/application.properties
############# 调度器配置 #############
# 用于标识实例的唯一性
server.id=1
############# 调度器配置 #############
############# 数据源配置 #############
database.url=jdbc:mysql://localhost:3306/cron-job?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true
database.username=horace
database.password=SGJIWkjfdsof923847
############# 数据源配置 #############
############# Tomcat配置 #############
# Tomcat服务配置
server.port=9527
############# Tomcat配置 #############
  • 主要修改以下配置:
  • server.id:用于标识实例的唯一性,每个实例必须唯一。
  • server.port:服务端口,如果在同个机器部署,则需要修改端口,保证端口不冲突。
  • database.url:数据库连接地址。
  • database.username:数据库用户名。
  • database.password:数据库密码。
1.2 启动第一台实例
  • 执行命令:
sh start.sh
  • 查看日志输出,以下表示启动成功,有错则需要看日志排错,日志路径logs/app.log
2025-02-18 17:28:24.427 INFO  [background-preinit]o.h.v.i.util.Version - HV000001: Hibernate Validator 6.2.0.Final
2025-02-18 17:28:24.432 INFO  [main]c.h.c.s.SchedulerMain - Starting SchedulerMain using Java 1.8.0_391 on HoraceiMacProMax.local with PID 4420 (/Users/horace/Downloads/cron-job-v1.0.1/cronjob-scheduler/cronjob-scheduler-1.0.1.jar started by horace in /Users/horace/Downloads/cron-job-v1.0.1/cronjob-scheduler)
2025-02-18 17:28:24.432 INFO  [main]c.h.c.s.SchedulerMain - No active profile set, falling back to 1 default profile: "default"
2025-02-18 17:28:25.276 INFO  [main]o.s.b.w.e.t.TomcatWebServer - Tomcat initialized with port(s): 9527 (http)
2025-02-18 17:28:25.283 INFO  [main]o.a.c.h.Http11NioProtocol - Initializing ProtocolHandler ["http-nio-9527"]
2025-02-18 17:28:25.284 INFO  [main]o.a.c.c.StandardService - Starting service [Tomcat]
2025-02-18 17:28:25.284 INFO  [main]o.a.c.c.StandardEngine - Starting Servlet engine: [Apache Tomcat/9.0.65]
2025-02-18 17:28:25.399 INFO  [main]o.a.c.c.C.[.[.[/] - Initializing Spring embedded WebApplicationContext
2025-02-18 17:28:25.399 INFO  [main]o.s.b.w.s.c.ServletWebServerApplicationContext - Root WebApplicationContext: initialization completed in 932 ms
2025-02-18 17:28:25.822 INFO  [main]c.a.d.p.DruidDataSource - {dataSource-1} inited
2025-02-18 17:28:26.338 INFO  [main]c.h.c.s.s.i.SchedulerServiceImpl - find router strategy handler, name:randomRouterStrategyHandlerImpl, handler:cn.horace.cronjob.scheduler.strategy.RandomRouterStrategyHandlerImpl@431e86b1
2025-02-18 17:28:26.339 INFO  [main]c.h.c.s.s.i.SchedulerServiceImpl - find router strategy handler, name:shardingRouterStrategyHandlerImpl, handler:cn.horace.cronjob.scheduler.strategy.ShardingRouterStrategyHandlerImpl@5f36c8e3
2025-02-18 17:28:26.430 INFO  [scheduler-thread-1]c.h.c.s.s.i.StatisticsServiceImpl - start statistics, startDate:null, endDate:Tue Feb 18 17:25:00 CST 2025
2025-02-18 17:28:26.432 INFO  [scheduler-thread-1]c.h.c.s.s.i.StatisticsServiceImpl - end statistics, count:0, startDate:null, endDate:Tue Feb 18 17:25:00 CST 2025
2025-02-18 17:28:26.661 INFO  [main]o.a.c.h.Http11NioProtocol - Starting ProtocolHandler ["http-nio-9527"]
2025-02-18 17:28:26.684 INFO  [main]o.s.b.w.e.t.TomcatWebServer - Tomcat started on port(s): 9527 (http) with context path ''
2025-02-18 17:28:26.693 INFO  [main]c.h.c.s.SchedulerMain - Started SchedulerMain in 2.551 seconds (JVM running for 3.136)
2025-02-18 17:28:36.421 INFO  [scheduler-thread-1]c.h.c.s.s.i.StatisticsServiceImpl - start statistics, startDate:null, endDate:Tue Feb 18 17:25:00 CST 2025
2025-02-18 17:28:36.423 INFO  [scheduler-thread-1]c.h.c.s.s.i.StatisticsServiceImpl - end statistics, count:0, startDate:null, endDate:Tue Feb 18 17:25:00 CST 2025

2. 部署第N台实例

  • 拷贝一份cronjob-scheduler,作为第N台实例,按照第一台实例的方式修改配置文件即可。
  • 如若部署更多实例,按照第一台实例的做法,依次部署即可,注意修改server.id以及相关配置。

五、管理后台UI部署

1. 存放静态资源

管理后台UI可以在发布包中找到cronjob-managerui目录,将cronjob-managerui放到合适的目录下,该目录就是打包后的前端文件。

2. Nginx配置

参照如下模板配置即可,注意修改对应的信息:

upstream cron_job.server {
    # 配置多个调度器地址,用于负载均衡
    server 127.0.0.1:9527;
    server 127.0.0.1:9528;
}
server {
    listen  80;
    server_name 127.0.0.1;
    error_log   logs/127.0.0.1.error.log   error;
    access_log  logs/127.0.0.1.access.log  main;
    # 管理后台UI静态资源
    location / {
        # 用于配合ant.design browserHistory 使用
        try_files   $uri $uri/index.html /index.html;
        root    /Users/horace/Downloads/cron-job-v1.0.1/cronjob-managerui;
        index   index.html;
    }
    # 管理后台API接口
    location /manager-api {
        proxy_pass  http://cron_job.server;
        proxy_set_header    X-Forwarded-Proto $scheme;
        proxy_set_header    Host              $http_host;
        proxy_set_header    X-Real-IP         $remote_addr;
    }
    # 开放API接口
    location /openapi {
        proxy_pass  http://cron_job.server;
        proxy_set_header    X-Forwarded-Proto $scheme;
        proxy_set_header    Host              $http_host;
        proxy_set_header    X-Real-IP         $remote_addr;
    }
}

3. 启动Nginx

访问http://127.0.0.1,实际访问地址根据自身部署的站点情况调整,实际生产部署需要配置域名。

4. 登录任务调度平台

看到如下页面时,说明部署成功,输入账号密码 admin/admin 进入系统:

六、启动示例工程

1. 进入目录

进入cronjob-examples/example-executor目录,并执行如下命令:

sh start.sh

2. 检查执行器日志

出现以下表示启动成功,其中cron job executor register success表示执行器注册成功,cron job task register success执行器任务注册成功。

2025-02-18 17:59:40.855 INFO  [main]c.h.c.e.s.TaskService - found cron job task, TaskConfig{tenant='horace', method='cn.horace.cronjob.examples.tasks.DemoCronTask.handle', name='普通测试任务', appName='example-executor', appDesc='普通示例执行器', tag='common', remark='', cron='* * * * * ? ', routerStrategy=1, expiredStrategy=2, expiredTime=180000, failureStrategy=2, timeout=10000, maxRetryCount=5, failureRetryInterval=5000}
2025-02-18 17:59:40.868 INFO  [cron-job-http-server]o.eclipse.jetty.util.log - Logging initialized @448ms to org.eclipse.jetty.util.log.Slf4jLog
2025-02-18 17:59:40.944 INFO  [cron-job-http-server]o.e.jetty.server.Server - jetty-9.4.48.v20220622; built: 2022-06-21T20:42:25.880Z; git: 6b67c5719d1f4371b33655ff2d047d24e171e49a; jvm 1.8.0_391-b13
2025-02-18 17:59:40.968 INFO  [cron-job-http-server]o.e.jetty.server.session - DefaultSessionIdManager workerName=node0
2025-02-18 17:59:40.969 INFO  [cron-job-http-server]o.e.jetty.server.session - No SessionScavenger set, using defaults
2025-02-18 17:59:40.970 INFO  [cron-job-http-server]o.e.jetty.server.session - node0 Scavenging every 600000ms
2025-02-18 17:59:40.978 INFO  [cron-job-http-server]o.e.j.s.h.ContextHandler - Started o.e.j.s.ServletContextHandler@688910fd{/,null,AVAILABLE}
2025-02-18 17:59:40.992 INFO  [cron-job-http-server]o.e.j.s.AbstractConnector - Started ServerConnector@69735139{HTTP/1.1, (http/1.1)}{192.168.16.51:8527}
2025-02-18 17:59:40.992 INFO  [cron-job-http-server]o.e.jetty.server.Server - Started @572ms
2025-02-18 17:59:40.992 INFO  [cron-job-http-server]c.h.c.e.h.HttpServer - cron job web server started, address:192.168.16.51:8527
2025-02-18 17:59:41.343 INFO  [scheduler-thread-1]c.h.c.e.s.OpenApiService - cron job executor register success, serverAddress:http://127.0.0.1, params:ExecutorRegisterParams{tenant='horace', appName='example-executor', appDesc='普通示例执行器', hostName='HoraceiMacProMax.local', tag='common', version='Java-1.0.1', address='192.168.16.51:8527'}, result:MsgObject{code=0, msg='', data=null}
2025-02-18 17:59:42.407 INFO  [scheduler-thread-1]c.h.c.e.s.OpenApiService - cron job task register success, address:192.168.16.51:8527, result:MsgObject{code=0, msg='', data=null}

3. 启动任务

  • 登录管理后台,点击任务管理,点击启动任务,即可开始任务的调度。

4. 查看调度日志

可以看到,任务的调度很准时!

2025-02-18 18:03:51.000 INFO  [executor-task-5]c.h.c.e.t.DemoCronTask - task handler..., params:TaskParams{page=1, total=1, taskLogId=6334722791224381441, taskId=6334721498112069633, method='cn.horace.cronjob.examples.tasks.DemoCronTask.handle', exeType=0, cron='* * * * * ?', tag='common', executionTime=1739873031000, receivedDispatcherTime=1739873028002, params=''}
2025-02-18 18:03:52.000 INFO  [executor-task-1]c.h.c.e.t.DemoCronTask - task handler..., params:TaskParams{page=1, total=1, taskLogId=6334722791241158657, taskId=6334721498112069633, method='cn.horace.cronjob.examples.tasks.DemoCronTask.handle', exeType=0, cron='* * * * * ?', tag='common', executionTime=1739873032000, receivedDispatcherTime=1739873029002, params=''}
2025-02-18 18:03:53.000 INFO  [executor-task-2]c.h.c.e.t.DemoCronTask - task handler..., params:TaskParams{page=1, total=1, taskLogId=6334722791257935873, taskId=6334721498112069633, method='cn.horace.cronjob.examples.tasks.DemoCronTask.handle', exeType=0, cron='* * * * * ?', tag='common', executionTime=1739873033000, receivedDispatcherTime=1739873030005, params=''}
2025-02-18 18:03:54.000 INFO  [executor-task-3]c.h.c.e.t.DemoCronTask - task handler..., params:TaskParams{page=1, total=1, taskLogId=6334722791274713089, taskId=6334721498112069633, method='cn.horace.cronjob.examples.tasks.DemoCronTask.handle', exeType=0, cron='* * * * * ?', tag='common', executionTime=1739873034000, receivedDispatcherTime=1739873031002, params=''}
2025-02-18 18:03:55.000 INFO  [executor-task-4]c.h.c.e.t.DemoCronTask - task handler..., params:TaskParams{page=1, total=1, taskLogId=6334722791291490305, taskId=6334721498112069633, method='cn.horace.cronjob.examples.tasks.DemoCronTask.handle', exeType=0, cron='* * * * * ?', tag='common', executionTime=1739873035000, receivedDispatcherTime=1739873032002, params=''}
2025-02-18 18:03:56.000 INFO  [executor-task-5]c.h.c.e.t.DemoCronTask - task handler..., params:TaskParams{page=1, total=1, taskLogId=6334722791299878913, taskId=6334721498112069633, method='cn.horace.cronjob.examples.tasks.DemoCronTask.handle', exeType=0, cron='* * * * * ?', tag='common', executionTime=1739873036000, receivedDispatcherTime=1739873033002, params=''}
2025-02-18 18:03:57.000 INFO  [executor-task-1]c.h.c.e.t.DemoCronTask - task handler..., params:TaskParams{page=1, total=1, taskLogId=6334722791308267521, taskId=6334721498112069633, method='cn.horace.cronjob.examples.tasks.DemoCronTask.handle', exeType=0, cron='* * * * * ?', tag='common', executionTime=1739873037000, receivedDispatcherTime=1739873034002, params=''}
2025-02-18 18:03:58.000 INFO  [executor-task-2]c.h.c.e.t.DemoCronTask - task handler..., params:TaskParams{page=1, total=1, taskLogId=6334722791325044737, taskId=6334721498112069633, method='cn.horace.cronjob.examples.tasks.DemoCronTask.handle', exeType=0, cron='* * * * * ?', tag='common', executionTime=1739873038000, receivedDispatcherTime=1739873035002, params=''}
2025-02-18 18:03:59.000 INFO  [executor-task-3]c.h.c.e.t.DemoCronTask - task handler..., params:TaskParams{page=1, total=1, taskLogId=6334722791341821953, taskId=6334721498112069633, method='cn.horace.cronjob.examples.tasks.DemoCronTask.handle', exeType=0, cron='* * * * * ?', tag='common', executionTime=1739873039000, receivedDispatcherTime=1739873036002, params=''}
2025-02-18 18:04:00.000 INFO  [executor-task-4]c.h.c.e.t.DemoCronTask - task handler..., params:TaskParams{page=1, total=1, taskLogId=6334722791350210561, taskId=6334721498112069633, method='cn.horace.cronjob.examples.tasks.DemoCronTask.handle', exeType=0, cron='* * * * * ?', tag='common', executionTime=1739873040000, receivedDispatcherTime=1739873037002, params=''}
2025-02-18 18:04:01.000 INFO  [executor-task-5]c.h.c.e.t.DemoCronTask - task handler..., params:TaskParams{page=1, total=1, taskLogId=6334722791358599169, taskId=6334721498112069633, method='cn.horace.cronjob.examples.tasks.DemoCronTask.handle', exeType=0, cron='* * * * * ?', tag='common', executionTime=1739873041000, receivedDispatcherTime=1739873038002, params=''}
2025-02-18 18:04:02.000 INFO  [executor-task-1]c.h.c.e.t.DemoCronTask - task handler..., params:TaskParams{page=1, total=1, taskLogId=6334722791366987777, taskId=6334721498112069633, method='cn.horace.cronjob.examples.tasks.DemoCronTask.handle', exeType=0, cron='* * * * * ?', tag='common', executionTime=1739873042000, receivedDispatcherTime=1739873039002, params=''}
2025-02-18 18:04:03.000 INFO  [executor-task-2]c.h.c.e.t.DemoCronTask - task handler..., params:TaskParams{page=1, total=1, taskLogId=6334722791375376385, taskId=6334721498112069633, method='cn.horace.cronjob.examples.tasks.DemoCronTask.handle', exeType=0, cron='* * * * * ?', tag='common', executionTime=1739873043000, receivedDispatcherTime=1739873040002, params=''}
2025-02-18 18:04:04.000 INFO  [executor-task-3]c.h.c.e.t.DemoCronTask - task handler..., params:TaskParams{page=1, total=1, taskLogId=6334722791383764993, taskId=6334721498112069633, method='cn.horace.cronjob.examples.tasks.DemoCronTask.handle', exeType=0, cron='* * * * * ?', tag='common', executionTime=1739873044000, receivedDispatcherTime=1739873041002, params=''}
2025-02-18 18:04:05.000 INFO  [executor-task-4]c.h.c.e.t.DemoCronTask - task handler..., params:TaskParams{page=1, total=1, taskLogId=6334722791400542209, taskId=6334721498112069633, method='cn.horace.cronjob.examples.tasks.DemoCronTask.handle', exeType=0, cron='* * * * * ?', tag='common', executionTime=1739873045000, receivedDispatcherTime=1739873042002, params=''}
2025-02-18 18:04:06.000 INFO  [executor-task-5]c.h.c.e.t.DemoCronTask - task handler..., params:TaskParams{page=1, total=1, taskLogId=6334722791408930817, taskId=6334721498112069633, method='cn.horace.cronjob.examples.tasks.DemoCronTask.handle', exeType=0, cron='* * * * * ?', tag='common', executionTime=1739873046000, receivedDispatcherTime=1739873043002, params=''}
2025-02-18 18:04:07.000 INFO  [executor-task-1]c.h.c.e.t.DemoCronTask - task handler..., params:TaskParams{page=1, total=1, taskLogId=6334722791417319425, taskId=6334721498112069633, method='cn.horace.cronjob.examples.tasks.DemoCronTask.handle', exeType=0, cron='* * * * * ?', tag='common', executionTime=1739873047000, receivedDispatcherTime=1739873044002, params=''}
2025-02-18 18:04:08.000 INFO  [executor-task-2]c.h.c.e.t.DemoCronTask - task handler..., params:TaskParams{page=1, total=1, taskLogId=6334722791425708033, taskId=6334721498112069633, method='cn.horace.cronjob.examples.tasks.DemoCronTask.handle', exeType=0, cron='* * * * * ?', tag='common', executionTime=1739873048000, receivedDispatcherTime=1739873045002, params=''}
2025-02-18 18:04:09.000 INFO  [executor-task-3]c.h.c.e.t.DemoCronTask - task handler..., params:TaskParams{page=1, total=1, taskLogId=6334722791434096641, taskId=6334721498112069633, method='cn.horace.cronjob.examples.tasks.DemoCronTask.handle', exeType=0, cron='* * * * * ?', tag='common', executionTime=1739873049000, receivedDispatcherTime=1739873046002, params=''}
2025-02-18 18:04:10.000 INFO  [executor-task-4]c.h.c.e.t.DemoCronTask - task handler..., params:TaskParams{page=1, total=1, taskLogId=6334722791434100737, taskId=6334721498112069633, method='cn.horace.cronjob.examples.tasks.DemoCronTask.handle', exeType=0, cron='* * * * * ?', tag='common', executionTime=1739873050000, receivedDispatcherTime=1739873047002, params=''}
2025-02-18 18:04:11.000 INFO  [executor-task-5]c.h.c.e.t.DemoCronTask - task handler..., params:TaskParams{page=1, total=1, taskLogId=6334722791450873857, taskId=6334721498112069633, method='cn.horace.cronjob.examples.tasks.DemoCronTask.handle', exeType=0, cron='* * * * * ?', tag='common', executionTime=1739873051000, receivedDispatcherTime=1739873048002, params=''}

5. 查看调度详情

至此,全部部署完成!微服务应用内接入按照文档说明即可:请参考:快速开始

👉项目官网:https://cronjob.horace.cn

👉Gitee仓库:https://gitee.com/horacedh/cron-job

👉GitHub仓库:https://github.com/horacedh/cron-job

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
打赏
0
12
12
4
9
分享
相关文章
Koupleless 助力「人力家」实现分布式研发集中式部署,又快又省!
本文由仁励家网络科技(杭州)有限公司架构师赵云兴、葛志刚撰写,探讨了公司在优化HR SaaS解决方案时遇到的系统资源浪费和运维成本高的问题。通过引入Koupleless框架,成功将模块体积从500M缩减至5M以下,部署时间从6分钟缩短至3分钟,并大幅节省服务器资源。文章详细介绍了Koupleless的部署方案及优化措施,感谢Koupleless团队的专业支持,使人力家实现了多应用合并部署,降低了运维成本。
Koupleless 助力「人力家」实现分布式研发集中式部署,又快又省!
Koupleless 助力「人力家」实现分布式研发集中式部署,又快又省!
通过引入Koupleless框架,解决了多应用部署中资源浪费和运维成本高的问题,实现了模块瘦身、快速部署及流量控制优化,大幅降低了服务器资源占用和发布耗时,提升了系统稳定性和运维效率。最终,人力家成功实现了多应用的轻量集中部署,显著减少了运维成本。
 Koupleless 助力「人力家」实现分布式研发集中式部署,又快又省!
11.7K Star!这个分布式爬虫管理平台让多语言协作如此简单!
分布式爬虫管理平台Crawlab,支持任何编程语言和框架的爬虫管理,提供可视化界面、任务调度、日志监控等企业级功能,让爬虫开发管理效率提升300%!
|
1月前
|
新一代 Cron-Job 分布式任务调度平台 正式发布!
简单易用、超低延迟,支持用户权限管理、多语言客户端和多租户接入的分布式任务调度平台。 支持任何Cron表达式的任务调度,支持常用的分片和随机策略;支持失败丢弃、失败重试的失败策略;支持动态任务参数。
129 12
大道至简-基于ACK的Deepseek满血版分布式推理部署实战
大道至简-基于ACK的Deepseek满血版分布式推理部署实战
大道至简-基于ACK的Deepseek满血版分布式推理部署实战
本教程演示如何在ACK中多机分布式部署DeepSeek R1满血版。
新一代 Cron-Job分布式调度平台,v1.0.5版本发布!
增加标签路由能力和多项功能优化!其中Tag标签路由的功能,测试环境多迭代场景下,可通过给任务配置Tag标签,实现任务路由到不同的执行器上。
24 0
【vSAN分布式存储服务器数据恢复】VMware vSphere vSAN 分布式存储虚拟化平台VMDK文件1KB问题数据恢复案例
在一例vSAN分布式存储故障中,因替换故障闪存盘后磁盘组失效,一台采用RAID0策略且未使用置备的虚拟机VMDK文件受损,仅余1KB大小。经分析发现,该VMDK文件与内部虚拟对象关联失效导致。恢复方案包括定位虚拟对象及组件的具体物理位置,解析分配空间,并手动重组RAID0结构以恢复数据。此案例强调了深入理解vSAN分布式存储机制的重要性,以及定制化数据恢复方案的有效性。
155 5
Apache Airflow 开源最顶级的分布式工作流平台
Apache Airflow 是一个用于创作、调度和监控工作流的平台,通过将工作流定义为代码,实现更好的可维护性和协作性。Airflow 使用有向无环图(DAG)定义任务,支持动态生成、扩展和优雅的管道设计。其丰富的命令行工具和用户界面使得任务管理和监控更加便捷。适用于静态和缓慢变化的工作流,常用于数据处理。
Apache Airflow 开源最顶级的分布式工作流平台
|
6月前
|
cephFS高可用分布式文件系统部署指南
关于如何部署高可用的cephFS分布式文件系统,包括集群的搭建、验证高可用性以及实现两主一从架构的详细指南。
270 9