为开源项目 go-gin-api 增加后台任务模块

任务管理界面 (WEB)

为开源项目 go-gin-api 增加后台任务模块

支持在 WEB 界面 中对任务进行管理,例如: 新增任务编辑任务启用/禁用任务手动执行任务 等。

任务的属性包括:

  • 任务名称
  • 执行方式
  • SHELL
  • HTTP
  • 表达式(/5 * * *)
  • 命令
  • 超时时间(秒)
  • 重试次数
  • 重试间隔(秒)
  • 执行结束是否通知
  • 不通知
  • 失败通知
  • 结束通知
  • 结果关键字匹配通知
  • 状态
  • 备注

当执行方式为 HTTP 时,支持选择请求方式 GETPOST

当设置执行结束通知时,支持选择通知方式 邮件 或 Webhook

当设置邮件通知时,支持输入邮箱地址多个用,分割;

当设置结果关键字匹配通知时,支持输入关键字多个用,分割;

任务增加完成后,会把任务数据持久化到 MySQL 中。

任务调度器

参考了两个开源组件:

最终选择使用 jakecoffman/cron ,后者是在前者的基础上做了一定的补充,例如 AddFunc() 增加了 name 参数,同时还增加了 RemoveJob(name string) 支持删除特定的任务。

// AddFunc adds a func to the Cron to be run on the given schedule.

func (c *Cron) AddFunc(spec string, cmd func(), name string) {
    c.AddJob(spec, FuncJob(cmd), name)
}

...

// RemoveJob removes a Job from the Cron based on name.

func (c *Cron) RemoveJob(name string) {
    if !c.running {
        i := c.entries.pos(name)

        if i == -1 {
            return
        }

        c.entries = c.entries[:i+copy(c.entries[i:], c.entries[i+1:])]
        return
    }

    c.remove <- name } < code></->

对其简单封装下就可以使用了,下面是封装的方法,方法的具体实现与使用从 go-gin-api 中获取。

type Server interface {
    i()

    // Start &#x542F;&#x52A8; cron &#x670D;&#x52A1;
    Start()

    // Stop &#x505C;&#x6B62; cron &#x670D;&#x52A1;
    Stop()

    // AddTask &#x589E;&#x52A0;&#x5B9A;&#x65F6;&#x4EFB;&#x52A1;
    AddTask(task *cron_task_repo.CronTask)

    // RemoveTask &#x5220;&#x9664;&#x5B9A;&#x65F6;&#x4EFB;&#x52A1;
    RemoveTask(taskId int)

    // AddJob &#x589E;&#x52A0;&#x5B9A;&#x65F6;&#x4EFB;&#x52A1;&#x6267;&#x884C;&#x7684;&#x5DE5;&#x4F5C;&#x5185;&#x5BB9;
    AddJob(task *cron_task_repo.CronTask) cron.FuncJob
}

当调用 Start() 启动服务时,会把 MySQL 中的任务列表加载到调度器中。

通过以上方法,当从 WEB &#x754C;&#x9762; 操作 新增、编辑、启用/禁用、手动执行任务时,可以动态的对调度器中的任务进行管理。

任务执行器

任务执行器指的是任务真实执行所在的机器。

我的思路是使用 Kafka 的发布与订阅功能,当调度器发现需要执行的任务时,将任务信息写到 KafkaTopic 中,任务执行器订阅相关的 Topic 获取任务信息然后执行任务。

如果任务的执行方式为 HTTP,那么任务执行器可以为一组集群,专门处理调用 HTTP 任务,这里可以为一个消费组( Consumer Group),也可适具体场景而定。

如果任务的执行方式为 SHELL,那么任务执行器必须在脚本所在的宿主机上,这里可以为一个具体任务的消费者。

如果任务量过多,可以考虑根据业务场景多设置几个 Topic

在项目中为了便于演示,不写入到 Kafka 中,仅记录了日志。

func (s *server) AddJob(task *cron_task_repo.CronTask) cron.FuncJob {
    return func() {
        s.taskCount.Add()
        defer s.taskCount.Done()

        msg := fmt.Sprintf("&#x5F00;&#x59CB;&#x6267;&#x884C;&#x4EFB;&#x52A1;&#xFF1A;(%d)%s [%s]", task.Id, task.Name, task.Spec)
        s.logger.Info(msg)
    }
}

日志目录: /logs/go-gin-api-cron.log

小结

本文纯属抛砖引玉,有问题,欢迎批评指正。

