面试官:使用 xxl-job 怎样解决任务重叠问题?

news2024/9/21 3:37:06

大家好,我是君哥。今天分享批量任务的重叠问题。

面试官:聊聊你用过的任务调度框架?

:目前任务调度框架的选择有很多,比如业内熟悉的 QuartZ,Spring Batch,xxl-job,以及新一代的任务框架 PowerJob 等。我本人使用最多的还是 xxl-job。

面试官:使用 xxl-job 遇到过任务重叠的问题吗?

:任务重叠是批量任务调度中经常遇到的问题,主流的分布式调度框架是可以解决部分任务重复问题的,但并不能解决全部问题。

面试官:能说一下 xxl-job 解决了哪些任务重叠的问题,还有哪些问题没有解决吗?

:(下图来自 xxl-job 官网)xxl-job路由策略如下:

图片

  • FIRST(第一个):固定选择第一个机器;

  • LAST(最后一个):固定选择最后一个机器;

  • ROUND(轮询):按照注册机器的列表顺序进行任务调度;

  • RANDOM(随机):随机选择在线的机器;

  • CONSISTENT_HASH(一致性HASH):每个任务按照Hash算法固定选择某一台机器,且所有任务均匀散列在不同机器上;

  • LEAST_FREQUENTLY_USED(最不经常使用):使用频率最低的机器优先被选举;

  • LEAST_RECENTLY_USED(最近最久未使用):最久未使用的机器优先被选举;

  • FAILOVER(故障转移):按照顺序依次进行心跳检测,第一个心跳检测成功的机器选定为目标执行器并发起调度;

  • BUSYOVER(忙碌转移):按照顺序依次进行空闲检测,第一个空闲检测成功的机器选定为目标执行器并发起调度;

  • SHARDING_BROADCAST(分片广播):广播触发对应集群中所有机器执行一次任务,同时系统自动传递分片参数;可根据分片参数开发分片任务。

虽然策略比较多,但是常用的策略就是固定在一台机器上面跑或者轮询策略。假设有一个密集的定时调度任务,每隔两分钟跑一次,如果在同一个机器上跑,遇到调用下游接口响应慢,或者处理的业务数据暴增,可能出现前一次任务还没有完成,下一次任务已经发起了。为了防止任务重叠在一台机器上,可以采用 xxl-job 轮询的策略。

面试官:按照你刚才举的例子,定时任务每隔两分钟跑一次,如果选择固定在一台机器上跑,比如选择路由策略是 FIRST 或者 LAST,有多个任务重叠在一台机器上,xxl-job 是怎样解决的?

我:对于跑批间隔时间比较短的定时任务,因为调度很密集,执行器很容易造成任务阻塞。xxl-job 提供了 3 种阻塞处理策略:

  • 单机串行(默认):调度请求进入单机执行器后,调度请求进入 FIFO 队列并以串行方式运行;

  • 丢弃后续调度:调度请求进入单机执行器后,发现执行器存在运行的调度任务,本次请求将会被丢弃并标记为失败;

  • 覆盖之前调度:调度请求进入单机执行器后,发现执行器存在运行的调度任务,将会终止运行中的调度任务并清空队列,然后运行本地调度任务。

采用单机串行的策略,如果前面的任务没有处理完成,后面的任务只能排队,等待被调度。

面试官:单机任务排队执行,这种策略看上去没有什么问题。你有遇到过相关问题吗? 

:一般场景下是不会有影响的,但如果一个任务跟日期相关,有任务排队到第二天才能执行,很可能会造成业务影响。

面试官:能举一个具体的场景吗?

:举一个贷款业务的例子,系统通过跑批任务给应还款日是第二天的客户发送还款短信通知,处理逻辑是每个任务查出应还款日是第二天的一批用户,然后发送短信通知。这里的第二天需要用系统日期来判断。如果有排队的任务到第二天才执行,那应还款的部分用户会收不到通知。

图片

面试官:这种场景 xxl-job 有解决方案吗?

:采用轮询的路由策略,可以让排队的任务调度的不同的机器上,这样可以减少单机器的任务积压问题。

面试官:采用轮询的路由策略,表面看是可以解决单机器的任务积压问题。但如果任务积压是因为下游接口响应慢、sql 查询性能差等造成的任务执行慢,采用轮询策略可以解决吗?

