任务调度

job 包提供声明式周期性任务调度抽象。

概念说明
Spec任务规格(Name + Schedule/Every + Handler + Timeout)
Scheduler调度器接口(Register/Start/Stop)
interval.Scheduler内置实现:固定间隔,每 Job 独立 goroutine + Ticker
JobComponentcomponents 适配器:声明式注册 + 自动启停
JobRegistration单个 Job 包装为组件

设计权衡

维度选择理由
内置调度器time.Ticker 固定间隔零依赖、覆盖 80% 用例(心跳/上报/清理)
Cron 表达式plugins/job/croncron 解析复杂,且需要 robfig/cron 依赖
首次执行立即执行(不延迟一个周期)心跳类任务不应延迟首次上报
并发模型每 Job 独立 goroutine隔离故障,单 Job panic 不影响其他
错误处理默认 log.Error,可注入 ErrorHandler用户可对接告警/重试系统

使用方式

 1import (
 2    "github.com/go-zeus/zeus/components"
 3    "github.com/go-zeus/zeus/job"
 4    "github.com/go-zeus/zeus/job/interval"
 5)
 6
 7heartbeat := job.Spec{
 8    Name:  "heartbeat",
 9    Every: 30 * time.Second,
10    Handler: func(ctx context.Context) error {
11        return reportHeartbeat(ctx)
12    },
13    Timeout: 5 * time.Second,
14}
15
16app := components.NewApp(
17    components.NewJobComponent(interval.New()),
18    components.NewJobRegistration(heartbeat),
19)
20app.Run()

URL scheme 切换调度器实现

通过 job.NewSchedulerFromURL 用 URL 字符串切换 interval / cron 实现:

1import (
2    _ "github.com/go-zeus/zeus/job/interval"       // 注册 interval://
3    _ "github.com/go-zeus/zeus/plugins/job/cron"   // 注册 cron://(需在 go.mod require 该插件)
4)
5
6s, _ := job.NewSchedulerFromURL("cron://?seconds=true&loc=UTC")
Scheme实现
interval://interval.New()(固定间隔)
cron://cron.New()(cron 表达式,支持 seconds=true / loc=Asia/Shanghai query 参数)

与 cluster 治理的协同

Handler 的 ctx 在 Stop 时被取消,业务可读取 ctx 内的 cluster 标记做集群差异化执行:

1job.Spec{
2    Name:  "config-reload",
3    Every: 1 * time.Minute,
4    Handler: func(ctx context.Context) error {
5        cluster := routing.FromContext(ctx) // 默认 default
6        return reloadClusterConfig(cluster)
7    },
8}

完整示例:

  • examples/16-job/:interval 调度器 + 3 个 Job + ErrorHandler 告警钩子
  • examples/17-job-cron/:cron 调度器 + URL scheme