百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

分布式定时任务系统介绍(分布式定时任务框架)

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):提供执行任务管理和干预的功能

运行流程

分布式任务调度平台运行的大致流程为:

  1. 用户首先把任务的基础信息(who)、触发规则(when)、任务代码(what)在控制台中配置好,控制台会将以上的信息存入DB中
  2. Trigger会判断任务应该在什么时机去执行,在需要执行的时候进行任务的触发
  3. Scheduler会对任务做整体的协调,决定任务的执行方式和资源分配
  4. Executor收到执行通知后,进行任务的执行

触发器

触发方式

定时扫描

  1. Trigger中有扫描器负责定时扫描,判断是否有任务满足触发条件
  2. 将满足触发条件的任务发送到MQ中,若任务不需立刻执行则可以使用延时队列
  3. 修改DB中任务的状态,防止任务被重复触发
  4. Scheduler进行任务调度

时间轮算法

时间轮 是一种 实现延迟功能(定时器)算法。如果一个系统存在大量的任务调度,时间轮可以高效的利用线程资源来进行批量化调度。把大批量的调度任务全部都绑定在时间轮上,通过时间轮进行所有任务的管理,触发以及运行。能够高效地管理各种延时任务,周期任务,通知任务等。

时间轮(TimingWheel)是一个 存储定时任务的环形队列,底层采用数组实现,数组中的每个元素可以存放一个定时任务列表。定时任务列表是一个链表,链表中的每一项表示的都是定时任务项,其中封装了真正的定时任务。时间轮结构中有一个代表当前时间的指针(currentTime),定时器每超时一次,就把当前指针指向环形队列的下一个格子,并执行对应时间内任务列表中的任务。

时间轮算法的查询复杂度、修改复杂度均为O(1)

上图所展示的时间轮,可以表示一分钟内每一秒所对应的任务。但是如果设置一个3分48秒后触发的任务,已经超出了该时间轮所能表示的范围,需要怎么处理呢?有多种思路:

  • 对任务增加round字段,指针每扫过一次就将round减1,代表时间已经过去了一分钟,当round变为0时就需要对任务进行执行
  • 多级时间轮:多层时间轮分别代表时、分、秒。通过时间轮的升、降级来表示更大尺度的时间跨度。 假设我们的任务需要在每天的 6:20:40 秒执行一次。由于时间执行时间大于秒级和分钟级的时间轮,所以任务首先将添加于小时级的第6号刻度上。当其轮询指针访问到第6号刻度时,就将此任务转移到分钟级别时间轮的第20号刻度上。当分钟级的时间轮指针访问到第20号刻度时,就将此任务转移到秒级别时间轮的第40号刻度上。当秒级别时间轮指针访问到第40号刻度时,会将任务交给异步线程负责执行,然后将任务再次注册到小时级别的时间轮中。

其他

针对不同的业务场景也会存在很多其他触发规则,比如根据下游资源的拥塞情况进行触发等。

高可用

不同业务、场景之间的触发如何避免互相影响?

  1. 存储上,可以根据国家、场景等做资源隔离
  2. 运行时,可以将不同国家、场景分开执行

如何避免单点故障、任务重复触发?

可以通过部署多个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的现代化解决方案,通过...

取消回复欢迎 发表评论: