『ScheduleMaster』快速上手一款高可用的开源分布式任务调度平台

简介: 📣读完这篇文章里你能收获到- 了解分布式调度中心的概念- 博主重新整理的ScheduleMaster系统架构图- 快速接入ScheduleMaster高可用- 通过WebAPI接入ScheduleMaster

请添加图片描述
📣读完这篇文章里你能收获到

  • 了解分布式调度中心的概念
  • 博主重新整理的ScheduleMaster系统架构图
  • 快速接入ScheduleMaster高可用
  • 通过WebAPI接入ScheduleMaster
  • 感谢点赞+收藏,避免下次找不到~

请添加图片描述

一、ScheduleMaster介绍

1 分布式调度中心的概念

ScheduleMaster是分布式任务调度中心。最简单的理ScheduleMaster,就是对不同的系统里面的调度任务做统一管理的框架。

在这里插入图片描述

2 核心功能点

  • 简易的Web UI操作;
  • 任务动态管理:创建、启动、停止、暂停、恢复、删除等;
  • 高可用支持,跨平台多节点部署;
  • 数据安全性,不会出现多实例并发调度;
  • 支持自定义参数设置;
  • 支持设置监护人,运行异常时邮件告警;
  • 支持设置任务依赖,自动触发,共享任务结果;
  • 插件式开发,任务运行环境隔离;
  • 全链路日志系统,运行轨迹轻松掌控;
  • 用户访问控制;
  • 提供开放REST API,业务系统可以无缝集成;
  • 调度报表统计;

3 主要的技术点

  • Asp.Net Core 3.0、EntityFramework Core 3.0、Mysql 5.7、Quartz.Net、BeyondAdmin、Jquery
按这个项目开源作者 HOHO的原话讲就是:没有涉及任何高大上的技术,尽显(低调奢华有内涵)朴实

4 系统架构图

  • 我基于其开源的框架图,自己重新梳理了它的架构图

在这里插入图片描述

二、项目运行使用

需要提前准备:isual Studio 2019、.NET Core3.1 SDK、Mysql 5.7(可选)、SQLServer(可选)、PostgreSQL(可选)、Centos(可选)、Docker(可选)。

1 下载源码到本地

2 修改appsettings.json文件

  • 打开项目Hos.ScheduleMaster.Web根目录下的appsettings.json文件,修改数据库连接字符串,再找到NodeSetting节点,修改IP字段为master将要部署的ip地址(master端口为30000不用修改)

在这里插入图片描述

  • 打开项目Hos.ScheduleMaster.QuartzHost根目录下的appsettings.json文件,同样先修改Mysql连接字符串,再找到NodeSetting节点,设置worker的名称IdentityName,修改IP字段为将要部署的ip地址,Port字段为要监听的地址

在这里插入图片描述

3 发布项目

  • 在项目Hos.ScheduleMaster.Web、Hos.ScheduleMaster.QuartzHost上右击选择发布...,发布到本地文件夹。
  • 新增worker:按同样方式在项目Hos.ScheduleMaster.QuartzHost,配置IdentityName、IP、Port即可,worker在启动后会把自己的信息注入到数据库中,在master中可以看到。

  • 快速发布小贴士:windows平台下用powershell执行脚本publish.ps1快速发布到d:/sm-publish目录,linux平台下执行脚本sh publish.sh快速发布到/home/sm-publish目录。

4 运行2个worker节点为例

  • master节点:找到master的发布目录,执行命令dotnet Hos.ScheduleMaster.Web.dll启动程序,首次启动会自动迁移生成数据库结构并初始化种子数据,打开浏览器输入ip和端口访问即可
初始用户名 admin,密码 111111

在这里插入图片描述

  • worker1节点:找到worker的发布目录,执行命令dotnet Hos.ScheduleMaster.QuartzHost.dll --urls http://*:30001启动程序,打开浏览器输入ip和端口会看到一个欢迎页面,表示worker已启动成功。
  • worker2节点:修改worker下的appsettings.json文件为worker2的配置(如果发布前已经修改可跳过),执行命令dotnet Hos.ScheduleMaster.QuartzHost.dll --urls http://*:30002启动程序.

在这里插入图片描述

三、实际操作

1 后台新建HTTP定时任务

在这里插入图片描述

2 API自定义任务

为了方便业务系统更好的接入调度系统,创建任务不仅可以在控制台中实现,系统也提供了WebAPI供业务系统使用代码接入,这种方式对延时任务来说尤其重要。


  • API Server 对接流程

对于开放接口来说,使用签名验证已经是必不可少的一环,这是保证系统安全性的重要手段。看一下核心对接流程:

  1. 在控制台中创建好专用的API对接用户账号。
  2. 使用对接账号的用户名设置为http header中的ms_auth_user值。
  3. 使用经过哈希运算过的秘钥设置为http header中的ms_auth_secret值,计算规则:按{用户名}{hash(密码)}{用户名}的格式拼接得到字符串str,然后再对str做一次hash运算即得到最终秘钥,hash函数是小写的32位MD5算法。
  4. 使用form格式发起http调用,如果非法用户会返回401-Unauthorized。

