【golang分布式Job调度服务】

news2024/11/17 2:51:17

需求背景

目前各服务里经常会有定时任务相关需求,而定时任务通常要求同时只有一个任务执行,为了保证定时任务高可以通常也需要主备部署,导致开发定义任务时需要考虑锁竞争关系,以及考虑任务执行状态(成功、失败、重试等)。因此考虑实现一个统一的分布式任务调度服务,解决如下问题:

  • 支持一次性执行任务(一次性任务可以延迟执行);
  • 支持cron方式定时执行任务;
  • 任务分布式执行,高可用支持;
  • 支持简单任务状态统一监控(记录执行状态);
  • 支持任务重试机制。
  • 技术调研&选型

machinery(开源分布式任务调度框架)

machinery 是一个基于消息队列的分布式任务调度框架,由Server、broker、worker、backend 这么几个概念组成:

  • Server:业务模块,生成具体任务,可根据业务逻辑中,按交互进行拆分;
    Broker:存储具体序列化后的任务,machinery中目前支持到Redis, AMQP,和SQS;
    Worker:工作进程,负责消费者功能,处理具体的任务;
    Backend:后端存储,用于存储任务执行状态的数据;
    使用使用Server 作为任务生产和任务触发,backend 用作任务运行状态结果存储, machinery分布式框架不能满足定时触发的需求,因此还需要引入cron 定时任务框架,该定时任务框架是基于本地时间的定时任务框架,因此还需要结合分布式锁来保证同时只能触发一次任务。因此整体设计方案大致如下:
    在这里插入图片描述
    由上图我们可以看到系统主要由2部分组成,分布式任务中心和客户端。

分布式任务中心

分布式任务中心用来管理任务、监控、调度、监听任务执行结果等。

  • 任务管理:增删查改定时执行任务
  • 定时任务监控:监控新的待执行任务,发现后创建新的触发器,失效删除后的定时任务配置
  • 推送待执行的任务到消息队列
  • 监听任务执行结果
  • 接收客户端主动触发推过来的异步任务。

客户端

客户端是分布式任务执行的组成单元,通过监听自己能执行的任务队列,来执行任务

  • 任务接收器:接收到任务后将任务分配给worker执行
  • 任务执行woker: 负责执行具体的任务
  • 执行结果推送:将任务执行结果推送到消息队列
  • 一致性任务触发: 部署异步任务只需满足某个条件时,就触发到消息队列中。

任务参数

任务参数1: {“name”:“task1”,“params”:[“params1=x1”,“params2=x2”], “cron_time”:“*/1 * * * ?”}

业务A 任务管理器 数据库 1.1 创建定时任务 1 1.2 保存定时任务配置 2 loop [监听任务创建事件端口] 业务A 任务管理器 数据库
定时任务创建器 数据库 任务触发器 任务队列 2.1 分布式锁 1 2.2 查询定时任务配置 2 2.3 创建定时触发器 3 loop [定时任务创建循环] 2.4 定时创建任务并推送 4 loop [定时触发任务] 定时任务创建器 数据库 任务触发器 任务队列
任务执行器 任务队列 任务结果队列 3.1 读取任务 1 3.2 执行任务 2 3.3 推送任务执行结果 3 loop [监听任务队列消息] 任务执行器 任务队列 任务结果队列
结果处理器 任务结果队列 数据库 4.1 读取任务结果 1 4.2 保存任务结果 2 loop [监听任务结果队列消息] 结果处理器 任务结果队列 数据库

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/339313.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Lambda表达式了解到使用(清晰明朗)

这里写目录标题lambda简述以前的实现初次使用lambda表达式Lambda表达式的语法测试方法lambda表达式简写示范测试方法运行结果方法引用测试方法运行结果构造方法引用定义一个Boy类编写测试方法运行结果实际应用测试代码运行结果内置函数式接口FunctionalInterface注解Functional…

自从学会了Python,我实现了壁纸自由(6)

小朋友们好,大朋友们好!我是猫妹!哈哈哈,又到周末啦!这周过得怎么样?马上就要开学了,寒假作业早已写好了吧?开学让人兴奋,上了很久网课都要吐啦!开学也让人有…

HTTPS为什么就安全了?或者说要安全我们要做到什么?

目录 一 安全概念 二 HTTPS的安全措施 三 总结 一 安全概念 网络安全是一个比较笼统的概念。我们说网络安全的时候,往往会包含很多安全问题,包括网络设备层面、通信过程、数据本身等多方面引入的安全问题。比如设备被有意无意的破坏,链路…

【C/C++基础练习题】简单函数练习题

🍉内容专栏:【C/C要打好基础啊】 🍉本文内容:简单函数使用练习题(复习之前写过的实验报告) 🍉本文作者:Melon西西 🍉发布时间 :2023.2.11 目录 1.给定某个年…

右键菜单管理 - Win系统

