├── app
│ ├── master
│ │ ├── api // api 和 gRPC 接口
│ │ ├── code // api 返回错误码定义
│ │ ├── common // 通用变量定义
│ │ ├── config // 配置文件
│ │ ├── initialize // 项目初始化定义
│ │ ├── middleware // 中间件
│ │ ├── pkg // 核心工具包
│ │ │ └── core
│ │ ├── repository // gorm-Gen 生成
│ │ │ └── dal
│ │ │ ├── model
│ │ │ └── query
│ │ ├── router // 路由拆分
│ │ └── services // 服务层
│ └── worker
│ ├── common // 通用变量定义
│ ├── config // 配置文件
│ ├── initialize // 项目初始化
│ └── manager // 管理器开发
├── cmd
│ └── generate // 自动生成 Mysql Model 脚本
├── proto // proto 协议文件
├── test
│ └── api // 测试 API 的 curl
└── util
├── db // database 操作
├── json
├── register // 注册服务
└── validation // validator 工具
分布式 crontab 调度项目
master
负责任务创建,页面接口对接worker
负责任务的调度,以及任务的执行,Worker
可横向扩展部署。jobs
一些需要被调度的任务执行逻辑
Gin
提供Job
的增删改查API
接口。consul
发现worker
服务节点是否可用。- 通过
consul
操作cron/jobs/
前缀key
,通过worker
节点进行watch
任务的变动。 - 通过
consul
操作cron/killer/
通知worker
节点停止任务。 gRPC
提供Worker
节点修改Job
数据库的API
接口。
- 将服务注册到
consul
负责服务发现功能; - 使用
consul
的KV
将每个任务的配置信息进行保存; - 利用
consul
的watch
机制对某个目录下所有的key
进行监控; - 监听前缀目录
cron/jobs/
所有任务的状态,将任务放入到scheduler
中进行调度; - 使用
consul
中Session
配合Lock
实现分布式锁,防止任务并发执行;- 首先申请一个
Session
,设置TTL
时间为20s
。 - 基于该
Session
对KV
调用Acquire
进行锁的获取。 - 若其中一个节点获取到了锁,则进行该任务的执行。
- 启动一个
goroutine
对该Session
进行Renew
操作,每隔20s
进行一次Renew
操作。 - 当任务执行完成后,对该
Session
的KV
调用Release
方法释放锁(也可等TTL
到期自动删除)。 - 停止掉
goroutine
对Session
的Renew
操作。
- 首先申请一个
worker
进行任务kill
操作,通过context
取消掉本次执行的任务。worker
执行Job
完成后通过gRPC
修改数据库中Job
任务的状态,以及任务执行日志。
确保所有节点都有机会执行任务,引入随机睡眠 0~1s
。
pkg.core.context
使用sync.Pool
对*gin.Context
做了封装,使得*gin.Context
可以被复用。pkg.core.core
将gin Router
和gRPC
注册服务封装到Mux
对象中。gRPC
链接的负载均衡,负责持久链接并且自动切换可用服务。
gin
viper
gorm
validator
()- Gorm-Gen
Gorm
官方提供的Model
方法生成工具 - gRPC-load-balance
gRPC
的链接的负载均衡。 - Nacos-Go 官方提供
SDK
包
Consul
服务注册发现Loki
日志收集监控Nacos
配置文件管理中心Grafana
数据可视化Prometheus
数据监控