开源任务调度框架

news2024/11/14 20:55:55

本文主要介绍一下任务调度框架Flowjob的整体结构,以及整体的心路历程。

功能介绍

flowjob主要用于搭建统一的任务调度平台,方便各个业务方进行接入使用。 项目在设计的时候,考虑了扩展性、稳定性、伸缩性等相关问题,可以作为公司的任务调度中间件被使用。

当前项目的主要稳定版本为2.x,并且在2.x版本中提供了相应的前端页面配合使用。

项目地址

https://github.com/limbo-world/flowjob

在线试用

在线试用

账号:flowjob

密码:fjdemo

功能介绍

flowjob主要分为以下几个部分:

  • Broker:管控节点,对配置好的任务在集群进行负载,调度任务并下发Agent,同时管理和维护Agent/Worker节点注册等。
  • Agent:代理节点,接收下发的Job信息,生成Task下发给Worker执行,处理Job的生命周期,比如工作流流转等。可以独立部署,也可以依赖宿主启动。
    同时此节点可以减少广播/Map/MapReduce等分片任务导致Broker存在的数据/性能压力,以及云原生环境下一些启停导致的数据问题。
  • Worker:工作节点,主要负责Task的具体执行。
  • Console:通过Broker提供的Api,进行任务创建/更新等一些管控操作。
  • Registry:注册中心,目前使用DB做为注册中心。提供了对应接口,可以基于其它组件如zk、nacos等进行灵活的封装。
  • Datasource:数据库用于持久化运行数据

在这里插入图片描述

调度类型

  • 固定速度:作业创建后,每次调度下发后,间隔固定时间长度后,再次触发作业调度。
  • 固定延迟:作业创建后,每次作业下发执行完成(成功或失败)后,间隔固定时间长度后,再次触发作业调度。
  • CRON:通过CRON表达式指定作业触发调度的时间点。

负载策略

  • 随机:将作业随机下发给某一个worker执行。
  • 轮询:将任务逐个分配给worker。
  • 最不经常使用:将作业下发给一个时间窗口内,接收作业最少的worker。
  • 最近最少使用:将作业下发给一个时间窗口内,最长时间没有接受worker的worker。
  • 一致性hash:同样参数的作业将始终下发给同一台机器。
  • 指定节点:让作业指定下发到某个worker执行。

节点过滤方式

  1. 执行器:任务只会下发给包含任务对应执行器的worker。
  2. 标签:任务只会下发给包含指定标签的worker。
  3. 容量:基于worker的任务队列/CPU/内存使用情况过滤

任务触发方式

  • API:通过指定api触发任务执行。
  • 调度:Broker自动组装数据,调度对应的任务。

任务类型

按大体配置分为:

  • 普通任务:只会执行一个Job。
  • 工作流任务:DAG视图,可以串联Job

按Job类型分为:

  • 普通:对应某个执行器,执行结束任务结束。
  • 广播:在下发的时间点,对每个可下发的节点下发任务,所以子任务执行完成当前任务才执行完成。
  • Map:分为sharding和map两个步骤。sharding的时候进行分片,map则对每个拆分任务进行执行。
  • MapReduce:相比于Map多了Reduce过程,可以对所有Map任务的执行结果进行一个汇总。

经历分享

会接触任务调度系统也是因为工作原因。其实在平时工作中很多时候接触比较多的是Quartz、xxl-job这两款框架。然后之前工作中我们组内使用的是light-task-scheduler(此框架也是当时项目组的前辈做的)。但是在使用过程中,我们发现存在一些不太便利的问题,比如没法动态进行配置,有些时候可能需要高配置节点跑数据,没法指定节点,我们的任务存在关联关系,当时只能通过代码写逻辑来实现等等。所以和之前同事也是在后面慢慢开始打算自己着手搞一个出来。

项目兜兜转转也是经历和好几年的时间才终于能有一个相对满意的2.x版本出来。开发这样一个分布式系统,其实耗费的精力十分大,由于是工作之余进行整体方案设计和功能开发,总会被这样那样的事情打断,中间因为一些个人原因以及时间分配问题,也是中断了好多次。

