首页 > 其他分享 >分布式任务调度(03)--中心化设计

分布式任务调度(03)--中心化设计

时间:2023-11-08 18:32:13浏览次数:30  
标签:执行器 03 执行 调度 任务 中心化 任务调度 conn

把调度和任务执行,隔离成两个部分:

  • 调度中心

    只需要负责任务调度属性,触发调度命令

  • 执行器

    执行器接收调度命令,去执行具体的业务逻辑

两者都可以进行横向扩容。

1 MQ

调度中心依赖Quartz集群模式,当任务调度时,发送消息到RabbitMQ 。业务应用收到任务消息后,消费任务信息。

充分利用MQ解耦:

  • 调度中心发任务
  • 应用方作为执行器,接收任务并执行

1.1 缺点

多引入中间件,强依赖MQ,可扩展性和功能,系统负载都和MQ有关。

2 XXL-JOB

分布式任务调度平台,设计目标:开发迅速、学习简单、轻量级、易扩展。

2.1 xxl-job 2.3.0架构图

2.2 网络通讯 server-worker 模型

img

调度中心和执行器 两个模块之间通讯是 server-worker 模式。调度中心本身就是一个SpringBoot 工程,启动会监听8080端口。

执行器启动后,会启动内置服务( EmbedServer )监听9994端口。这样双方都可以给对方发送命令。

调度中心咋知道执行器地址信息?

执行器会定时发送注册命令 ,这样调度中心就可获取在线执行器集。

通过执行器集,即可根据任务配置的路由策略选择节点执行任务。

路由策略

随机节点执行

选择集群中一个可用的执行节点执行调度任务。

适用场景:离线订单结算。

img

广播执行

在集群中所有的执行节点分发调度任务并执行。

适用场景:批量更新应用本地缓存。

分片执行

按用户自定义分片逻辑进行拆分,分发到集群中不同节点并行执行,提升资源利用效率

适用场景:海量日志统计。

img

调度器

调度器是任务调度系统里面非常核心的组件。XXL-JOB 的早期版本是依赖Quartz。

但在v2.1.0版本中完全去掉了Quartz的依赖,原来需要创建的 Quartz表也替换成了自研的表。

核心的调度类是:JobTriggerPoolHelper 。调用start方法后,会启动两个线程:scheduleThread 和 ringThread 。

首先 scheduleThread 会定时从数据库加载需要调度的任务,这里从本质上还是基于数据库行锁保证同时只有一个调度中心节点触发任务调度。

ExplainConnection conn = XxlJobAdminConfig.getAdminConfig()
                  .getDataSource().getConnection();
connAutoCommit = conn.getAutoCommit();
conn.setAutoCommit(false);
preparedStatement = conn.prepareStatement(
"select * from xxl_job_lock where lock_name = 'schedule_lock' for update");
preparedStatement.execute();
# 触发任务调度 (伪代码)
for (XxlJobInfo jobInfo: scheduleList) {
  // 省略代码
}
# 事务提交
conn.commit();

调度线程会根据任务的「下次触发时间」,采取不同的动作:

img

已过期的任务需要立刻执行的,直接放入线程池中触发执行 ,五秒内需要执行的任务放到 ringData 对象里。

ringThread 启动后,定时从 ringData 对象里获取需要执行的任务列表 ,放入到线程池中触发执行。

imgimg

标签:执行器,03,执行,调度,任务,中心化,任务调度,conn
From: https://blog.51cto.com/JavaEdge/8257421

相关文章

  • 2008秋季-计算机软件基础-0903课堂用例(1)
    #include<stdio.h>voidupdate(intxiabiao,intb[],intxinshu);voidcharu(intweizhi,intb[],intcharushu,intshuzuchang);voidshanchu(intweizhi,intb[],int*changdu);voidshuchu(intaa[],intbiaochang);voidchazhao(int......
  • undefined reference to `add(int, int)'
    一、概述使用cmake编译C++项目报undefinedreferenceto`add(int,int)'项目中有.cpp文件,有.h文件,有.c文件。也就是c和c++混编。其中.cpp文件引用了.c的头文件现象: 从上面可以看出其实这几个.cpp和.c文件都已经编译过了。但是就会提示找不到.c文件中的......
  • import torch_geometric报错Could not find module '...\torch_sparse\_convert_cpu
    按照官网步骤安装完torch-scatter、torch-sparse、torch-cluster和torch-spline-conv等依赖项,也成功安装了torch_geometric,但在导入的时候还是报错: 原因是没有C++环境,在该网址中https://visualstudio.microsoft.com/visual-cpp-build-tools/下载并安装C/C++DLL动态链接库,即可......
  • 208-iframe访问其他网站,报错:because it set 'X-Frame-Options' to 'sameorigin'
    iframe代码如下:<iframeid="mainFrame"name="mainFrame"src="https://etax.fujian.chinatax.gov.cn/xxmh/html/index.html"border="0"></iframe>会报错:Refusedtodisplay'https://etax.fujian.chinatax.gov.......
  • [BZOJ2603] [POI2003] Motorways
    本题解思路类似kczno1在[POI2010]KOL-Railway的题解。如果\(l_i<l_j<r_i<r_j\)则连边\((i,j)\),题目转化为判断该图是否是二分图,如果是则给出染色方案。不妨先找出一个生成森林,然后染色并判断所有同颜色的点是否没有边相连。把所有\((l_i,r_i)\)按\(l\)从小......
  • uniApp:使用vue3+Vite4+pinia+sass技术栈构建(03)-封装对象类
    1.在src文件夹创建models文件夹import{user}from"@/service/api"//用户信息返回的数据类型interfaceuserInfoType{username:string,phone:string}//返回类型interfaceResultType<T>{errno:number,errmsg:string,datas:T}classuser......
  • 正则表达式-r'\[.*\]'和r'[.*]'的区别
    则表达式r'[.*]'实际上会匹配包含任何一个字符*或.或*的字符串。这不是想要的结果。希望匹配方括号[]中的任意字符,并且要匹配多个字符。要匹配方括号[]中的任意字符,并匹配多个字符,你应该使用r'\[.*\]',其中\[匹配左方括号,.*匹配任意字符(包括数字、字母等等),然后\]......
  • China's Strategies on Air Pollution
    IntroductionAveragedpercentagechangesinPM2.5annualconcentrationsin31majorChinesecitiessince2015.Credit:ScienceChinaPressAnewstudyhasbeenconductedtounderstandwhethertherecentchangesinChina'sairqualityweredriven......
  • 分布式任务调度(00)--Quartz
    1任务调度整体流程2组件调度器:工厂类创建Scheduler,根据触发器定义的时间规则调度任务任务:Job表示被调度的任务触发器:Trigger定义调度时间的元素,按啥时间规则执行任务。一个Job可被多个Trigger关联,但是一个Trigger只能关联一个Jobimportorg.quartz.*;importorg.qua......
  • win10定时关机、定时休眠和定时睡眠的命令行【转载自https://blog.csdn.net/conanluff
    1、定时关机#注:/s关机,/t后面接时间,单位是秒shutdown/s/t3600 #一个小时后关机shutdown-a#取消定时关机注:"shutdown/h"是立即进入休眠的命令,但/h参数不能与/t连用,故不能用shutdown实现定时休眠的功能。/h可与/f连用,/f表示强制关闭正在运行的应用程序而不事先警告用户。......