使用分布式锁启动 cronjob, 保证只有一个服务执行 cronjob

使用分布式锁启动 cronjob, 保证只有一个服务执行 cronjob

package cronjob

import (
	"context"
	"time"

	"github.com/robfig/cron/v3"

	goredislib "github.com/redis/go-redis/v9"
	"github.com/go-redsync/redsync/v4"
	"github.com/go-redsync/redsync/v4/redis/goredis/v9"
)

const (
	lockKey     = "cronjoblock"
	lockTimeout = 60 * time.Second
)

func RunCronJob() {
	ctx := context.Background()

	client := goredislib.NewClient(&goredislib.Options{
        Addr:         Redis.Addr,
		Password:     Redis.Password,
		DB:           Redis.DB,
    })

    // 创建redsync的客户端连接池
    pool := goredis.NewPool(client) 

	// 创建redsync实例
	rs := redsync.New(pool)

	//创建基于key的互斥锁, 给个过期时间
	mutex := rs.NewMutex(lockKey, redsync.WithExpiry(60*time.Second))

	if err := mutex.Lock(); err != nil {
		return
	}
	c := cron.New()
	c.AddJob("13 13 * * *", cron.NewChain(cron.Recover(cron.DefaultLogger)).Then(&xxxxx{}))
	c.Start()
	select{
		case <-ctx.Done():
			if ok, err := mutex.Unlock(); !ok || err != nil {
				panic("unlock failed")
			}
			return
	}
}

你可能感兴趣的:(分布式,golang,cronjob,redis,redis,分布式锁)