:这类问题造成的任务排队,改为轮询策略也是解决不了的,轮询策略只能解决类似单机资源紧张造成跑批慢的情况。

面试官:那这些问题有什么解决方案吗?

:业务上是有解决方案的,比如金融行业系统里面一般有“切日”的概念,跟日期相关的业务不会取系统日期,而是取数据库保存的账务日期,所有需要使用账务日期的任务跑批完成后,才会把数据库保存的账务日期切换到第二天。

面试官:采用轮询路由策略,还可能带来哪些问题呢?

:还可能造成冥等的问题。比如一个任务的处理逻辑是,每隔两分钟从数据库查询 100 条状态是“未处理”的数据进行处理,处理完成后更新状态为“已处理”。如果机器一上的任务还没有执行完成,机器二上的任务已经开始调度,那很可能会把机器一上正在执行的 100 条数据查出来重复处理。

面试官:这个问题该怎么解决呢?

:我提供两种解决思路:

  • 第一,最简单的方式就是采用单机执行;

  • 第二,增加一个中间状态“处理中”,执行查询数据的时候采用排它锁,查出后更新成中间状态,提交事务后再执行处理逻辑,处理逻辑执行完成后更新成“已处理”

select * from xxx where statsu='未处理' limit yy,100 for update
update xxx set statsu='处理中' where id in(...)

面试官:那如果数据源不能加锁呢?比如数据源是邮件、接口查询。

:可以对邮件或接口查到的数据唯一键进行保存,把唯一键做数据库主键,下一个任务可以根据主键做排除,再实现业务逻辑。

面试官:好的,恭喜你进入下一轮...

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

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

相关文章

从零到一:同城代驾系统源码开发全流程详解

本篇文章,小编将详细解析同城代驾系统源码开发的全流程,从需求分析到最终上线,帮助你从零到一构建完整的系统。 一、需求分析与市场调研 对于同城代驾系统,首先要明确的是目标用户群体,如城市白领、商务人士或家庭用…

文件操作与IO(上)

✨个人主页: 不漫游-CSDN博客 目录 一、认识文件 文件存储 文件路径 绝对路径 相对路径 文件种类 二进制文件 文本文件 文件系统操作 经典面试题 一、认识文件 想必文件大家都不陌生,文件是存储在计算机系统中的数据集合,它可以包…

JavaScript基础——JavaScript运算符

赋值运算符 算术运算符 一元运算符 三元/三目运算符 比较运算符 逻辑运算符 运算符优先级 在JavaScript中,常见的运算符可以包括赋值运算符、一元运算符、算术运算符(二元运算符)、三元/三目运算符、比较运算符、逻辑运算符等&#xff0…

centos7安装zabbix

可以联网的centos7系统 关闭防火墙 selinux也关了 1、配置镜像源 wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo wget -O /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo2、安装nginx并配置 yum ins…

uniapp全局分享功能实现方法(依赖小程序右上角的分享按钮)

1、uniapp开发小程序时默认是关闭分享功能的。点击右上角三个点可查看,效果图如下: 2、在utils文件夹下新建share.js文件,名字任起。(使用的是全局分享,因为一个一个页面的去分享太麻烦且没必要。) export…

万字长文分享快手 Kolors 可图大模型应用实践

导读 在企业提效方面,多模态能力同样具有重要意义。在 AICon 北京站活动中,快手「可图」大模型负责人李岩分享了主题为《快手「可图」文生图大模型应用实践》的演讲,以下为李岩演讲内容~期待对你有所启发! 一、基座模…

docker部署java项目(war包方式)

场景描述:java项目war包,在开发开电脑上使用dockerfile构建镜像,上传镜像到客户服务器中使用docker加载docker镜像,然后部署。 目录 一、本地环境安装 docker git 二、服务器环境安装 docker 三、构建docker镜像(win系统) 四、注意事项 (1)系统架构 (2)使…

线程(Pthread)

目录 多线程模式下cpu如何分配 这两种线程的优缺点 多个线程在进程中共享资源有哪些 非共享资源 线程函数(NPTL API) 线程分离态 线程退出方式 关于线程的能力 线程属性 线程是大多数操作系统支持的调度单位,执行单元,某…

【全国大学生电子设计竞赛】2022年F题

🥰🥰全国大学生电子设计大赛学习资料专栏已开启,限时免费,速速收藏~

RabbitMQ高级特性 - 事务消息

