面试官:怎样设计一个分布式任务调度平台?

大家好,我是君哥。

在工作中,批量任务调度的需求经常会遇到,比如下面的几个场景:

  1. 数据迁移:从数据库 A 批量读取数据,加工后把数据写入数据库 B;

  2. 消息通知:运营商批量给客户发送短信;

  3. 批量扣款:在还款日,银行批量扣除贷款客户的当期还款金额;

  4. 账务加工:系统通过日终跑批的方式加工当天的账务数据。

从开源框架来看,优秀的分布式任务调度框架并不少,比如 Quartz、Spring Batch、xxl-job、PowerJob 等。如果公司不使用开源框架,要自研一套,该如何设计呢?

今天就来聊一聊怎样设计一套分布式任务调度平台。

1.触发器

既然是任务调度,那触发器肯定是必不可少的。触发器就是控制任务什么时间开始执行,使用者可以定义好 Cron 表达式,到时间保证任务被触发。

除了定时触发外,也要设计通用的触发接口,方便地给外部系统提供触发入口。

在一些对账类的场景,可能多个系统联合对账,上游系统加工好后把账务文件送过来,触发本系统的批量任务进行对账。本系统对账完成后,要把对账结果异步通知给调用方。

2.调度器

调度器的主要作用是给待执行任务找到一台合适的机器,然后把它调度到这台集群上的待执行队列。

2.1 调度策略

调度器的调度策略可以有几种:

  • 调度到固定一台机器;

  • 以轮询方式调度到下一台机器;

  • 根据集群中各机器的资源状况调度到一台空闲的机器,这个比较难一些;

  • 随机选择一台机器;

  • 所有机器都执行。

在集群环境下,调度器对定时任务的作用是非常重要的,调度不好,很容易导致任务在不同机器上重复执行。

同时,调度器可以根据机器的资源情况进行任务调度,提高任务执行效率。

当然,也可能会有广播的场景,这时调度器需要把任务调度到所有的机器上执行。

还需要考虑的一个点就是任务优先级,优先级高的任务需要优先调度。

3 执行器

调度器把任务调度到某一个机器上后,就把任务交给了执行器。执行器可以定义一个线程池,接到任务后把任务丢到线程池中,等待被线程池调度。

执行器可以提供一个基类,任务类通过继承这个基类被调度平台识别。

4.任务链

任务链也是非常重要的概念,在任务调度平台上要支持任务链的定义,比如 task1->task2->task3 这样一条任务链,task1 执行完成后触发 task2,task2 执行完成后触发 task3。

任务链使用的业务场景很多。比如一个复杂度高、耗时很长的任务,可以拆分成多个子任务,这样如果有一个任务失败了,把异常问题解决后,从失败任务节点重新调起就可以。

实现任务链的方法有多种,这里提供两个思路供参考,一个是不定义任务链,给每个任务定义一个子任务,触发时只触发第一个任务,任务执行完成后执行子任务;第二个方法是定义一个任务链,任务链明确任务依赖关系。

5.熔断

批量任务一般用于处理数据量大的任务,比如给 10 万个客户发送短信通知。这会对本系统资源消耗较大,也可能会对下游系统造成压力。

如果没有任何防控手段,很可能会因为下游系统接口响应慢造成系统连锁反应。有了熔断能力,系统就可以及时发现问题并做出反应,对本系统和下游系统进行保护。

6.异常处理

异常处理的手段也是必要的。异常处理可以包含下面功能:

  • 用户可以方便地查看异常;

  • 解决异常后,可以方便地重新发起任务;

  • 遇到一些任务因为异常原因耗时太长,可以中断任务;

  • 遇到任务执行时间长,长时间占用系统资源,可以把任务挂起,给其他任务执行时间,其他任务执行完后可以再恢复这个任务。

7.阻塞控制

对于单机执行的任务,遇到任务排队的情况很正常。可以设置阻塞策略,比如按照 FIFO 方式进行排队执行,或者不做排队,有正在执行的任务时直接丢弃。

8.服务注册/发现

前面说到调度器会把任务调度到其中一台机器执行,那为了方便地管理集群中的机器,服务注册和发现功能也是很必要的。

9.任务监控

好多跑批任务是在日终执行,比如凌晨。把任务加入公司的监控体系,如果任务失败,触发监控告警,可以让运维人员和研发人员第一时间感知到。

10.控制台

有了上面的讨论,控制台的作用就很重要的。可以包括:

  • 触发器配置;

  • 触发类型配置;

  • 调度器配置;

  • 执行器配置;

  • 任务和子任务配置;

  • 异常处理;

  • 阻塞控制策略配置;

  • 任务执行状态查询;

  • 集群管理。

11.总结

通过本文的讨论,我们设计一个任务调度平台,需要下面的功能,希望对你设计和理解任务调度平台有所帮助。

图片

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

同态加密和SEAL库的介绍(二)BFV 基础方案实现

写在前面: 本篇具体讲解如何使用 BFV 加密方案对加密的整数进行简单的计算(一个多项式评估),来源是官方提供的示例。BFV 是比较常见的方案,在很多大模型推理的时候,都是将浮点数的权重和输入变换成…

MongoDB学习笔记(三)

使用Python操作MongoDB: 使用管理员用户:

web基础与http协议与配置

目录 一、web基础 1.1 DNS与域名(详解看前面章节) 1.2 网页的概念(HTTP/HTTPS) 1.2.1 基本概念 1.2.2 HTML文档结构(了解) 1.2.3 web相关重点 1.2.4 静态资源和动态资源 二、http协议 2.1 概述 2.2 cookie和session&…

云原生真机实验

基于Proxmox VE构建中小企业云计算平台 首先Proxmox VE是什么?能用来做什么? Proxmox VE是一个完整的企业虚拟化开源平台。借助内置的 Web 界面,可以在单个解决方案上轻松管理 VM(开虚拟机的) 和容器、软件定义的存储和网络、高可用性群集以…

STM32开发之移植FreeRtos

一、新建STM32工程项目 (1)打开keil新建工程文件夹 (2)选择芯片型号 接下来会弹出来一个新建工程的小助手,我们关闭就好,接下来我们的工程就创建好了,但是工程还是空的 二、添加STM32的相关固件…

搭建 Web 群集Haproxy

案例概述 Haproxy 是目前比较流行的一种群集调度工具,同类群集调度工具有很多,如 LVS 和Nginx。相比较而言,LVS 性能最好,但是搭建相对复杂;Nginx 的upstream模块支持群集功能,但是对群集节点健康检查功能不强&#xf…

【C++】模版详解

1、概念 C模版分两类&#xff1a;函数模版和类模版 1&#xff09;函数模板的格式 template <class 形参名&#xff0c;class 形参名&#xff0c;......> 返回类型 函数名(参数列表) {函数体 }例如&#xff1a; template <class T> void swap(T& a, T& b…

机器人主板维修|ABB机械手主板元器件故障

【ABB机器人电路板故障原因诊断】 针对上述故障现象&#xff0c;我们需要对ABB机器人IO板进行详细的故障诊断。以下是一些可能的故障原因&#xff1a; 1. 元器件老化或损坏&#xff1a;ABB机械手安全面板上的元器件在长期使用过程中可能出现老化、损坏或接触不良等问题&#xf…

Unity 使用字符串更改Text指定文字颜色、大小、换行、透明

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、使用字符串改变文字属性的方法&#xff08;一&#xff09;修改颜色&#xff08;二&#xff09;修改大小&#xff08;三&#xff09;换行&#xff08;四&…

NC 矩阵的最小路径和

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 描述 给定一个 n *…

【漏洞复现】某赛通数据泄露防护(DLP)系统 NetSecConfigAjax SQL注入漏洞

0x01 产品简介 某赛通新一代数据泄露防护系统&#xff08;简称 DLP&#xff09;&#xff0c;以服务企事业单位进行数据资产梳理、数据安全防护为目标。系统采用平台化管理&#xff0c;将终端DLP、网络DLP、邮件DLP、存储扫描DLP、API 接口DLP 进行统一管理&#xff0c;模块化控…

LVS详解

目录 一、LVS简介 LVS 官网: 二、LVS 负载均衡模式 2.1 LVS-NAT模式&#xff1a; 2.1.1 简介 2.1.2 工作流程图&#xff1a; 2.1.3 说明&#xff1a; 2.1.4 LVS-NAT的优缺点&#xff1a; 2.2 LVS-DR模式&#xff1a; 2.2.1 简介 2.2.2 工作原理&#xff1a; 2.2.3 工作…

Android----Depth Anything尝鲜 小米手机部署

题目要求&#xff1a;了解Depth Anything (以及Depth Anything v2)基本原理&#xff0c;创新点。 Depth Anything 论文&#xff1a;Depth Anything: Unleashing the Power of Large-Scale Unlabeled Data 参考代码&#xff1a;Depth-Anything-Android GitHub 分析&#xff1a; …

应急响应:D盾的简单使用.

什么是应急响应. 一个组织为了 应对 各种网络安全 意外事件 的发生 所做的准备 以及在 事件发生后 所采取的措施 。说白了就是别人攻击你了&#xff0c;你怎么把这个攻击还原&#xff0c;看看别人是怎么攻击的&#xff0c;然后你如何去处理&#xff0c;这就是应急响应。 D盾功…

【算法】最短路径算法思路小结

一、基础&#xff1a;二叉树的遍历->图的遍历 提到搜索算法&#xff0c;就不得不说两个最基础的思想&#xff1a; BFS&#xff08;Breadth First Search&#xff09;广度优先搜索 DFS&#xff08;Depth First Search&#xff09;深度优先搜索 刚开始是在二叉树遍历中接触这…

【vue+mathjax】mathjax的使用

方法一、引用外网的地址 第一步&#xff1a;在public/index.html中引入地址 <!DOCTYPE html> <html><head><meta charset"utf-8" /><meta http-equiv"X-UA-Compatible" content"IEedge,chrome1" /><metaname…

力扣刷题-环形链表判断是否有环

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 首先&#xff0c;我们先来看一下这段代码&#xff1a; /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ bool …

延时队列与redis and rabbitmq

延时队列是什么 延时队列&#xff08;Delay Queue&#xff09;是一种特殊的消息队列&#xff0c;它允许你在添加消息时设置一个延时时间&#xff0c;消息只有在延时时间到达后才能被消费。这种机制在分布式系统中非常有用&#xff0c;常用于处理需要在指定时间后执行的任务&am…

力扣面试经典算法150题:多数元素

多数元素 今天的题目是力扣面试经典150题中的数组的简单题: 多数元素 题目链接&#xff1a;https://leetcode.cn/problems/majority-element/description/?envTypestudy-plan-v2&envIdtop-interview-150 题目描述 给定一个大小为 n 的数组 nums&#xff0c;其中包含 n 个…

算法 二

求中点 LR&#xff0c;可能溢出 除以2&#xff0c;等同于右移一位 递归、递归的时间复杂度 母问题的规模 子问题的规模&#xff0c;且都相等 调用次数 不用展开看&#xff0c;就看一层。 归并排序 时间复杂度降低的原因&#xff1a;没有浪费比较。比如选择排序&#xff…