帶有分散式鎖的Go計劃任務排程器- DEV

banq發表於2021-08-04

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 連線
 

相關文章