文章目录 RabbitMQ 事务消息概述实现原理代码实现不采用事务采用事务 RabbitMQ 事务消息 概述 RabbitMQ 的 AMQP 协议实现了事务机制,允许开发者保证消息的发送和接收时原子性的,也就是说,要么消息全都发送成功,要么全都发送失败…

《python语言程序设计》2018版第6章第27题双素数是指一堆差值为2的素数。

水平的原因做不到答案那种输出 def is_prime(number):divisor 2while divisor < number / 2:if number % divisor 0:return Falsedivisor 1return Truedef print_prime_numbers(number_of_primes):count 0number 2while number < number_of_primes:if is_prime(numb…

六、GD32 MCU 选项字节设置及解除方法

您在使用GD32过程中是否遇到过芯片反复复位&#xff0c;代码无法更新&#xff0c;代码一直执行在0x1fffxxxx区域&#xff0c;或代码执行在SRAM区域的情况&#xff1f;如果有遇到这类现象是否找到原因呢&#xff1f;如果没找到是否检查过选项字节是否正常呢&#xff1f;这一章节…

C++ | 类和对象(下)(static成员、友元、内部类、匿名对象)

目录 ​编辑 static成员 static性质简介 static属于整个类&#xff0c;属于所有对象 static成员的声明与定义 static函数 友元friend 友元特性简介 友元关系讲解 内部类 特性一 特性二 匿名对象 结语 static成员 static性质简介 static成员在类里面是非常独特的…

ContentProvider的相关知识总结

1.ContentProvider概念讲解&#xff1a; 2.使用系统提供的ContentProvider 其实很多时候我们用到ContentProvider并不是自己暴露自己的数据&#xff0c;更多的时候通过 ContentResolver来读取其他应用的信息&#xff0c;最常用的莫过于读取系统APP&#xff0c;信息&#xff0c…

Kubernetes中的CRI、CNI与CSI:深入理解云原生存储、网络与容器运行时

引言 随着云原生技术的飞速发展&#xff0c;Kubernetes&#xff08;简称K8s&#xff09;作为云原生应用的核心调度平台&#xff0c;其重要性日益凸显。K8s通过开放一系列接口&#xff0c;实现了高度的可扩展性和灵活性&#xff0c;其中CRI&#xff08;Container Runtime Inter…

使用归一化连接计数的胸部CT成像:预测CanCOLD研究中的肺气肿进展| 文献速递-AI辅助的放射影像疾病诊断

Title 题目 CT Chest Imaging Using Normalized Join-Count: Predicting Emphysema Progression in the CanCOLD Study 使用归一化连接计数的胸部CT成像&#xff1a;预测CanCOLD研究中的肺气肿进展 Background 背景 Pre-existing emphysema is recognized as an indicator…

【C++】------继承(一)

目录 前言 一、概念与定义 Ⅰ、是什么&#xff1f; Ⅱ、定义 1.定义格式&#xff1a; 2.继承方式和访问限定符 3.基类&#xff08;父类&#xff09;成员访问方式的变化 二、父类与子类的赋值转化 基本认识 原理 三、 继承中的作用域 四、子类(派生类)的默认成员函…

Spring中是如何实现IoC和DI的?

前言&#xff1a;在前一篇文章中对于IoC的核心思想进行了讲解&#xff0c;而本篇文章则从Spring的角度入手&#xff0c;体会Spring对于IoC是如何实现的。 如果对IoC还有不太了解的可以阅读上一篇文章&#xff0c;相信一定会带来全新的收获&#xff1a;什么是IoC&#xff08;控制…

5.5软件工程-系统测试

系统测试 意义和目的原则测试过程测试策略测试方法练习题 测试用例设计黑盒测试等价类划分边界值分析错误推测因果图 白盒测试逻辑覆盖循环覆盖基本路径测试法 练习题 调试软件度量练习题 考点少&#xff0c;知识点多 意义和目的 系统测试的意义&#xff1a;系统测试是为了发现…

浅谈Redis集群架构与主从架构

目录 1. Redis集群1.1 集群概念1.2 集群分片1.3 重新分片 2. 集群的主从模型2.1 主从模型2.2 主节点选举 1. Redis集群 1.1 集群概念 面试官&#xff1a;我看你简历写了Redis集群&#xff0c;你说一说&#xff1f; Redis主从架构和Redis集群架构是两种不同的概念&#xff0c;大…