goInterLock是具有分布式锁定机制的 golang 作业/任务调度程序。在分布式系统中,锁定是防止任务在有调度程序的每个瞬间执行,例如,如果您的应用程序有一个任务调用一些外部 API 或每 10 分钟执行一些数据库查询,则锁定阻止进程在每个实例中运行该应用程序,您最终每 10 分钟多次运行该任务。
go get github.com/ehsaniara/gointerlock
|
本地调度程序(单个应用程序)
(间隔每 2 秒)
var job = gointerlock.GoInterval{
Interval: 2 * time.Second,
Arg: myJob,
}
err := job.Run(ctx)
if err != nil {
log.Fatalf("Error: %s", err)
}
|
分布式调度器(扩展)
现有 Redis 连接
您应该已经配置了 Redis 连接并将其传递到GoInterLock. 还要确保您为每个工作提供唯一的名称
步骤1:redisConnection.Rdb从现有应用程序配置redis连接并将其传递给Job。例如:
var redisConnector = redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "myRedisPassword",
DB: 0,
})
|
第二步:将redis连接传入 GoInterval:
var job = gointerlock.GoInterval{
Interval: 2 * time.Second,
Arg: myJob,
Name: "MyTestJob",
RedisConnector: redisConnector,
}
err := jobTicker.Run(ctx)
if err != nil {
log.Fatalf("Error: %s", err)
}
|
在这两个示例中myJob都是您的任务计划功能
内置Redis连接器
另一种方法是使用现有的 redis 连接:
var job = gointerlock.GoInterval{
Name: "MyTestJob",
Interval: 2 * time.Second,
Arg: myJob,
RedisHost: "localhost:6379",
RedisPassword: "myRedisPassword", //remove this line if no pass (AUTH)
}
err := job.Run(context.Background())
if err != nil {
log.Fatalf("Error: %s", err)
}
|
上面代码表示GoInterLock 在使用go-redis进行 Redis 连接