右键菜单管理 - Win系统前言软件工具管理右键菜单360右键管理右键管家前言 Windows系统可以借助软件工具对右键菜单进行管理,可对指定的右键菜单进行删除和恢复。下面以Win10系统为例介绍管理方法。 注意:使用本文提及的工具将某软件的右键菜单删除后&…

电子货架标签多种固定方式

2.1寸和2.9寸电子价格标签多种固定方式: 1、桌面支架,放置在桌面或是货架上,用于桌面产品的价格或是信息显示 2、粘贴架,方便用于墙面桌面等应用 3、半透明支架,用于货架上的商品吊挂显示价格信息 4、轨道架&#xff…

1489车厢调度(train)(栈)

目录 题目描述 解题思路: 代码部分: 题目描述 有一个火车站,铁路如图所示,每辆火车从A驶入,再从B方向驶出,同时它的车厢可以重新组合。假设从A方向驶来的火车有n节(n≤1000)&…

使用动态参数构建CUDA图

文章目录使用动态参数构建CUDA图使用显式 API 调用构建 CUDA 图使用流捕获构建 CUDA 图组合方法执行结果总结使用动态参数构建CUDA图 自从在 CUDA 10 以来,CUDA Graphs 已被用于各种应用程序。 上图将一组 CUDA 内核和其他 CUDA 操作组合在一起,并使用指…

shell编程之sed

文章目录八、shell编程之sed8.1 工作原理8.2 sed基本语法8.3 模式空间中的编辑操作8.3.1 地址定界8.3.2 常用编辑命令8.4 sed扩展八、shell编程之sed 8.1 工作原理 sed是一种流编辑器,它是文本处理中非常有用的工具,能够完美的配合正则表达式使用&…

图----无向图

1.定义 图的定义:图是由一组顶点和一组能够将两个顶点相连的边组成 边:edge 顶点:vertex 连通图:如果从任意一个顶点都存在一条路径到达另外一个任意顶点,我们称这幅图是连通图。 非连通图:由若干连通的…

【Python】tkinter messagebox练习笔记

我一好友在朋友圈看到人家用代码花式秀恩爱,让我也做一个,我就用我学习半年python的功力,做了这一个东西。🙏窗口主页面(图一)为了让我这个盆友有颜面,特意做了一个问答问他帅不帅,以…

Active Directory 02 - Windows Kerberos Authentication(Kerberos 协议鉴权)

写在最前 如果你是信息安全爱好者,如果你想考一些证书来提升自己的能力,那么欢迎大家来我的 Discord 频道 Northern Bay。邀请链接在这里: https://discord.gg/9XvvuFq9Wb我会提供备考过程中尽可能多的帮助,并分享学习和实践过程…

从0到1一步一步玩转openEuler--11 openEuler基础配置-设置磁盘调度算法

11 openEuler基础配置-设置磁盘调度算法 文章目录11 openEuler基础配置-设置磁盘调度算法11.1 设置磁盘调度算法11.1.1 临时修改调度策略11.1.2 永久设置调度策略11.1 设置磁盘调度算法 本节介绍如何设置磁盘调度算法。 11.1.1 临时修改调度策略 例如将所有IO调度算法修改为…

js逆向-某头条_signature参数

前言 头条的加密参数_signature其实可以通过搜索来直接定位到关键位置,我们换种定位的方法 定位 先查看下堆栈,直接在第一个XMLHttpRequest.send的位置下上断点,然后下拉触发断点 这个位置还有其他请求,这里只看/api/pc/list…

2023 AIME 答案与解析 - 第二期(完结)

原题目 Find the number of cubic polynomials where and are integers in such that there is a unique integer with 绿树教育中心独家解析 是一个有两个整数根的三次方程,因此它有三个整数根。所以, 或 ,其中 。 「Case 1」 ,则…

关于spring bean的生命周期的个人理解(根据官方文档学习)

首先说一下Servlet的生命周期:实例化,初始init,接受service,销毁destroy; spring上下文中的Bean 生命周期也是类似,如下: (1)实例化Bean 对于Bean Factory容器&#xf…

elasticsearch更新和删除

文档更新文档的更新经历三个步骤,检索、修改、重新索引部分更新在原有文档已经存在的情况下,可以对原有的文档部分字段更新,使用POST请求,发送到/_update如果文档是不存在的,更新操作是失败的存在则更新,不…

Qt C++ 自定义仪表盘控件02

简介仪表盘是工控领域不可缺少的一类软件UI元素,通常出现在各类电子看板软件上,以及一些高级的上位机软件界面上,目的是将繁杂的数据转化为可视化的图表能大幅提高后台管理效率。本文分享了几个经典常用的仪表盘控件,在项目中可以…

利用升序定时器链表处理非活动连接

参考自游双《Linux高性能服务器编程》 背景 服务器同常需要定期处理非活动连接:给客户发一个重连请求,或关闭该连接,或者其他。我们可以通过使用升序定时器链表处理非活动连接,下面的代码利用alarm函数周期性的触发SIGALRM信号&a…