cron-job.org
结构
database
包含MySQL数据库结构。chronos
是cron-job.org的定时任务执行守护进程,负责获取任务。protocol
包含系统节点之间交互的接口定义。frontend
包含Web界面。statuspage
包含状态页面UI。api
包含Web界面和状态页面UI使用的服务器API。
chronos
概念
chronos每分钟检查MySQL数据库以收集所有要执行的任务。每分钟会生成一个线程来处理所有任务。实际的HTTP获取是使用出色的curl multi库完成的,libev库用于提供事件循环。结合c-ares解析器,这允许同时进行数千个并行HTTP请求。
cron-job.org支持为用户方便起见存储任务结果。在MySQL数据库中存储结果数据很快会导致I/O瓶颈。(这也有清理旧条目极其昂贵的缺点。)为解决这个问题,chronos将结果存储在每个用户每天的SQLite数据库中。清理旧条目就像删除相应日期的数据库一样简单。
整个软件的优化侧重于性能而不是数据完整性,即当服务器崩溃或发生断电/硬件故障时,任务历史很可能会丢失。由于这本来就是易失性数据,因此不被认为是一个大问题。
chronos
现在可以在多个节点上运行。每个节点需要自己的MySQL服务器/数据库并存储自己的任务。运行Web界面的主机还管理用户数据库和任务与节点之间的关联。Web界面可以通过protocol
文件夹中定义的基于Thrift的协议从特定节点创建、删除、更新和获取任务以及任务日志。
先决条件
为了构建chronos,你需要以下开发文件:
- curl(最好使用c-ares作为解析器,并使用libidn2支持IDN)
- libev
- mysqlclient
- sqlite3
- thrift(编译器和libthrift)
要构建,你需要C++14编译器和cmake。
构建
- 创建并进入构建文件夹:
mkdir build && cd build
- 运行cmake:
cmake -DCMAKE_BUILD_TYPE=Release ..
- 构建项目:
make
运行
- 确保你已从
database
文件夹导入DB模式 - 根据你的系统自定义
chronos.cfg
(特别是添加你的MySQL登录信息) - 执行
./chronos /path/to/chronos.cfg
API
API使用PHP编写,需要在Web服务器上托管(cron-job.org使用nginx和php-fpm)。它由控制台和状态页面UI使用。
先决条件
- nginx和php-fpm(PHP 7)
- 可选,一个redis实例以支持API调用速率限制
入门
- 将
api/
文件夹复制到你的Web服务器 - 创建
config/config.inc.default.php
的副本为lib/config.inc.php
,并根据你的环境进行自定义
注意
- 更改thrift协议时,别忘了重新编译PHP粘合代码并将其复制到
lib/protocol/
。提交时,包括更新后的PHP代码。目前,这是一个手动步骤。
前端
前端使用JavaScript编写,使用React和material-ui。你需要npm
来构建它。
先决条件
- Node.js
入门
- 进入
frontend/
文件夹 - 通过运行
npm install
安装所有必需的依赖项 - 创建
src/utils/Config.default.js
的副本为src/utils/Config.js
,并根据你的环境进行自定义 - 通过
npm start
运行Web界面
状态页面前端
状态页面前端使用JavaScript编写,使用React和material-ui。你需要npm
来构建它。
先决条件
- Node.js
入门
- 进入
statuspage/
文件夹 - 通过运行
npm install
安装所有必需的依赖项 - 创建
src/utils/Config.default.js
的副本为src/utils/Config.js
,并根据你的环境进行自定义 - 通过
npm start
运行Web界面
示例环境(使用Docker Compose)
要快速启动cron-job.org系统的大部分示例环境,你可以使用docker-compose
:
- 初始化/更新子模块:
git submodule init && git submodule update
- 将
.env.example
复制到.env
并在文本编辑器中打开 - 根据需要更改
.env
中的变量。至少,用随机生成的密钥填充*_SECRET
变量,并在SMTP_SERVER
中指定SMTP服务器。SMTP会话不使用身份验证,因此请确保SMTP服务器允许你机器的IP地址进行中继。 - 通过
docker compose up
启动,并等待所有容器构建完成并启动所有服务。这可能需要一段时间,尤其是在首次运行时。 - 在浏览器中打开
http://localhost:8010/
(假设你保留了默认端口和主机名设置)。
*重要提示:*此存储库中包含的Docker环境旨在作为示例/开发环境,不适合生产使用,尤其是在安全性方面。
将启动以下容器:
mysql-master
用于主服务数据库,也存储用户、组、任务->节点关联等。mysql-node
用于节点服务数据库。用于存储每个执行器的信息,如任务详情及其计划等。redis
用作某些功能(如速率限制)的缓存。api
用于前端使用的基于PHP的API后端。使用php-fpm。frontend
托管构建的前端代码。wwww
作为前端nginx驱动的HTTP服务器,连接到frontend
(HTTP反向代理)和api
(FastCGI)。chronos
以组合的主服务和节点服务模式运行chronos。
一般注意事项
- 我们强烈建议使用c-ares解析器构建curl。否则,每个请求可能会为DNS解析生成自己的线程,你的机器很快就会耗尽资源。
- 在运行chronos之前,确保打开文件/套接字的限制设置不要太低。你可能需要先运行
ulimit -n 65536
或类似命令。 - 如果数据完整性对你来说不重要,我们强烈建议在MySQL配置中设置
innodb_flush_log_at_trx_commit=0
和innodb_flush_method=O_DIRECT
以获得最佳性能。否则,更新线程(负责存储任务结果)可能很快就会落后于实际的任务执行。 - 部分源代码相当旧,来自项目的早期阶段,可能需要早晚进行重构。