# cron-job **Repository Path**: HoraceDH/cron-job ## Basic Information - **Project Name**: cron-job - **Description**: 现代化的Cron-Job分布式任务调度平台,简单易用、超低延迟,支持用户权限管理、多语言客户端和多租户接入。 - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: https://cronjob.horace.cn - **GVP Project**: No ## Statistics - **Stars**: 16 - **Forks**: 3 - **Created**: 2025-02-15 - **Last Updated**: 2025-12-17 ## Categories & Tags **Categories**: Uncategorized **Tags**: Cron-Job, 分布式任务调度, 任务调度平台, Job, 定时任务 ## README ### 官方文档地址 [https://cronjob.horace.cn](https://cronjob.horace.cn) ### 一、介绍 #### 1. cron-job Cron-Job 分布式任务调度平台是一种用于管理微服务系统中定时任务的软件系统,它提供了一种简单易用、超低延迟、支持用户权限管理、多语言客户端和多租户接入的方式来高效调度和执行任务。 #### 2. 技术栈 Cron-Job 分布式任务调度平台是前后端分离的架构,服务端基于Java语言开发,前端基于Ant Design Pro开发,采用互联网主流技术栈构建而成。涉及的主要技术栈有: - 服务端:MySQL、Druid、MyBatis、MyBatis-Generator、HttpClient、Spring Boot等。 - 前端:React、Ant Design Pro、Ant Design Charts、Babel、Eslint、Axios等。 #### 3. 基本概念 - **租户**:租户是指系统中不同的业务方,每个租户在cron-job中拥有独立的权限管理和资源隔离。 - **调度器**:调度器是指系统中负责任务调度的服务,它可以根据任务的配置信息,在指定的时间点派发任务给执行器。 - **应用**:应用是接入方的一个微服务,它受调度器的调度,一个应用下一般有多个实例。 - **执行器**:执行器是应用的一个实例,负责执行任务的具体逻辑,一个应用下一般有多个执行器。 - **任务**:任务是指系统中最小的执行单元,它可以通过配置在某个特定的时间点触发任务执行。 - **任务日志**:任务日志是指系统中某一次任务的执行日志,他涵盖了这个任务派发给了哪个执行器,什么时候执行的,耗费了多少时间等等信息。 #### 5. 适用场景 适用于一切可以被cron表达式定义时间点的任务场景,例如: - 定时计算、统计报表 - 定时推送信息 - 定时结算 - 订单超时自动取消 - 批量分片处理等等 ### 二、解决了什么问题 假如有一个需求,需要每天凌晨1点执行一次统计任务,一般是使用分布式锁(Redis、ZK、MySQL)等方式,保证同一时刻只有一个任务执行。整个应用中如果有多个这类任务则需要重复维护,如果扩大到整个公司的业务来看,效率将是低下的,并且以下诉求很难得到满足: - 不支持任务参数的动态调整,例如某类任务需要根据特定参数做一些特性化事情的时候。 - 不支持分片任务,例如某类任务需要处理的数据量很大,需要分片处理,多个系统之间的协调也是难点。 - 较难失败重试,或失效转移,例如执行失败之后,需要重试或转移到其他节点执行。 - 任务执行数据难以统计,任务的执行的耗时、失败次数、执行次数等,都难以统计。 - 不支持任务的停止,例如在机房迁移等一些场景,需要暂时性的停止任务。 - 在不适用分布式调度平台的情况,不同语言的应用需要单独再实现一遍,效率低下。 **但是 cron-job 可以很好的解决这些问题,并且接入简单、超低延迟、可靠性高,使用起来非常方便。** ### 三、核心优势 - 现代化的管理后台UI更加精美简洁,并优化了管理后台的交互逻辑,理解和使用更加简单。 - 基于提前调度的策略,避免了网络延迟的问题,任务的调度更加精准。 - 支持多租户接入以及用户权限管理,多业务情况下以不同租户接入,互不干扰。 - 支持任务级别的标签路由能力,测试环境多迭代下可指定路由到不同标签的执行器。 - 执行器和调度器都支持无损的优雅停机,队列中的任务不会丢失,执行器的结果不会丢失。 - 支持任务失败告警,当前支持飞书、Lark告警,未来会支持更多的告警方式。 - 支持慢SQL监控,超过1秒的SQL,会被记录到错误日志中,方便用户排查问题。 - 用户的接入和使用更加高效简单,代码上打上注解,就可以完成自动注册,不需要额外的配置。 - 简单而恰到好处的架构设计,尽量少的三方依赖,避免了复杂的集群选举和负载均衡策略。 - 支持集群的横向扩展能力,多节点可平摊调度压力,可动态无损的增删调度节点,无需担心任务丢失。 - 开放OpenAPI,支持用户自定义执行器,可根据需要构建其他语言的执行器,目前官方支持Java和Go。 ### 四、基本架构 #### 1. 模块架构 模块架构 #### 2. 部署架构 模块架构 #### 3. 调度器的依赖 - 调度器仅依赖于MySQL数据库,除此之外不依赖于任何第三方服务,部署成本低。 - 有朋友会说,强依赖于MySQL,性能和可靠性受MySQL制约,先试想一下,你的业务系统是不是强依赖于MySQL?换句话说,他在99%的互联网场景中,完全够用。 ### 五. 产品特性 #### 1. 功能 - 任务调度: - 支持cron表达式的任务调度,支持分片和随机策略。 - 路由策略: - 随机策略:随机选择一个执行器执行任务,适用于多实例之间互斥的任务场景。 - 分片策略:动态任务分片,每个分片由一个执行器执行,适用于大批量计算任务场景。 - 过期策略: - 过期丢弃:任务超过执行时间后而未被调度则直接丢弃,适用于任务密集型场景,一般不会出现超过时间而未被调度的情况。 - 过期执行:任务超过执行时间后,仍然由调度器调度,适用于任务松散型场景,例如1天才执行一次的任务,或者一个月才执行的任务。 - 失败策略: - 失败丢弃:任务执行失败后,丢弃任务,适用于任务执行不敏感的场景。 - 失败重试:任务执行失败后,重试任务,可配置重试时间和重试次数,适用于任务执行失败后需要重新执行的场景。 - 任务超时:执行器接收到任务请求后,如果未在固定时间内反馈结果,会认为是超时,则按失败策略处理。 - 任务参数: - 支持任务参数的动态调整,例如某类任务需要根据特定参数做一些特性化事情的时候。 - 任务标签: - 提供任务标签的功能,方便用户对任务进行分类管理,特别适合开发环境中多迭代的场景。 - 数据清理: - 可配置调度日志、报表等数据的保留时间,避免数据量一直增长。 #### 2. 效率 - 用户体验与效率: - 让用户的接入更加简单,只需要代码上打上注解,就可以完成自动注册,不需要额外的配置,只需要点击开始即可。 - 现代化的管理后台UI更加精美简洁,并优化了管理后台的交互逻辑,理解和使用更加简单。 - 更加全面且有结构化的官方文档,尽可能让用户一目了然,自主接入和部署,而不需要过多研究和提问。 - 问题的排查效率: - 管理后台提供更多维度的日志详情,能够帮助用户更好的理解任务的执行情况,并且能够更好的排查问题。 #### 3. 性能与扩展性 - 毫秒级的调度延迟: - 基于提前调度策略,抹平服务器时间差、网络延迟等因素,使任务的执行更加及时,实际测试为个位数毫秒级别(执行器的GC和性能)。 - 基于ACK确认、失败重试、过期调度等策略,使任务的执行更加准确、可靠,当然也可以通过配置不要失败重试。 - 可靠的调度结果: - 任务执行后,无论是否成功,都会反馈调度结果给调度器,失败会一直重试,保证结果的可靠性。 - 高可用的调度服务: - 支持集群部署,支持高可用的调度服务。 - 支持动态扩缩容,运行情况下,动态增删调度节点,不影响任务的执行和调度。 #### 4. 可视化与告警 - 任务报表,提供任务执行的统计报表,包括任务的执行次数、失败次数、执行耗时、平均执行耗时等。 - 任务告警,提供任务执行的告警功能,支持飞书、Lark等多种告警方式,未来可接入更多告警方式。 #### 5. 安全性 - 管理后台的安全性: - 精心设计权限管理的功能,可控制到接口的权限级别,任务的安全性更加可靠,多租户间权限隔离。 - 后台管理接口的交互,采用签名校验机制,避免参数篡改、伪造和重放等问题。 ### 六、管理平台界面 - 管理平台主页: 管理后台主页 - 任务日志详情: 任务日志详情