Go 语言项目开发实战
孔令飞
腾讯云专家工程师,前 Red Hat、联想云工程师
41031 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 61 讲
Go 语言项目开发实战
15
15
1.0x
00:00/00:00
登录|注册

特别放送 | 分布式作业系统设计和实现

删除过期的secret
插件化任务添加
支持多种任务类型
项目契合
分布式
使用github.com/go-redsync/redsync
使用github.com/robfig/cron
例: distribworks/dkron
系统自带定时工具
例: github.com/robfig/cron
使用time包方法
上一次任务开始后间隔一段时间执行
上一次任务完成后间隔一段时间执行
在指定时间点执行
例: 监听状态变化执行异步逻辑
例: 每天清理数据库无用数据
实现新的watcher
思考不同类型的任务需求
禁用长时间未登录用户
用户登录状态检查
taskWatcher结构体
优雅关停处理
任务注册与调度
github.com/go-redsync/redsync.Redsync实例
github.com/robfig/cron.Cron实例
iam-watcher服务
特点
分布式互斥锁
任务框架封装
开源作业系统
Linux crontab
Go包支持
自开发服务
间隔性定时任务
间隔任务
定时任务
轮询数据库状态
定时执行任务
总结与课后练习
task watcher实现
IAM作业系统核心实现
IAM作业系统实现
作业系统的常见实现方式
任务分类
Go项目开发中的作业系统需求
分布式作业系统实现

该思维导图由 AI 生成,仅供参考

你好,我是孔令飞,我们又见面了。结课并不意味着结束,我非常高兴能持续把好的内容分享给你,也希望你能继续在留言区与我保持交流,分享你的学习心得和实践经验。
今天这一讲,我们来聊聊如何设计分布式作业系统。在实际的 Go 项目开发中,我们经常会遇到下面这两个功能需求:
想定时执行某个任务,例如在每天上午 10:00 清理数据库中的无用数据。
轮训数据库表的某个字段,根据字段的状态,进行一些异步的业务逻辑处理。比如,监听到 table_xxx.status = 'pending' 时,执行异步的初始化流程,完成之后设置 table_xxx.status='normal'
这两个在 Go 项目开发中非常常见、基础的功能需求,通常可以通过作业系统来实现。IAM 为了解决这种常见的功能需求,也开发了自己的作业系统。今天这一讲,我们就来看下 IAM 是如何实现作业系统的。

任务分类

在介绍作业系统之前,这里先来看下任务的分类。理解任务的分类,有助于我们理解作业系统执行的任务类型,进而有助于我们设计作业系统。
在我看来,任务可以分为下面 3 类。
定时任务:定时任务会在指定的时间点固定执行。只要到达执行任务的时间点,就会执行任务,而不管上一次任务是否完成
间隔任务:上一次任务执行完,间隔一段时间(如 5 秒、5 分钟),再继续执行下一次任务。
间隔性定时任务:间隔任务的变种,从上一次任务开始执行时计时,只要间隔时间一到,便执行下一次任务,而不管上一次任务是否完成
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文介绍了在Go项目开发中实现分布式作业系统的常见需求和解决方案。首先探讨了任务的分类,包括定时任务、间隔任务和间隔性定时任务,并介绍了作业系统的常见实现方式。作者详细介绍了四种执行间隔/定时任务的方式,包括基于`time`包的方法、使用Go包、Linux的crontab执行定时任务以及使用开源的作业系统。随后重点介绍了Linux crontab的使用方法和优缺点。文章还列举了一些受欢迎的Go语言开发的作业系统,包括`dkron`、`gocron`和`cronsun`,并提出了如何选择适合自己的开源项目的建议。此外,文章还介绍了`github.com/robfig/cron`和`github.com/go-redsync/redsync`的使用方法。最后,总结了IAM作业系统的特点,包括分布式、与项目契合紧密、支持多种类型的任务以及可插件化地加入新的周期/定时任务。整体而言,本文为读者提供了在Go项目开发中设计和实现分布式作业系统的有益参考。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Go 语言项目开发实战》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(10)

  • 最新
  • 精选
  • 惟新
    我算是拿下一血了嘛?

    作者回复: 是!

    2021-12-19
    3
  • wei 丶
    如果程序新上执行程序或者修改过了重新上线 怎么做到平滑上线呢

    作者回复: 以deployment的形式部署在kubernetes上。 deployment设置多副本,更新时,采用滚动更新的方式

    2022-04-25
  • Bradford
    感觉可以用k8s的job和cronjob

    作者回复: 用k8s的job和cronjob就有点重了

    2022-04-21
  • wei 丶
    老师,如果有 需要下一次任务 也有 不需要跳过的 这种怎么弄呀

    作者回复: 没太明白你的需求

    2022-04-15
    3
  • fliyu
    虽然结课了,但是还是希望作者继续分享更多实战文章

    作者回复: 后续会继续分享!

    2022-01-25
  • Geek_Harlin
    nice 最近刚好在改写项目的这块设计~
    2021-12-22
    4
  • 科科人神
    作者太良心了
    2021-12-19
    3
  • Geek_854810
    这篇真的是意外收获,我想用go语言实现一个作业管理和调度系统,想用这课程里面开发项目的知识,结果正好还有契合的业务知识讲解。这里面的任务,支不支持提交类的?就是根据用户提交的命令,比如执行一个shell脚本或者一条shell命令,维护一个task queue,类似有界阻塞队列,用户提交就是生产,执行就是消费,不需要并发,只要逐个的去执行,带一个结果回调通知就行。这种是否还需要自己写代码,还是用间隔任务的功能就行。当然,自己写,好像也可以写一下。
    2023-01-15归属地:上海
    1
  • Wongkakui
    没有考虑machineny 吗,这个框架主要作为异步任务调度框架,定时任务也算异步任务一种,并且定时任务模块也是基于cron 实现的
    2023-03-05归属地:广东
  • helloworld
    将计划任务独立成一个服务的确是相对优雅的解决方案,👍
    2022-05-04
收起评论
显示
设置
留言
10
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部