go-gin-api 项目安装简单,开箱即用,创建一个后台任务试试吧。

推荐阅读

Original: https://www.cnblogs.com/xinliangcoder/p/15230197.html
Author: 新亮笔记
Title: 为开源项目 go-gin-api 增加后台任务模块

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/516616/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Go xmas2020 学习笔记 01-14 上篇

    课程地址 go-class-slides/xmas-2020 at trunk · matt4biz/go-class-slides (github.com) 主讲老师 Matt …

    Go语言 2023年5月25日
    069
  • Go语言 异常panic和恢复recover用法

    背景:Go语言追求简洁优雅,所以,Go语言不支持传统的 try…catch…finally 这种异常,因为Go语言的设计者们认为,将异常与控制结构混在一起会…

    Go语言 2023年5月29日
    045
  • Sentinel-Go 源码系列(一)|开篇

    大家好呀,打算写一个 Go 语言组件源码分析系列,一是为了能学习下 Go 语言,看下别人是怎么写 Go 的,二是也掌握一个组件。 本次选择了 Sentinel-Go,一是对 Jav…

    Go语言 2023年5月25日
    058
  • gRPC in ASP.NET Core 3.x — Protocol Buffer(2)Go语言的例子(下)

    第一篇文章(大约半年前写的):https://www.cnblogs.com/cgzl/p/11246324.html gRPC in ASP.NET Core 3.x &#821…

    Go语言 2023年5月29日
    0100
  • 十分钟学会Golang开发gRPC服务

    gRPC是Google发起的一个开源RPC框架,使用HTTP/2传输协议,使用Protocol Buffers编码协议,相比RESTful框架的程序性能提高不少,而且当前流行的编程…

    Go语言 2023年5月25日
    067
  • Go语言:包管理基础知识

    起因是,遇到一个问题: 经查阅资料,很可能跟包管理有关,之前有了解过忘了就再学一遍顺便解决问题。 学习资料: GO111MODULE 是个啥? – 知乎 (zhihu….

    Go语言 2023年5月25日
    055
  • Go基础知识梳理(二)

    Go基础知识梳理(二) 简单函数的定义 //&#x6709;&#x53C2;&#x6570;&#x6709;&#x8FD4;&#x5…

    Go语言 2023年5月25日
    044
  • AES加解密(golang <--> crypto-js)

    AES(Advanced Encryption Standard) 是一种对称加密算法,是比 DES 更好的对称加密算法类。 使用AES,在前后端之间传送密码等相关数据时,能简单高…

    Go语言 2023年5月25日
    043
  • GO的URL合法性检查

    原文连接:https://www.zhoubotong.site/post/67.html Go 标准库的net/url包提供的两个函可以直接检查URL合法性,不需要手动去正则匹配…

    Go语言 2023年5月25日
    074
  • GO语言常用时间工具类 timeUtil.go

    package util import “time” /*获取时间戳(纳秒)Testner 20210123/func GetTime_UnixNano()…

    Go语言 2023年5月29日
    065
  • 通过Go语言创建CA与签发证书

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Go语言 2023年5月25日
    051
  • GopherCon SG 2019 “Understanding Allocations” 学习笔记

    本篇是根据 GopherCon SG 2019 “Understanding Allocations” 演讲的学习笔记。 Understanding All…

    Go语言 2023年5月25日
    035
  • Go单元测试实践

    单元测试通常用来在日常开发中检查代码中存在的问题,是提升代码质量一种有效手段。在保证代码功能没有问题的同时,可以得到预期结果。Golang有许多优秀的框架支持UT,下面列举日常开发…

    Go语言 2023年5月25日
    065
  • Go能实现AOP吗?

    hello~大家好,我是小楼,今天分享的话题是 Go&#x662F;&#x5426;&#x80FD;&#x5B9E;&#x73B0;AOP?…

    Go语言 2023年5月25日
    069
  • Golang的GC回收机制

    GC触发的条件 v1.3版本 标记清除法 第一步,找出不可达的对象,做上标记。 第二部,回收没有被标记的对象。 缺点:在标记的时候会进行STW(Stop the world) St…

    Go语言 2023年5月25日
    045
  • Go汇编语法和MatrixOne使用介绍

    目录 MatrixOne数据库是什么? Go汇编介绍 为什么使用Go汇编? 为什么不用CGO? Go汇编语法特点 操作数顺序 寄存器宽度标识 函数调用约定 对写Go汇编代码有帮助的…

    Go语言 2023年5月25日
    080
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球