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