代码示例:

    HttpClient client = new HttpClient();
    client.DefaultRequestHeaders.Add("ms_auth_user", "admin");
    client.DefaultRequestHeaders.Add("ms_auth_secret", SecurityHelper.MD5($"admin{SecurityHelper.MD5("111111")}}admin"));
签名验证这块设计的比较简单,具体源码逻辑可以参考 Hos.ScheduleMaster.Web.Filters.AccessControlFilter




  • API返回格式

所有接口采用统一的返回格式,字段如下:

参数名称 参数类型 说明
Success bool 是否成功
Status int 结果状态,0-请求失败 1-请求成功 2-登录失败 3-参数异常 4-数据异常
Message string 返回的消息
Data object 返回的数据




  • 创建HTTP任务

示例:

  1. 接口地址:http://yourip:30000/api/task/create
  2. 请求类型:POST
  3. 参数格式:application/x-www-form-urlencoded
  4. 返回结果:创建成功返回任务id
  5. 参数列表:
参数名称 参数类型 是否必填 说明
MetaType int 任务类型,这里固定是2
Title string 任务名称
RunLoop bool 是否按周期执行
CronExpression string cron表达式,如果RunLoop为true则必填
StartDate DateTime 任务开始时间
EndDate DateTime 任务停止时间,为空表示不限停止时间
Remark string 任务描述说明
HttpRequestUrl string 请求地址
HttpMethod string 请求方式,仅支持GET\POST\PUT\DELETE
HttpContentType string 参数格式,仅支持application/json和application/x-www-form-urlencoded
HttpHeaders string 自定义请求头,ScheduleParam列表的json字符串
HttpBody string 如果是json格式参数,则是对应参数的json字符串;如果是form格式参数,则是对应ScheduleParam列表的json字符串。
Keepers List 监护人id
Nexts List 子级任务id
Executors List 执行节点名称
RunNow bool 创建成功是否立即启动

代码示例:

    HttpClient client = new HttpClient();
    List<KeyValuePair<string, string>> args = new List<KeyValuePair<string, string>>();
    args.Add(new KeyValuePair<string, string>("MetaType", "2"));
    args.Add(new KeyValuePair<string, string>("RunLoop", "true"));
    args.Add(new KeyValuePair<string, string>("CronExpression", "22 0/8 * * * ?"));
    args.Add(new KeyValuePair<string, string>("Remark", "By Xunit Tester Created"));
    args.Add(new KeyValuePair<string, string>("StartDate", DateTime.Today.ToString("yyyy-MM-dd HH:mm:ss")));
    args.Add(new KeyValuePair<string, string>("Title", "Http接口测试任务"));
    args.Add(new KeyValuePair<string, string>("HttpRequestUrl", "http://localhost:56655/api/1.0/value/jsonpost"));
    args.Add(new KeyValuePair<string, string>("HttpMethod", "POST"));
    args.Add(new KeyValuePair<string, string>("HttpContentType", "application/json"));
    args.Add(new KeyValuePair<string, string>("HttpHeaders", "[]"));
    args.Add(new KeyValuePair<string, string>("HttpBody", "{ \"Posts\": [{ \"PostId\": 666, \"Title\": \"tester\", \"Content\":\"testtesttest\" }], \"BlogId\": 111, \"Url\":\"qweqrrttryrtyrtrtrt\" }"));
    HttpContent reqContent = new FormUrlEncodedContent(args);
    var response = await client.PostAsync("http://localhost:30000/api/Task/Create", reqContent);
    var content = await response.Content.ReadAsStringAsync();
    Debug.WriteLine(content);




  • 创建延时任务

示例:

  1. 接口地址:http://yourip:30000/api/delaytask/create
  2. 请求类型:POST
  3. 参数格式:application/x-www-form-urlencoded
  4. 返回结果:创建成功返回任务id
  5. 参数列表:
参数名称 参数类型 是否必填 说明
SourceApp string 来源
Topic string 主题
ContentKey string 业务关键字
DelayTimeSpan int 延迟相对时间
DelayAbsoluteTime DateTime 延迟绝对时间
NotifyUrl string 回调地址
NotifyDataType string 回调参数格式,仅支持application/json和application/x-www-form-urlencoded
NotifyBody string 回调参数,json格式字符串

