分布式定时任务系统介绍(分布式定时任务框架)
ccwgpt 2024-11-09 11:23 20 浏览 0 评论
背景
如今的互联网应用中充斥着大量的任务,这些任务往往体量大、实时性要求高,单机难以完成任务的处理。而随着微服务化架构的逐步演进,逐渐演进出了分布式任务调度系统,解决了大批量任务的调度与执行问题。
什么时候需要分布式任务?
1、每天饭点的时候向所有订阅的工作群发送饭点通知。如何在短时间内找到所有需要的群聊,完成通知的发送?
2、有大量的视频/图片需要转码,且它们对应着不同的业务线和下游转码队列,如何合理的管理这一系列任务的调度和执行?
3、有上万张照片需要处理,处理若干小时后后再给用户回调,如何保证任务的成功执行,数据不丢失?
类似于这种:1、基于准确的时刻或者固定的时间间隔触发的任务;2、有批量数据需要处理;3、要实现两个动作解耦的场景;我们都可以用分布式任务来实现。
任务定义
任务类型
根据任务的特点,可以将分布式任务大概可以分为以下四种类型:
- 单机任务:随机触发一台机器执行任务,适用于计算量小、并发度低的任务
- 广播任务:广播到所有机器上执行同一个任务,比如所有机器一起清理日志
- Map任务:一个任务可以分出多个子任务,每个子任务负责一部分的计算。适用于计算量大,单机无法满足要求的任务
- MapReduce任务:在Map任务的基础上,还可以对所有子任务的结果做汇总计算,适用于计算量大,并需要对子任务结果做汇总的任务
基本概念
- 任务(Job):任务元数据,其中主要包括:基础信息:任务的原信息调度时机:什么时机触发任务执行行为:任务的行为是什么,需要通过代码定义执行方式:如何执行,单机任务 or 广播任务 or map任务 or map reduce任务
- 任务实例(JobInstance):任务运行的一个实例,代表任务的一次执行。其中主要包括Job_id、触发时间、执行状态、执行结果、过程信息等。
- 任务结果(JobResult):任务实例运行的结果(任务实例可能在执行时失败,并重试)
- 任务历史(JobHistory):用户可以修改任务信息,任务实例对应的任务元数据可以不同,因此使用任务历史存储
核心架构
分布式任务核心要解决触发、调度、执行三个问题,除此之外还需要提供一个控制台
- 触发器(Trigger):解析任务,生成触发事件,保证任务在合适的时机被触发
- 调度器(Scheduler):分配任务,管理任务生命周期,面对多种下游资源如何进行合理地调度
- 执行器(Executor):获取执行任务单元,执行任务逻辑
- 控制台(Admin):提供执行任务管理和干预的功能
运行流程
分布式任务调度平台运行的大致流程为:
- 用户首先把任务的基础信息(who)、触发规则(when)、任务代码(what)在控制台中配置好,控制台会将以上的信息存入DB中
- Trigger会判断任务应该在什么时机去执行,在需要执行的时候进行任务的触发
- Scheduler会对任务做整体的协调,决定任务的执行方式和资源分配
- Executor收到执行通知后,进行任务的执行
触发器
触发方式
定时扫描
- Trigger中有扫描器负责定时扫描,判断是否有任务满足触发条件
- 将满足触发条件的任务发送到MQ中,若任务不需立刻执行则可以使用延时队列
- 修改DB中任务的状态,防止任务被重复触发
- Scheduler进行任务调度
时间轮算法
时间轮 是一种 实现延迟功能(定时器) 的 算法。如果一个系统存在大量的任务调度,时间轮可以高效的利用线程资源来进行批量化调度。把大批量的调度任务全部都绑定在时间轮上,通过时间轮进行所有任务的管理,触发以及运行。能够高效地管理各种延时任务,周期任务,通知任务等。
时间轮(TimingWheel)是一个 存储定时任务的环形队列,底层采用数组实现,数组中的每个元素可以存放一个定时任务列表。定时任务列表是一个链表,链表中的每一项表示的都是定时任务项,其中封装了真正的定时任务。时间轮结构中有一个代表当前时间的指针(currentTime),定时器每超时一次,就把当前指针指向环形队列的下一个格子,并执行对应时间内任务列表中的任务。
时间轮算法的查询复杂度、修改复杂度均为O(1)。
上图所展示的时间轮,可以表示一分钟内每一秒所对应的任务。但是如果设置一个3分48秒后触发的任务,已经超出了该时间轮所能表示的范围,需要怎么处理呢?有多种思路:
- 对任务增加round字段,指针每扫过一次就将round减1,代表时间已经过去了一分钟,当round变为0时就需要对任务进行执行
- 多级时间轮:多层时间轮分别代表时、分、秒。通过时间轮的升、降级来表示更大尺度的时间跨度。 假设我们的任务需要在每天的 6:20:40 秒执行一次。由于时间执行时间大于秒级和分钟级的时间轮,所以任务首先将添加于小时级的第6号刻度上。当其轮询指针访问到第6号刻度时,就将此任务转移到分钟级别时间轮的第20号刻度上。当分钟级的时间轮指针访问到第20号刻度时,就将此任务转移到秒级别时间轮的第40号刻度上。当秒级别时间轮指针访问到第40号刻度时,会将任务交给异步线程负责执行,然后将任务再次注册到小时级别的时间轮中。
其他
针对不同的业务场景也会存在很多其他触发规则,比如根据下游资源的拥塞情况进行触发等。
高可用
不同业务、场景之间的触发如何避免互相影响?
- 存储上,可以根据国家、场景等做资源隔离
- 运行时,可以将不同国家、场景分开执行
如何避免单点故障、任务重复触发?
可以通过部署多个Trigger实例来避免单点故障,但同时需要保证任务不会被重复触发
- 数据库行锁:触发任务前更新数据库中任务实例的状态,若更新成功则进行调度,抢锁失败则放弃调度。但是数据库瓶颈较低
- 分布式锁:通过Redis/ZooKeeper实现分布式锁,从而避免重复触发
调度器
资源调度策略
单个调度器所能调度的执行器往往不是单一的,对于不同的任务应该选择的调度策略大概可以分为以下几类:
- 随机节点执行:随机选择集群中一个可用的节点执行调度任务。
- 广播执行:向集群中所有节点分发调度任务并执行。
- 分片执行:按照一定的逻辑对任务进行拆分,并分发到集群中不同的节点并行执行,该方式可以提高执行效率和资源利用率。分片任务通常基于一致性hash策略分发任务
重试策略
Executor的执行并不是完全可靠的,因此在任务调度失败后,如何进行重试就显得尤为重要。
- 如果Scheduler是通过hash的方式进行任务分配,则调度失败后可以通过rehash的方式实现任务的重试
- 如果通过MQ的方式进行任务分配,则可以通过重发任务消息的方式进行重试
执行器
总结
本文介绍了分布式任务调度系统的整体架构设计,并对其核心组成:触发器、调度器、执行器、控制台分别做了介绍。在工作中,很多系统其实都可以借鉴分布式任务调度系统的设计思路,希望本文所提到的一些内容在大家今后的架构设计中能够有所助益。
相关推荐
- 定时任务工具,《此刻我要...》软件体验
-
之前果核给大家介绍过一款小众但实用的软件——小说规则下载器,可以把网页里的小说章节按照规则下载到本地,非常适合喜欢阅读小说的朋友。有意思的是,软件作者当时看到果核写的体验内容后,给反推荐到他的帖子里去...
- 前端定时任务的神库:Node-cron,让你的项目更高效!
-
在前端开发中,定时任务是一个常见的需求。无论是定时刷新数据、轮询接口,还是发送提醒,都需要一个可靠且灵活的定时任务解决方案。今天,我要向大家介绍一个强大的工具——Node-cron,它不仅能解决定时任...
- Shutter Pro!一款多功能定时执行任务工具
-
这是一款可以在电脑上定时执行多种任务的小工具,使用它可以根据时间,电量等来设定一些定时任务,像定时打开程序、打开文件,定时关机重启,以及定时弹窗提醒等都可以轻松做到。这是个即开即用的小工具,无需安装,...
- 深度解析 Redis 缓存击穿及解决方案
-
在当今互联网大厂的后端开发体系中,Redis缓存占据着极为关键的地位。其凭借高性能、丰富的数据类型以及原子性操作等显著优势,助力众多高并发系统从容应对海量用户的访问冲击,已然成为后端开发从业者不可或...
- 从零搭建体育比分网站完整步骤(比较好的体育比分软件)
-
搭建一个体育比分网站是一个涉及前端、后端、数据源、部署和维护的完整项目。以下是从零开始搭建的详细流程:一、明确项目需求1.功能需求:实时比分展示(如足球、篮球、网球等)支持多个联赛和赛事历史数据查询比...
- 告别复杂命令行:GoCron 图形界面让定时任务触手可及
-
如果你是运维人员或者经常接触一些定时任务的配置,那么你一定希望有一款图形界面来帮助你方便的轻松配置定时任务,而GoCron就是这样一款软件,让你的配置可视化。什么是GoCron从名字你就可以大概猜到,...
- Java任务管理框架核心技术解析与分布式高并发实战指南
-
在当今数字化时代,Java任务管理框架在众多应用场景中发挥着关键作用。随着业务规模的不断扩大,面对分布式高并发的复杂环境,掌握其核心技术并进行实战显得尤为重要。Java任务管理框架的核心技术涵盖多个方...
- 链表和结构体实现:MCU软件定时器(链表在单片机中的应用)
-
在一般的嵌入式产品设计中,介于成本、功耗等,所选型的MCU基本都是资源受限的,而里面的定时器的数量更是有限。在我们软件设计中往往有多种定时需求,例如脉冲输出、按键检测、LCD切屏延时等等,我们不可能...
- SpringBoot定时任务(springboot定时任务每小时执行一次)
-
前言在我们开发中,经常碰到在某个时间点去执行某些操作,而我们不能人为的干预执行,这个时候就需要我们使用定时任务去完成该任务,下面我们来介绍下载springBoot中定时任务实现的方式。定时任务实现方式...
- 定时任务新玩法!systemd timer 完整实战详解
-
原文链接:「链接」Hello,大家好啊!今天给大家带来一篇使用systemdtimer实现定时任务调度的详细实战文章。相比传统的crontab,systemdtimer更加现代化、结构清晰...
- Celery与Django:打造高效DevOps的定时任务与异步处理神器
-
本文详细介绍了Celery这一强大的异步任务队列系统,以及如何在Django框架中应用它来实现定时任务和异步处理,从而提高运维开发(DevOps)的效率和应用性能。下面我们先认识一下Cele...
- 订单超时自动取消的7种方案,我用这种!
-
前言在电商、外卖、票务等系统中,订单超时未支付自动取消是一个常见的需求。这个功能乍一看很简单,甚至很多初学者会觉得:"不就是加个定时器么?"但真到了实际工作中,细节的复杂程度往往会超...
- 裸机下多任务框架设计与实现(gd32裸机配置lwip 网络ping不通)
-
在嵌入式系统中,特别是在没有操作系统支持的裸机环境下,实现多任务执行是一个常见的挑战。本文将详细介绍一种基于定时器的多任务框架设计,通过全局时钟和状态机机制,实现任务的非阻塞调度,确保任务执行中不会出...
- 亿级高性能通知系统构建,小白也能拿来即用
-
作者介绍赵培龙,采货侠JAVA开发工程师分享概要一、服务划分二、系统设计1、首次消息发送2、重试消息发送三、稳定性的保障1、流量突增2、问题服务的资源隔离3、第三方服务的保护4、中间件的容错5、完善...
- 运维实战:深度拆解Systemd定时任务原理,90%的人不知道的玩法
-
运维实战:深度拆解Systemd定时任务原理,90%的人不知道的高效玩法一、Systemd定时任务的核心原理Systemd定时任务是Linux系统中替代传统cron的现代化解决方案,通过...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- MVC框架 (46)
- spring框架 (46)
- 框架图 (58)
- bootstrap框架 (43)
- flask框架 (53)
- quartz框架 (51)
- abp框架 (47)
- jpa框架 (47)
- laravel框架 (46)
- express框架 (43)
- springmvc框架 (49)
- 分布式事务框架 (65)
- scrapy框架 (56)
- shiro框架 (61)
- 定时任务框架 (56)
- grpc框架 (55)
- ppt框架 (48)
- 内联框架 (52)
- winform框架 (46)
- gui框架 (44)
- cad怎么画框架 (58)
- ps怎么画框架 (47)
- ssm框架实现登录注册 (49)
- oracle字符串长度 (48)
- oracle提交事务 (47)