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 连接