项目开发中容易堆积较多定时脚本,最简单的是使用 crontab

但 crontab 存在较多缺点:

  • 默认不支持秒级
  • 任务管理分散,代码散落在各个机器,代码管理易丢失
  • 可观测性弱,需要在各个脚本中开发告警、推送逻辑
  • 查阅日志繁琐
    ……

通过调研有 cronsun、gocron 等任务调度开源项目

经初步了解,梳理两个项目特点和适用场景

shunfei/cronsun

项目地址:https://github.com/shunfei/cronsun

特点:分布式、注册机制、可靠性保证较强
适用场景:业务量级较大、资源较为丰富
资源与部署:cronweb、cronnode、Etcd、Mongo
可靠性说明:https://github.com/shunfei/cronsun/wiki/%E5%8F%AF%E9%9D%A0%E6%80%A7%E8%AF%B4%E6%98%8E

安装体验

TODO 遇到 docker-compose 部署问题,后续折腾好了补上
熟悉 docker 的朋友,帮看一眼是什么问题,调了好几次配置没解决 ToT..
https://link.zhihu.com/?target=https%3A//github.com/jsDotx3/cronsun-docker/issues/1

ouqiang/gocron

项目地址:https://github.com/ouqiang/gocron
特点:轻量、配置简单易上手,存在单点问题
适用场景:业务量级适中、追求低资源运行、脚本允许出现可能得短期中断(单点)
资源与部署:gocron-node、gocron、MySQL

安装体验

1.安装
项目自带 Docker 用于部署 gocron web 管理端

docker network create my_network
docker run --name mysql -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 --network my_network -d mysql:latest
docker run --name gocron -p 5920:5920 --network my_network -d ouqg/gocron

2.初始化配置
通过上述步骤即可在本地部署 MySQL 和 gocron web 端,本地访问 http://localhost:5920/
mysql 去建个数据库,在 gocron web 后台输入 mysql 相关信息和系统登录管理员,即可完成系统初始化

3.任务配置
3.1 启动 gocron-node 任务节点
这里在本地 mac 编译好,并启动一个 gocron-node

git clone git@github.com:ouqiang/gocron.git
cd gocron
go mod tidy
make
./bin/gocron-node

3.2 配置任务节点
配置上述 mac 机启动的 gocron-node(容器访问宿主机,可用 host.docker.internal)
x

3.3 配置任务
x

3.4 配置告警
shell 类型,使用 exit 1 等非 0 退出,定义为执行失败,可对执行失败配置告警,这里企微比较常用,举例一下企微配置
x
x