项目过程中,你要考虑,分布式场景下如何保证任务的重试,如何判断长时间的任务是否还在正常执行,还得考虑任务越来越多节点压力过高的挑战。

希望本项目可以帮助大家理解分布式系统中存在的问题和如何解决这类问题。代码中有很多不足也是希望大家能帮忙指出一起进步。后续有时间会继续更新项目中存在的难点,以及项目中的解决思路。

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

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

相关文章

UART中的奇偶校验和粘性奇偶校验(stick parity)

1.UART传输 UART传输分为起始位,数据位,奇偶校验位,停止位,我们这里详细介绍一下奇偶校验位。 2.奇偶校验位 奇偶校验是一种常见的校验位方法,用于检测数据传输中的错误。 奇校验:数据位的1的个数加上附加…

TensorFlow入门(十八、激活函数)

激活函数是什么? 单个神经元的网络模型: 用计算公式表达如下: 即在神经元中,输入的x通过与权重w相乘,与偏置量b求和后,还被作用了一个函数,这个函数就是激活函数。 激活函数的作用 如果没有激活函数,整个神经元模型就是一个简单的线性方程。而在现实生活中,线性方程能解决的事…

常见Http请求形式

一、请求参数的类型 我们在做boot项目时,常常会向接口发起请求,有些请求需要附带一些参数,比如说分页查询,就需要带上pageNum(当前页)和pageSize(页面大小)等参数 有两种方式可以传递这样的参数 query类型,参数通过…

【Linux系统KVM虚拟机实战】LVM逻辑卷之磁盘扩容

【Linux系统KVM虚拟机实战】LVM逻辑卷之磁盘扩容 一、LVM与KVM介绍1.1 LVM介绍1.2 KVM介绍1.2.1 KVM简介1.2.2 KVM优点二、本次实践介绍2.1 本次实践简介2.2 环境规划三、虚拟机环境检查3.1 检查KVM虚拟机磁盘空间3.2 KVM虚拟机检查系统情况3.3 检查物理磁盘分区3.4 查看PV状态…

②. GPT错误:图片尺寸写入excel权限错误

꧂问题最初 ꧁ input输入图片路径 print图片尺寸 大小 长宽高 有颜色占比>0.001的按照大小排序将打印信息存储excel表格文件名 表格路径 图片大小 尺寸 颜色类型 占比信息input输入的是文件就处理文件 是文件夹📁就处理文件。路径下的图片 1. 是处理本路径图片 …

数据结构-----哈夫曼树和哈夫曼编码

