业务场景:该服务需要每隔固定时间同步一次数据库,服务部署在多台机器,我们只希望同时有一台机器在做同步操作。
实现:包含scheduler.go和util.go两个文件。scheduler.go跑线程,util.go通过一个锁表实现分布式。
//scheduler.go
type Scheduler struct {
}
var scheduler *Scheduler
var scheduler_once sync.Once
func GetSchedulerInstance() *Scheduler {
scheduler_once.Do(func() {
scheduler = &Scheduler{}
})
return scheduler
}
func (scheduler *Scheduler) Run() {
go scheduler.TaskRunner()
}
func (scheduler *Scheduler) TaskRunner() (int, error) {
var util Util
var conf *BaseConf
conf = GetConfInstance()
db, err := sql.Open("mysql", fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=%s",
conf.GetDBConf()[0].User,
conf.GetDBConf()[0].Password,
conf.GetDBConf()[0].Host,
conf.GetDBConf()[0].Port,
conf.GetDBConf()[0].Database,
conf.GetDBConf()[0].Charset))
if err != nil {
tars.TLOG.Error("Open database0 error: ", err)
return -1, err
}
defer db.Close()
for