https://github.com/cuigh/skynet
A distributed task scheduler
https://github.com/cuigh/skynet
distributed scheduler task
Last synced: 7 months ago
JSON representation
A distributed task scheduler
- Host: GitHub
- URL: https://github.com/cuigh/skynet
- Owner: cuigh
- License: mit
- Created: 2021-09-30T07:05:59.000Z (about 4 years ago)
- Default Branch: master
- Last Pushed: 2022-10-14T04:11:02.000Z (about 3 years ago)
- Last Synced: 2025-01-23T10:25:51.814Z (9 months ago)
- Topics: distributed, scheduler, task
- Language: Vue
- Homepage:
- Size: 8.19 MB
- Stars: 1
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Skynet
Skynet 是一个分布式任务调度系统。跟其它已有的任务调度系统相比,Skynet具有以下特性:
* 高性能,单集群可以轻松管理数十万任务的调度
* 高可用,只需要两个节点即可实现高可用,且可靠性会随着节点数的增加而提升
* 部署简单,默认部署方式只依赖 MongoDB 数据库
* 支持多种方式报警,如邮件、企业微信等
* 支持通过 API 远程手动触发任务## 系统架构
Skynet 由调度器、执行器、处理器、分布式锁、解析器等组件构成,系统架构图如下:

| 组件 | 说明 |
| ---- | ---- |
| 调度器 | 调度器即 Skynet 应用本身,它负责控制任务在指定时间执行 |
| 执行器 | 执行器是处理器的宿主应用,它负责跟调度器进行通讯,应该运行多个执行器实例以保证高可用 |
| 处理器 | 处理器是每个任务的业务处理逻辑 |
| 分布式锁 | 集群模式下,Skynet 实例依赖分布式锁来防止任务重复调度 |
| 解析器 | 解析器负责对执行器的地址进行解析 |
| 存储器 | 存储 Skynet 系统自身数据以及任务、作业等数据 |## 界面
### 任务管理

### 作业管理

## 安装
可以通过多种方法来安装 Skynet。
### Docker(推荐)
```shell
docker run -e DB_MONGO_SKYNET_ADDRESS=mongodb://localhost:27017/skynet --name skynet -it -p 8001:8001 cuigh/skynet
```### 手动编译
编译前端
```shell
cd ui
yarn install
yarn run build
```编译后端
```shell
go build
```编译成功后修改 app.yml 中的数据库地址,直接运行即可
```shell
skynet -config /etc/skynet/app.yml
```### 预编译二进制文件
TODO
## 执行器(Runner)
Skynet 中已经包含了一个简单的执行器服务骨架,基于它可以轻松的开发一个执行器(其它语言也可以参考其实现),示例代码如下:
```go
package mainimport (
"github.com/cuigh/auxo/app"
"github.com/cuigh/auxo/app/flag"
"github.com/cuigh/auxo/net/web"
"github.com/cuigh/skynet/runner"
)func main() {
app.Name = "skynet-runner"
app.Version = "0.1"
app.Desc = "A test runner for Skynet"
app.Flags.Register(flag.All)
app.Action = runner.Serve(web.Default(":8002"))
app.Start()
}func init() {
// register handlers
runner.RegisterFunc("Test1", func(job *contract.Job) error {
print(job.Task, job.Id)
return nil
})
runner.RegisterFunc("Test2", func(job *contract.Job) error {
print(job.Task, job.Id)
return nil
})
}
```## TODO
* 多语言支持
* 支持更多报警方式,如钉钉、Slack等
* 远程调用 Token 管理
* 支持将任务拆分成多个子任务并发执行