代码示例:

    for (int i = 0; i < 5; i++)
    {
        int rndNum = new Random().Next(20, 500);
        List<KeyValuePair<string, string>> args = new List<KeyValuePair<string, string>>();
        args.Add(new KeyValuePair<string, string>("SourceApp", "TestApp"));
        args.Add(new KeyValuePair<string, string>("Topic", "TestApp.Trade.TimeoutCancel"));
        args.Add(new KeyValuePair<string, string>("ContentKey", i.ToString()));
        args.Add(new KeyValuePair<string, string>("DelayTimeSpan", rndNum.ToString()));
        args.Add(new KeyValuePair<string, string>("DelayAbsoluteTime", DateTime.Now.AddSeconds(rndNum).ToString("yyyy-MM-dd HH:mm:ss")));
        args.Add(new KeyValuePair<string, string>("NotifyUrl", "http://localhost:56655/api/1.0/value/delaypost"));
        args.Add(new KeyValuePair<string, string>("NotifyDataType", "application/json"));
        args.Add(new KeyValuePair<string, string>("NotifyBody", "{ \"Posts\": [{ \"PostId\": 666, \"Title\": \"tester\", \"Content\":\"testtesttest\" }], \"BlogId\": 111, \"Url\":\"qweqrrttryrtyrtrtrt\" }"));
        HttpContent reqContent = new FormUrlEncodedContent(args);
        var response = await client.PostAsync("http://localhost:30000/api/DelayTask/Create", reqContent);
        var content = await response.Content.ReadAsStringAsync();
        Debug.WriteLine(content);
    }
相关文章
|
消息中间件 运维 Kafka
直播预告|Kafka+Flink双引擎实战:手把手带你搭建分布式实时分析平台!
在数字化转型中,企业亟需从海量数据中快速提取价值并转化为业务增长动力。5月15日19:00-21:00,阿里云三位技术专家将讲解Kafka与Flink的强强联合方案,帮助企业零门槛构建分布式实时分析平台。此组合广泛应用于实时风控、用户行为追踪等场景,具备高吞吐、弹性扩缩容及亚秒级响应优势。直播适合初学者、开发者和数据工程师,参与还有机会领取定制好礼!扫描海报二维码或点击链接预约直播:[https://developer.aliyun.com/live/255088](https://developer.aliyun.com/live/255088)
699 35
直播预告|Kafka+Flink双引擎实战:手把手带你搭建分布式实时分析平台!
|
消息中间件 运维 Kafka
直播预告|Kafka+Flink 双引擎实战:手把手带你搭建分布式实时分析平台!
直播预告|Kafka+Flink 双引擎实战:手把手带你搭建分布式实时分析平台!
332 11
|
8月前
|
负载均衡 算法 调度
基于遗传算法的新的异构分布式系统任务调度算法研究(Matlab代码实现)
基于遗传算法的新的异构分布式系统任务调度算法研究(Matlab代码实现)
335 11
|
8月前
|
消息中间件 监控 Java
Apache Kafka 分布式流处理平台技术详解与实践指南
本文档全面介绍 Apache Kafka 分布式流处理平台的核心概念、架构设计和实践应用。作为高吞吐量、低延迟的分布式消息系统,Kafka 已成为现代数据管道和流处理应用的事实标准。本文将深入探讨其生产者-消费者模型、主题分区机制、副本复制、流处理API等核心机制,帮助开发者构建可靠、可扩展的实时数据流处理系统。
764 4
|
12月前
|
监控 Linux 应用服务中间件
Linux多节点多硬盘部署MinIO:分布式MinIO集群部署指南搭建高可用架构实践
通过以上步骤,已成功基于已有的 MinIO 服务,扩展为一个 MinIO 集群。该集群具有高可用性和容错性,适合生产环境使用。如果有任何问题,请检查日志或参考MinIO 官方文档。作者联系方式vx:2743642415。
3796 57
|
SQL 监控 Go
新一代 Cron-Job分布式调度平台,v1.0.8版本发布,支持Go执行器SDK!
现代化的Cron-Job分布式任务调度平台,支持Go语言执行器SDK,多项核心优势优于其他调度平台。
286 8
|
11月前
|
运维 监控 Linux
WGCLOUD运维平台的分布式计划任务功能介绍
WGCLOUD是一款免费开源的运维监控平台,支持主机与服务器性能监控,具备实时告警和自愈功能。本文重点介绍其计划任务功能模块,可统一管理Linux和Windows主机的定时任务。相比手动配置crontab或Windows任务计划,WGCLOUD提供直观界面,通过添加cron表达式、执行指令或脚本并选择主机,即可轻松完成任务设置,大幅提升多主机任务管理效率。
|
数据采集 监控 数据可视化
11.7K Star!这个分布式爬虫管理平台让多语言协作如此简单!
分布式爬虫管理平台Crawlab,支持任何编程语言和框架的爬虫管理,提供可视化界面、任务调度、日志监控等企业级功能,让爬虫开发管理效率提升300%!
619 1
|
9月前
|
存储 负载均衡 NoSQL
【赵渝强老师】Redis Cluster分布式集群
Redis Cluster是Redis的分布式存储解决方案,通过哈希槽(slot)实现数据分片,支持水平扩展,具备高可用性和负载均衡能力,适用于大规模数据场景。
607 2
|
9月前
|
存储 缓存 NoSQL
【📕分布式锁通关指南 12】源码剖析redisson如何利用Redis数据结构实现Semaphore和CountDownLatch
本文解析 Redisson 如何通过 Redis 实现分布式信号量(RSemaphore)与倒数闩(RCountDownLatch),利用 Lua 脚本与原子操作保障分布式环境下的同步控制,帮助开发者更好地理解其原理与应用。
749 6