前言

日常运维中难免会遇到主从切换的场景,比如机房迁移、故障机替换等待,为了平滑迁移需要先将待下线主机上的主全部切走,主从切换动作有损所以需要低峰期操作,一般都是凌晨以后,如果联动业务核心指标做好前后校验,其实是可以将该动作自动化的,如果自动化就涉及到定时执行,这里记录下在平台上通过go语言实现定时任务的简单思路

通过go语言实现定时任务有两种方法,一种是采用主机自带的crontab机制,go语言有对应的包实现,另一种是采用计时器的方式,如果采用前者,前端需要将通过时间选择器获取的时间转化为定时任务的时间格式,传参方式没有后者简单,所以选择了通过计时器实现定时任务
创建定时器

f:=func(){fmt.Println("Timer expired,begin to do next task")
}
t := time.AfterFunc(time.Duration(10)*time.Second, f)//等到10s后会启动一个协程执行函数f,t是创建的计时器,可以调用t.stop来取消该计时器

创建万定时器后,如何取消已设置的定时器?
当接受到任务取消的请求时需要知道待取消的定时器时哪个才可以执行取消操作,这就涉及到线程间的通信,一种解法是通过channel
在创建完定时器后将定时器写入到管道中,当接收到取消定时任务的请求是从管道中读取定时器然后调用其stop方法来关闭定时器

//将定时器写入到管道
taskTimer := TaskTimer{ClusterName: para.ClusterName,TimerName:   t,TaskType:    pb.TaskType_CLUSTER_MASTER_SWITCH,TimerOpt:    TIMER_OPT_TYPE_CANCEL,LogId:       logRes.LogId,}
TaskTimerChan <- &taskTimer
//当接收到取消定时任务的请求是取消定时任务
func CancelTimer() (logId int64, err error) {timerMsg, ok := <-TaskTimerChanlogId = timerMsg.LogIdif !ok {common.Log.Warn("The TaskTimerChan is closed,The routine exits normally")} else {if !timerMsg.TimerName.Stop() {err = fmt.Errorf("fail to stop timer,timer=[%v]", timerMsg)return}common.Log.Notice("has canceled the timer task,timerMsg=[%v]", timerMsg)}return
}

那么如何保证不会误操作其他的计时器?
比如创建了两个计时器t1和t2,然后点击取消t2的任务,由于消费的时候顺序读取channel中的消息,无法直接获取指定定时器名,所以会误消费消息造成其他消息丢失而无法再对其他定时器执行取消操作,将channel的长度设置为1是一种解法,不过会带来其他的问题:只允许同时存在一个计时器
如何实现同时支持多个计时器?
可以初始化多个管道,管道名和计时器名相关联,取消计时器时根据计时器名判断要消费目标管道
对于分布式系统需要考虑几个问题
如何保证定时任务不会重入?
1、通过检查数据库中是否已经存在正在执行此任务
2、写管道前先判断管道是否已满
如何保证消费的是已经写入消息的管道?
考虑一个场景,比如有两个服务,创建定时任务的请求被路由到了服务a上,而取消该定时任务的请求被路由到了服务b上,这时b上的管道没有消息,读取被阻塞,所以
1、读取前判断是否已有消息来避免读阻塞
2、引入三方组件实现分布式一致性,比如写入消息时将服务id和计时器名字存入到redis,消费时如何管道为空则从redis中获取服务id并将请求转发给他
如果要求较高,这样实现起来就复杂化了,不如采取crontab实现,要求不高,比如取消时发现管道为空报错,那就多重试几次,则可以选择计时器

