更强大、更智能的任务调度框架 - Openjob 1.0.7 发布


多元共进|2023 Google 开发者大会精彩演讲回顾

介绍

Openjob 基于Akka架构的新一代分布式任务调度框架。支持多种定时任务、延时任务、工作流设计,采用无中心化架构,底层使用一致性分片算法,支持无限水平扩容。
  • 高可靠
  • 分布式无状态设计,采用 Master/Worker 架构,支持多样的数据库(H2/MySQL/PostgreSQL/Oracle/TiDB)
  • 高性能
  • 底层使用一致性分片算法,全程无锁化设计,任务调度精确到秒级别,支持轻量级分布式计算、无限水平扩容。
  • 定时调度
  • 支持分布式定时任务、固定频率任务、高性能秒级任务、一次性任务定时调度。
  • 分布式计算
  • 支持单机、广播、Map、MapReduce 和分片多种分布式编程模型,轻松实现大数据分布式计算。
  • 延时任务
  • 基于 Redis 实现高性能延时任务,底层实现任务多级存储,提供丰富的统计和报表。
  • 工作流
  • 内置工作流调度引擎,支持可视化 DAG 设计,简单高效实现复杂任务调度。
  • 权限管理
  • 完善的用户管理,支持菜单、按钮以及数据权限设置,灵活管理用户权限
  • 报警监控
  • 全面的监控指标,丰富及时的报警方式,便于运维人员快速定位和解决线上问题。
  • 跨语言
  • 原生支持 Java/Go/PHP/Python 多语言 ,以及Spring Boot、Gin、Swoft 等框架集成。
如果您正在寻找一款高性能的分布式任务调度框架,支持定时任务、延时任务、轻量级计算、工作流编排,并且支持多种编程语言,那么 Openjob 肯定是不二之选( https://github.com/open-job/openjob )。

更新内容

openjob 1.0.7 新增支持H2/TiDB 数据库,新增秒级任务、固定频率任务、广播任务、分片任务、Map Reduce 轻量计算。

秒级任务

秒级任务,支持1~60秒间隔的秒级延迟调度,即每次任务执行完成后,间隔秒级时间再次触发调度,适用于对实时性要求比较高的业务。 优势
  • 高可靠:秒级别任务具有高可靠的特性,如果某台机器宕机,可以在另一台机器上重新运行。
  • 丰富的任务类型:秒级别任务属于定时调度类型,可以适用于所有的任务类型和执行方式。

固定频率任务

由于Crontab必须被60整除,如果需要每隔50分钟执行一次调度,则Cron无法支持。

Map Reduce

MapReduce 模型是轻量级分布式跑批任务。通过 MapProcessor 或 MapReduceProcessor 接口实现。相对于传统的大数据跑批(例如Hadoop、Spark等),MapReduce无需将数据导入大数据平台,且无额外存储及计算成本,即可实现秒级别海量数据处理,具有成本低、速度快、编程简单等特性。  
/**
 * @author stelin [email protected]
 * @since 1.0.7
 */
@Component("mapReduceTestProcessor")
public class MapReduceTestProcessor implements MapReduceProcessor {
   private static final Logger logger = LoggerFactory.getLogger("openjob");

   private static final String TWO_NAME = "TASK_TWO";

   private static final String THREE_NAME = "TASK_THREE";

   @Override
   public ProcessResult process(JobContext context) {
       if (context.isRoot()) {
           List<MapChildTaskTest> tasks = new ArrayList<>();
           for (int i = 1; i < 5; i++) {
                tasks.add(new MapChildTaskTest(i));
           }

            logger.info("Map Reduce root task mapList={}", tasks);
           return this.map(tasks, TWO_NAME);
       }

       if (context.isTask(TWO_NAME)) {
           MapChildTaskTest task = (MapChildTaskTest) context.getTask();
           List<MapChildTaskTest> tasks = new ArrayList<>();
           for (int i = 1; i < task.getId()*2; i++) {
                tasks.add(new MapChildTaskTest(i));
           }

            logger.info("Map Reduce task two mapList={}", tasks);
           return this.map(tasks, THREE_NAME);
       }

       if (context.isTask(THREE_NAME)) {
           MapChildTaskTest task = (MapChildTaskTest) context.getTask();
            logger.info("Map Reduce task three mapTask={}", task);
           return new ProcessResult(true, String.valueOf(task.getId() * 2));
       }

       return ProcessResult.success();
   }

   @Override
   public ProcessResult reduce(JobContext jobContext) {
       List<String> resultList = jobContext.getTaskResultList().stream().map(TaskResult::getResult)
               .collect(Collectors.toList());
        logger.info("Map Reduce resultList={}", resultList);
       return ProcessResult.success();
   }

   @Data
   @AllArgsConstructor
   @NoArgsConstructor
   public static class MapChildTaskTest {
       private Integer id;
   }
}

分片任务

分片模型主要包含静态分片和动态分片:
  • 静态分片:主要场景是处理固定的分片数,例如分库分表中固定 256 个库,需要若干台机器分布式去处理。
  • 动态分片:主要场景是分布式处理未知数据量的数据,例如一张大表在不停变更,需要分布式跑批。此时需要使用 MapReduce 任务
任务特性
  • 兼容 elastic-job 的静态分片模型。
  • 支持 Java、PHP 、Python、Shell、Go四种语言。
  • 高可用:分片任务执行机器异常时,会动态分配到其它正常机器执行任务。
  • 流量控制:可以设置单机子任务并发数。例如有 100 个分片,一共 3 台机器,可以控制最多 5 个分片并发执行,其它在队列中等待。
  • 失败重试:子任务执行失败异常时,自动重试。
/**
 * @author stelin [email protected]
 * @since 1.0.7
 */
@Component
public class ShardingAnnotationProcessor {
   private static final Logger logger = LoggerFactory.getLogger("openjob");

   @Openjob("annotationShardingProcessor")
   public ProcessResult shardingProcessor(JobContext jobContext) {
        logger.info("Sharding annotation processor execute success! shardingId={} shardingNum={} shardingParams={}",
                jobContext.getShardingId(), jobContext.getShardingNum(), jobContext.getShardingParam());
        logger.info("jobContext={}", jobContext);
       return ProcessResult.success();
   }
}

广播任务

广播任务类型的任务实例会广播到应用对应的所有Worker上执行,当所有Worker都执行完成,该任务才算完成,任意一台Worker执行失败,任务就算失败。 应用场景
  • 批量操作
  • 定时广播所有机器运行某个脚本。
  • 定时广播所有机器清理数据。
  • 动态启动每台机器的某个服务
  • 数据聚合
  • 使用JavaProcessor->preProcess 初始化
  • 每台机器执行 process 时,根据自己业务返回 result。
  • 执行 postProcess,获取所有机器的执行结果做汇总。
任务特性广播任务类型可以选择多种,例如脚本或者Java任务。如果选择Java,还支持preProcess和postProcess高级特性。
  • preProcess 会在每台机器执行 process 之前执行,且只会执行一次。
  • process 每天机器实际任务执行逻辑。
  • postProcess 会在每台机器执行 process 完成且都成功执行之后执行一次,可以返回结果,作为工作流数据传输。
/**
 * @author stelin [email protected]
 * @since 1.0.7
 */
@Component("broadcastPostProcessor")
public class BroadcastProcessor implements JavaProcessor {
   private static final Logger logger = LoggerFactory.getLogger("openjob");

   @Override
   public void preProcess(JobContext context) {
        logger.info("Broadcast pre process!");
   }

   @Override
   public ProcessResult process(JobContext context) throws Exception {
        logger.info("Broadcast process!");
       return new ProcessResult(true, "{\"data\":\"result data\"}");
   }

   @Override
   public ProcessResult postProcess(JobContext context) {
        logger.info("Broadcast post process taskList={}", context.getTaskResultList());
       System.out.println(context.getTaskResultList());
       return ProcessResult.success();
   }
}

更多内容

  • 官网: https://openjob.io
  • Github: https://github.com/open-job/openjob
  • 在线体验: https://demo.openjob.io
    • 用户名: openjob
    • 密码: openjob.io

相關推薦

2023-09-29

南方电网人工智能科技有限公司负责研发的电力行业人工智能创新平台及自主可控电力大模型正式公开发布。 电力行业人工智能创新平台提供模型即服务(MaaS),支持模型快速迭代开发,并支撑电力人工智能资源面向全社会开

2022-12-08

调用 大文件分片上传,进度条显示,已上传文件管理 强大的模块扩展功能,所有模块可以无缝集成,支持在线安装、卸载模块 完善的开发助手,实现模块、主题的的一键创建 完善的后台权限管理,支持基于RBAC的权限管

2023-11-09

算法、数据可视化等。它们为真实的开发任务提供了一个强大的测试平台。与之前的数据集不同,SoftwareDev 侧重于工程方面。在比较中,我们随机选择了七个具有代表性的任务进行评估。 2.1、可执行迭代反馈设计 图 4 表明

2023-04-27

段和执行阶段。 提交阶段 用户需要描述整个任务的训练资源,数据输入以及容错策略。 训练资源包括需要的角色(如 PS,Worker 等)以及各角色所需的资源,包括其需要的 CPU、内存以及运行脚本、环境变量等

2023-10-24

起寻宝 AI 时代 澳大利亚国立大学、牛津大学和北京人工智能研究院的研究人员,合作开发了一种名为“3D-GPT”的新型人工智能系统,该系统可以简单地根据用户提供的基于文本的描述生成 3D 模型。相较传统的 3D 建模工作流,

2023-09-23

Engine低码引擎通过接入华为云盘古大模型等各类大模型的强大能力,使得开发者通过文本交互或者语音对话就可以完成WEB应用的开发,应用技术门槛大幅降低,开发效率大幅提升,实现企业应用的高效敏捷、极致体验。 邓明昆

2023-07-25

求和内存占用。同时,网络深度得到加强,使模型具备更强大的表示能力,能够学习到更为复杂的数据特征。为提升模型在大规模数据处理中的可扩展性,知未智能重新调整了注意力层的Bias,进一步提高了模型性能。 值得一提

2023-04-21

强开源产品化技术能力和应用能力。 Taier 是一款好用又强大的大数据分布式可视化的 DAG 任务调度系统,旨在降低 ETL 开发成本、提高大数据平台稳定性。它让大数据开发人员可以在 Taier 直接进行业务逻辑的开发,而不用关心

2023-04-27

了两个经过生产作业验证的在线学习算法 通过使用 Flink 强大的流处理能力,Flink ML 能更好地进行在线学习和频繁更新模型数据。为了让这个优势落地并产生价值,我们在 Flink ML 中实现了两个在线机器学习算法并应用于阿里集

2023-12-02

律专家、私人人力顾问、私人IT大神…… 技术领先,更强大 对话问答类大模型应用遇到需要多流程、多步骤处理的复杂业务,往往要么容易产生“幻觉”,输出错误回答,要么容易错步、漏步、跳步,直接输出结果。然而不幸

2023-08-23

穷,不同种类的AI大模型也相继推出,由于其庞大的训练任务需要大量算力,以 GPU 为核心的算力供给已成为大模型产业发展的关键基础设施。在实际使用场景中,用户对于 GPU 资源的使用存在资源利用率低,资源分配不灵活等痛

2023-08-05

均有提升。还为多设备互联带来了更流畅的使用体验,如智能座舱多任务自由切换等等。 具体来说,HarmonyOS 4 实现了在图形、多媒体、内存、调度、存储、低功耗等能力的显著提升,带来流畅体验。此外,华为方舟引擎带来流

2023-11-06

湿度器件查询,器件使能/去使能,数据查询能力,丰富智能设备传感器能力。 泛Sensor 支持对设备所支持的预置振动效果进行查询,可通过EffectId查询某个振动效果在设备上是否被支持。 新增振动全停接口,无需传入

2023-07-09

代码; 然后可以开始运行你的软件了! MetaGPT是一款强大的开源软件,它利用多智能体框架(产品设计、技术设计和程序员)来处理你的需求。只需输入需求,MetaGPT就能规划、设计并生成产品文档、测试代码和主运行代码,