目录 前言 哈夫曼树的实现 1.储存结构 2.创建初始化哈夫曼树 3.完整哈夫曼树创建 4.计算总权值 哈夫曼编码 完整代码 前言 前面我们学习过了哈夫曼树和哈夫曼编码的基础知识(链接:哈夫曼树哈夫曼编码必知必会知识_Gretel Tade的博客-CSDN博客&…

内排序算法

排序算法是面试中常见的问题,不同算法的时间复杂度、稳定性和适用场景各不相同。按照数据量和存储方式可以将排序算法分为 内排序(Internal Sorting)和 外排序(External Sorting)。 内排序是指对所有待排序的数据都可…

wifi管理软件 WiFi Signal mac中文介绍

WiFi Signal mac是一款WiFi信号强度监测工具,它可以帮助用户实时监测WiFi信号的强度、频率、噪声等信息,并提供详细的图表和统计数据。 WiFi Signal可以自动扫描附近的WiFi网络,并显示它们的信号强度和频率。用户可以通过WiFi Signal来找到最…

Android斩首行动——应用层开发Framework必知必会

前言 相信做应用层业务开发的同学,都跟我一样,对Framework”深恶痛绝“。确实如此,如果平日里都在做应用层的开发,那么基本上我们很少会去碰Framework的知识。但生活所迫,面试总是逃不过这一关的,所以作为…

第二证券:A股公司首批三季报出炉 柏楚电子、平煤股份业绩一增一减

10月10日晚,柏楚电子、平煤股份拉开了A股公司三季报发表序幕。来自激光切开控制体系赛道的柏楚电子,前三季度营收、净利润均完结较大崎岖增加;焦煤龙头企业平煤股份,受煤价跌落连累成果,前三季度营收、净利润均有所下降…

Java架构师缓存性能优化

目录 1 缓存的负载策略2 缓存的序列化问题3 缓存命中率低4 缓存对数据库高并发访问5 缓存数据刷新的策略6 何时写缓存7 批量数据来更新缓存8 缓存数据过期的策略9 缓存数据如何恢复10 缓存数据如何迁移11 缓存冷启动和缓存预热1 缓存的负载策略 如果说我们在缓存架构设计当中啊…

优思学院|八大浪费深度剖析

在工作流程中消除浪费是精益思想的目标。在深入探讨八大浪费之前,了解浪费的定义至关重要。浪费是指工作流程中的任何行动或步骤,这些行动或步骤不为客户增加价值。换句话说,浪费是客户不愿意为其付费的任何过程。 最初的七大浪费&#xff0…

第83步 时间序列建模实战:Catboost回归建模

基于WIN10的64位系统演示 一、写在前面 这一期,我们介绍Catboost回归。 同样,这里使用这个数据: 《PLoS One》2015年一篇题目为《Comparison of Two Hybrid Models for Forecasting the Incidence of Hemorrhagic Fever with Renal Syndr…

Nerf 学习笔记

Nerf 学习笔记 Step 1:相机 Rays 行进(ray marching)Step 2:收集查询点Step 3:将查询点投射到高维空间(位置编码)Step 4:神经网络推理和体渲染神经网络推理体渲染计算损失 Reference: 搞懂神经辐射场 Neural Radiance Fields (Ne…

如何在一个传统的html中,引入vueJs并使用vue复制组件?

如何在一个传统的html中,引入vueJs并使用vue复制组件? 1.1 引言1.2 背景1.3 解决方案1.3.1 解决方案一:直接使用clipboard(不推荐仅供参考学习)1.3.2 解决方案二:封装指令js库后使用 (推荐) 1.1 引言 这篇博文主要分享如何在一个…

Springboot给每个接口设置traceId,并添加到返回结果中

原理 slf4j有个MDC的类,是ThreadLocal的实现,保存在这里的变量会绑定到某个请求线程,于是在该请求的线程里的日志代码都可以使用设入的变量。 实现 一、引入依赖 这个是可选项,用于生成唯一uid,我人懒&#xff0c…

一文带你了解 Linux 的 Cache 与 Buffer

目录 前言一、Cache二、Buffer三、Linux 系统中的 Cache 与 Buffer总结 前言 内存的作用是什么?简单的理解,内存的存在是为了解决高速传输设备与低速传输设备之间数据传输速度不和谐而设立的中间层(学过计算机网络的应该都知道,这…

【实战】kubeadmin安装kubernetes集群

文章目录 前言服务器介绍准备工作设置服务器静态ip修改host关闭防火墙和swap修改所需的内核参数 部署步骤安装containerd安装cri工具(效果等同于docker) 安装kubernetes集群安装网络插件flannel安装可视化面板kuboard(可选) 下期预…

42. QT中开发Android配置QFtp功能时遇到的编译问题

1. 说明 此问题仅适用在QT中开发Android程序时,需要适用QFtp功能的情况。一般情况下,如果开发的是Windows或者Linux系统下的程序,可能不会出现该问题。 2. 问题 【Android】在将QFtp的相关代码文件加入到项目中后,编译项目时会…

sql server判断两个集合字符串是否存在交集

sql server判断字符串A101;A102和字符串A102;A103是否存在交集 我们编写两个函数: 1)函数fn_split将字符串拆分成集合 create function [dbo].[fn_split](inputstr varchar(8000), seprator varchar(10)) returns temp table (Result varchar(200)) a…