Golang 实现定时任务相关推荐

  1. golang+数据库定时任务

    2019独角兽企业重金招聘Python工程师标准>>> golang+数据库定时任务 项目背景大致如下,楼主在用nodejs写项目时遇到一些需要定时去处理的事情,例如僵尸用户定时清除 ...

  2. golang的定时任务

    golang的定时任务使用的是cron这个包来解决的 官方文档地址:https://godoc.org/github.com/robfig/cron cron包的基础知识 字段名 是否必须 允许的值 ...

  3. Golang 定时任务 github/robfig/cron/v3 使用与源码解析

    Cron 源码阅读 robfig/cron/v3 是一个 Golang 的定时任务库,支持 cron 表达式.Cron 的源码真实教科书级别的存在(可能是我菜 -),真的把低耦合高内聚体现地淋漓尽致, ...

  4. go定时读取mysql_golang+数据库定时任务

    golang+数据库定时任务 项目背景大致如下,楼主在用nodejs写项目时遇到一些需要定时去处理的事情,例如僵尸用户定时清除,一些产品定时下架,邮件定时发送等等! 期初使用nodejs setTim ...

  5. Golang-常用第三方库

    Golang_学习笔记 goleak--Goroutine 泄漏防治神器 Golang 命令行工具--urfave/cli 用法 Flag 参考文档 Golang处理Excel 微服务 请求路由-mu ...

  6. golang定时任务的使用

    golang定时任务的使用 由于 golang 标准库内没有比较好的定时任务包,所以这里将使用一个第三方的 cron 包,由于此包存在一些不适用的地方,所以对此做了一些简单封装. cron简介 rob ...

  7. golang 定时任务方面time.Sleep和time.Tick的优劣对比

    目录 golang 写循环执行的定时任务,常见的有以下三种实现方式: 这三种定时器的实现原理 优劣性对比,使用建议 golang 写循环执行的定时任务,常见的有以下三种实现方式: 1.time.Sle ...

  8. Golang 基础案例集合:中文拼音转换、解析二维码、压缩 zip、执行定时任务

    前言 曾经,因为不够注重基础吃了好多亏.总是很喜欢去看那些高大上的东西,却忽略了最基本的东西.然后会错误的以为自己懂的很多,但是其实是沙堆中筑高台,知道很多高大上的架构,但是基础的东西却不太了解.我觉 ...

  9. Golang:gocron定时任务管理系统的安装与使用

    简介 gocron是一个使用Go语言开发的轻量级定时任务集中调度和管理系统, 用于替代Linux-crontab 文档 https://github.com/ouqiang/gocron 目录 1.下 ...

  10. golang context 父子任务同步取消信号 协程调度 简介

    目录 前言 为什么需要context context是什么 context的使用 总结 前言 这篇文章将介绍Golang并发编程中常用到一种编程模式:context.本文将从为什么需要context出 ...

最新文章

  1. C# “Thread类Suspend()与Resume()已过时” 解决方法(利用ManualResetEvent类)
  2. python 水位_一种适用于利用图像识别水位的水位尺的制作方法
  3. python 中五种常用的数据类型
  4. Dapr 客户端 搭配 WebApiClientCore 玩耍服务调用
  5. 语录帝——要想人前显贵,必须背地里遭罪
  6. 光纤传感技术:基于Matlab的OFDR系统数值仿真
  7. 如何查看teamviewer计算机id,TeamViewer如何设置固定ID密码?查看方法说明
  8. ITIL与DevOps
  9. 网上传说软件测试培训真的那么黑心吗?都是骗局?
  10. python画马鞍面_在matlab中怎么画马鞍面?
  11. 编写bootstrap响应式页面 就这么简单
  12. 串口通信Serial
  13. [unknown OJ] 客星璀璨之夜
  14. Legacy与UEFI
  15. 非科编程逆袭国外名校计算机专业,三本生预科逆袭世界前100名校!H同学喜获3大计算机专业本科录取...
  16. 怎样检测计算机硬件是否正常,怎么检查电脑硬件是否有問題
  17. command ‘leetcode.signin‘ not found
  18. 使用nowAPI完成一个html的天气预报小例子
  19. linux 命令集合1
  20. c语言让电脑自动加入空格,tmw字串符怎么导入_C语言如何连空格一直输入到字串符中...

热门文章

  1. 舒尔特方格 (Schulte Grid)
  2. 是你的栈啊-求你了告诉我逆波兰表达式
  3. Volatile底层实现原理
  4. Linux-DNS学习记录01-安装部署
  5. SQLite 使用(针对Android)
  6. 【CH01】创建、初始化SpringBoot项目与项目git管理
  7. 海上风电运维船未来前景如何?甲板船之家帮你解开疑问
  8. 预编译的头文件 pch.h
  9. bzoj1499(DP+单调队列)
  10. 乐动手环app下载安装_乐动健康下载app_新版本手机乐动健康手环软件下载安装 安卓版 V2.08 - 罐头安卓网...