当前位置: 首页 > news >正文

Go-zero微服务个人探究之路(十二)定时任务的选择调研

前言

很多时候后台需要做定时任务的需求,笔者的项目采用go-zero框架微服务框架,需要做定时任务,于是做了如下方法调研,共有大概三种主要选择

方案

难度总体由容易到复杂

go的timer库

通过Go的标准库time中的TickerTick功能来设置和管理定时任务,可以直接集成在服务启动逻辑中,不需要额外的文件或复杂的配置

func startTicker() {ticker := time.NewTicker(1 * time.Hour) // 每小时执行一次defer ticker.Stop()for {select {case <-ticker.C:// 执行定时任务fmt.Println("执行定时任务...")// 这里可以放置你的业务逻辑}}
}

cron库

使用robfig/cron这个Go库,作为大型复杂项目的定时任务,cron非常常见也非常强大

大概要在go-zero的服务启动文件里添加如下代码

    // 初始化Cron调度器cronScheduler := cron.New(cron.WithSeconds()) // 使用WithSeconds选项支持秒级调度// 添加定时任务_, err := cronScheduler.AddFunc("0 */1 * * * *", func() { // 每分钟执行一次// 定时任务的逻辑})if err != nil {logx.Errorf("添加定时任务失败: %v", err)return}// 启动Cron调度器cronScheduler.Start()// 停止Cron调度器defer cronScheduler.Stop()

go-queue

这是一种官方更加推荐的方法,不过需要配置消息队列集群,大概代码如下

package mainimport ("fmt""strconv""time""github.com/zeromicro/go-queue/dq"
)func main() {producer := dq.NewProducer([]dq.Beanstalk{{Endpoint: "localhost:11300",Tube:     "tube",},{Endpoint: "localhost:11301",Tube:     "tube",},})// 延迟 5s 后处理_, err := producer.Delay([]byte("hello"), time.Second*5)if err != nil {fmt.Println(err)}// 在指定时间点处理_, err = producer.At([]byte("hello"), time.Now().Add(time.Second*10))if err != nil {fmt.Println(err)}
}

总结

go-queue的方案直接被笔者排除了,不再额外配置消息队列集群,

其他两个方法比较也很明显


使用Cron库,可以在同一个调度器中管理多个任务,每个任务都有自己的Cron表达式

使用timer,如果有很多不同的任务,需要不同的时间间隔,管理这些会很麻烦


使用timer不需要引入依赖,使用cron需要引入依赖


http://www.lryc.cn/news/298899.html

相关文章:

  • Java中,List、Map和Set的区别是什么?
  • Google刚刚推出了图神经网络Tensorflow-GNN
  • 链表基础知识汇总
  • Educational Codeforces Round 2(远古edu计划)
  • 【Tauri】(1):使用Tauri1.5版本,进行桌面应用开发,在windows,linux进行桌面GUI应用程序开发,可以打包成功,使用 vite 最方便
  • 「Linux」软件安装
  • Ubuntu Desktop - Terminal 输出全部选中 + 复制
  • Java 三大并大特性-可见性介绍(结合代码、分析源码)
  • 【漏洞复现】狮子鱼CMS某SQL注入漏洞01
  • 《Java 简易速速上手小册》第6章:Java 并发编程(2024 最新版)
  • C++初阶:容器(Containers)list常用接口详解
  • HARRYPOTTER: FAWKES
  • 嵌入式Qt 第一个Qt项目
  • 【OpenHarmony硬件操作】风扇与温湿度模块
  • Vue3.4+element-plus2.5 + Vite 搭建教程整理
  • STM32Cubmax stm32f103zet6 SPI通讯
  • 每日OJ题_位运算⑤_力扣371. 两整数之和
  • Mysql中索引优化和失效
  • 使用Python+OpenCV2进行图片中的文字分割(支持竖版)
  • Qt中程序发布及常见问题
  • C语言第二十三弹---指针(七)
  • 用HTML5 + JavaScript绘制花、树
  • Science重磅_让大模型像婴儿一样学习语言
  • Java 数据结构篇-实现红黑树的核心方法
  • 【实战】一、Jest 前端自动化测试框架基础入门(中) —— 前端要学的测试课 从Jest入门到TDD BDD双实战(二)
  • 【C语言 - 力扣 - 反转链表】
  • ctfshow-php特性(web102-web115)
  • python系统学习Day1
  • Idea里自定义封装数据警告解决 Spring Boot Configuration Annotation Processor not configured
  • 【流程图——讲解】