面试官问,怎么实现一个定时任务调度器?如果是分布式下的呢?

如何自己设计一个定时任务分布式调度器 使用分布式调度器能够很好的管理我们的定时任务接口,开发人员也只需专注开发业务接口,让业务与配置完全分离。定时配置还可以根据业务场景统一进行时间协调管理,以免在有些时间点多任务同时处理,可以将时间配置的分散点以减轻CPU的压力。如果系统业务量少,定时任务也不多的情况也没必要多浪费时间开发一个调度系统。 阅读详情

首先要思考一下通用的定时器大概包含哪些要素?首先,应该听过Quartz,Spring Schedule 等框架;往分布式研究,又有 SchedulerX,ElasticJob 等分布式任务调度。那么往底层实现看,又有多种定时器实现方案的原理、工作效率、数据结构等等可以进行思考。

那么抽象来说,定时器大概包含如下属性,判断一个任务是否到期,基本会采用轮询的方式,** 每隔一个时间片 ** 去检查 ** 最近的任务 ** 是否到期,并且,在 NewTask 和 Cancel 的行为发生之后,任务调度策略也会出现调整。

  • 存储一系列的任务集合,并且 Deadline 越接近的任务,拥有越高的执行优先级
  • NewTask:将新任务加入任务集合
  • Cancel:取消某个任务
  • Run:执行一个到期的定时任务

框架列举

  • 【单机】ScheduledExecutorService:相对延迟或者周期作为定时任务调度,缺点没有绝对的日期或者时间
  • 【单机】spring定时框架:配置简单功能较多,如果系统使用单机的话可以优先考虑spring定时器
  • 【分布式】Quartz:Java事实上的定时任务标准。但是Quartz可以基于数据库实现作业的高可用,有侵入性,而且缺少分布式并行调度的功能
  • 【分布式】Spring batch:轻量级的,完全面向Spring的批处理框架,可以应用于企业级大量的数据处理系统。Spring Batch可以提供大量的,可重复的数据处理功能,包括日志记录/跟踪,事务管理,作业处理统计工作重新启动、跳过,和资源管理等重要功能。
  • 【分布式】elastic-job:当当开发的弹性分布式任务调度系统,功能丰富强大,采用zookeeper实现分布式协调,实现任务高可用以及分片
  • 【分布式】xxl-job: 是大众点评员工徐雪里于2015年发布的分布式任务调度平台,是一个轻量级分布式任务调度框架,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。

支持集群部署

  • x-job:保证每个集群节点配置(db和登陆账号等)保持一致。调度中心通过db配置区分不同集群。执行器支持集群部署,提升调度系统可用性,同时提升任务处理能力。集群部署唯一要求为:保证集群中每个执行器的配置项 “xxl.job.admin.addresses/调度中心地址” 保持一致,执行器根据该配置进行执行器自动注册等操作。
  • e-job:重写Quartz基于数据库的分布式功能,用Zookeeper实现注册中心。作业注册中心: 基于Zookeeper和其客户端Curator实现的全局作业注册控制中心。用于注册,控制和协调分布式作业执行。

多节点部署时任务不能重复执行

  • x-job:使用Quartz基于数据库的分布式功能
  • e-job:将任务拆分为n个任务项后,各个服务器分别执行各自分配到的任务项。一旦有新的服务器加入集群,或现有服务器下线,elastic-job将在保留本次任务执行不变的情况下,下次任务开始前触发任务重分片。

日志

  • x-job:支持日志可追溯,有日志查询界面
  • e-job:可通过事件订阅的方式处理调度过程的重要事件,用于查询、统计和监控。Elastic-Job目前提供了基于关系型数据库两种事件订阅方式记录事件

监控报警

  • x-job:调度失败时,将会触发失败报警,如发送报警邮件。任务调度失败时邮件通知的邮箱地址,支持配置多邮箱地址,配置多个邮箱地址时用逗号分隔
  • e-job:通过事件订阅方式可自行实现

弹性扩容缩容

  • x-job:使用Quartz基于数据库的分布式功能,服务器超出一定数量会给数据库造成一定的压力
  • e-job:通过zk实现各服务的注册、控制及协调

支持并行调度

  • x-job:调度系统多线程(默认10个线程)触发调度运行,确保调度精确执行,不被堵塞
  • e-job:采用任务分片方式实现。将一个任务拆分为n个独立的任务项,由分布式的服务器并行执行各自分配到的分片项

高可用策略

  • x-job:“调度中心”通过DB锁保证集群分布式调度的一致性, 一次任务调度只会触发一次执行
  • e-job:调度器的高可用是通过运行几个指向同一个ZooKeeper集群的Elastic-Job-Cloud-Scheduler实例来实现的。ZooKeeper用于在当前主Elastic-Job-Cloud-Scheduler实例失败的情况下执行领导者选举。通过至少两个调度器实例来构成集群,集群中只有一个调度器实例提供服务,其他实例处于”待命”状态。当该实例失败时,集群会选举剩余实例中的一个来继续提供服务

失败处理策略

  • x-job:调度失败时的处理策略,策略包括:失败告警(默认)、失败重试
  • e-job:弹性扩容缩容在下次作业运行前重分片,但本次作业执行的过程中,下线的服务器所分配的作业将不会重新被分配。失效转移功能可以在本次作业运行中用空闲服务器抓取孤儿作业分片执行。同样失效转移功能也会牺牲部分性能

对比总结

  • x-Job 侧重的业务实现的简单和管理的方便,学习成本简单,失败策略和路由策略丰富。推荐使用在“用户基数相对少,服务器数量在一定范围内”的情景下使用
  • e-Job 关注的是数据,增加了弹性扩容和数据分片的思路,以便于更大限度的利用分布式服务器的资源。但是学习成本相对高些,推荐在“数据量庞大,且部署服务器数量较多”时使用

数据结构

我们主要衡量 NewTask(新增任务),Cancel(取消任务),Run(执行到期的定时任务)这三个指标,分析时间复杂度和空间复杂度。

双向有序链表(LinkedList)

NewTask:O(N)
Cancel:O(1)
Run:O(1)
N:任务数

堆(PriorityQueue)

在 Java 中,PriorityQueue 是一个天然的堆,可以利用传入的 Comparator 来决定其中元素的优先级。

NewTask:O(logN)
Cancel:O(logN)
Run:O(1)
N:任务数

expireTime 是 Comparator 的对比参数。NewTask O(logN) 和 Cancel O(logN) 分别对应堆插入和删除元素的时间复杂度 ;Run O(1),由 expireTime 形成的小根堆,我们总能在堆顶找到最快的即将过期的任务。

时间轮

Netty 针对 I/O 超时调度的场景进行了优化,实现了 HashedWheelTimer 时间轮算法。

HashedWheelTimer 是一个环形结构,可以用时钟来类比,钟面上有很多 bucket ,每一个 bucket 上可以存放多个任务,使用一个 List 保存该时刻到期的所有任务,同时一个指针随着时间流逝一格一格转动,并执行对应 bucket 上所有到期的任务。任务通过 取模 决定应该放入哪个 bucket 。和 HashMap 的原理类似,newTask 对应 put,使用 List 来解决 Hash 冲突。

NewTask:O(1)
Cancel:O(1)
Run:O(M)
Tick:O(1)
M: bucket ,M ~ N/C ,其中 C 为单轮 bucket 数,Netty 中默认为 512

构造 Netty 的 HashedWheelTimer 时有两个重要的参数:tickDuration 和 ticksPerWheel。

  1. tickDuration:即一个 bucket 代表的时间,默认为 100ms,Netty 认为大多数场景下不需要修改这个参数;
  2. ticksPerWheel:一轮含有多少个 bucket ,默认为 512 个,如果任务较多可以增大这个参数,降低任务分配到同一个 bucket 的概率。

层级时间轮

Kafka 针对时间轮算法进行了优化,实现了层级时间轮 TimingWheel

调度和任务分开执行

把调度和任务执行,隔离成两个部分:调度中心和执行器。调度中心模块只需要负责任务调度属性,触发调度命令。执行器接收调度命令,去执行具体的业务逻辑,而且两者都可以进行分布式扩容。

MQ模式

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

这种模型充分利用了MQ解耦的特性,调度中心发送任务,应用方作为执行器的角色,接收任务并执行。

但这种设计强依赖消息队列,可扩展性和功能,系统负载都和消息队列有极大的关联。这种架构设计需要架构师对消息队列非常熟悉。

XXL-JOB

XXL-JOB 是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。

热力学仿真软件:ANSYS CFX_(15).旋转机械仿真 创建旋转域在中选择需要设置为旋转域的区域。选择选项。设置旋转速度在设置中,指定旋转速度(单位为弧度/秒)。也可以选择选项,并输入具体值。设置旋转轴在设置中,指定旋转轴的方向和位置。通常旋转轴的方向可以使用单位向量来表示,例如[0, 0, 1]表示沿Z轴旋转。旋转轴的位置可以通过指定一个点的坐标来确定,例如[0, 0, 0]表示旋转轴通过原点。旋转机械的仿真在ANSYS CFX中是一个复杂但重要的过程。 阅读详情

相关推荐

从音频录制到智能手表:Sigma-Delta ADC是如何在低功耗场景下‘欺骗’噪声的?

本文深入解析Sigma-Delta ADC在智能穿戴设备中的低功耗高精度实现原理,重点介绍其通过过采样和噪声整形技术‘欺骗’噪声的独特方法。以TWS耳机和医疗级健康监测为例,展示该技术如何在有限功耗预算下实现专业级信号采集,为消费电子设计提供关键解决方案。

weixin_30825581的博客 389

定时调度任务

任务调度,由浅入深,让任务更加便于管理

lhssy的博客 800

树莓派+STM32+激光雷达:大学生工训赛智能物流小车全栈开发实录(附避坑指南)

本文详细记录了基于树莓派、STM32和激光雷达的智能物流小车全栈开发过程。文章从系统架构设计、硬件集成、软件框架搭建到机械臂控制与视觉辅助定位,系统阐述了如何构建一个完整的机器人系统,并分享了在电源管理、通信延迟、里程计误差等关键环节的实战避坑指南,为嵌入式与机器人开发提供了宝贵经验。

kotlin6android的博客 748

定时器 也叫任务调度器 Spring的定时任务 xxl-job分布式任务调度

一。概述 Cron表达式是一个字符串,字符串以5或6个空格隔开,中间均由空格隔开,分为6或7个域,每一个域代表一个含义,Cron有如下两种语法格式: 1.Seconds Minutes Hours DayofMonth Month DayofWeek Year 秒 分 小时 几号 几月 周几 年 2.Seconds Minutes Hours DayofMonth Month DayofWeek 秒 分 小时 几号 几月 周几 二。符号详细说明 * 表示匹配该域的任意值,假如在Minu

飘然生的博客 4195

QT+SOEM主站协议库实战指南—从编译到嵌入式应用

本文提供了一份QT与SOEM开源EtherCAT主站协议库的集成实战指南。详细介绍了在Windows和Linux平台下编译SOEM库的步骤,并讲解了如何将其无缝集成到QT项目中,构建具备实时监控与控制功能的工业上位机应用。内容涵盖从环境搭建、核心协议开发到嵌入式部署与优化的全流程,为开发高性价比、自主可控的工业控制解决方案提供完整路径。

u6v7w8x的博客 440

ESP-Mesh-Lite vs ESP-Mesh:如何选择适合你的物联网组网方案?

本文深入对比了乐鑫ESP-Mesh-Lite与ESP-Mesh两种物联网组网方案的核心差异。重点解析了ESP-Mesh-Lite分布式协议栈架构的优势,即每个节点拥有独立IP,可直接访问外部网络,极大简化了应用层开发。文章从网络架构、性能、开发体验及适用场景等多维度进行分析,为开发者根据项目需求(如分布式数据采集、智能家居或集中控制网络)选择最合适的方案提供了清晰的决策框架。

pluto的博客 817

【源码解析】时间轮机制在Redisson分布式锁中的实际应用以及时间轮源码分析

【源码解析】时间轮机制在Redisson分布式锁中的实际应用以及时间轮源码分析

秋装什么的博客 628

波束管理 Beam Management

Beam Management in 5G NR   波束管理,是5G NR中基于信道质量来动态选择每个UE和gNB之间以什么方向和频率的波束beam来进行通信。   背景   5G NR(New Radio)支持非常高的数据速率和更低的延迟。5G NR支持FR1和FR2频段,FR1为亚6 GHz(450至6000 MHz);FR2为毫米波段(24.25 GHz至52.6 GHz)。   由于毫米波频带使用非常高的频率,因此会导致传播损耗和其他损耗。为了补偿损失,在这种频率下定向通信是必不可少的。

最忆是江南的博客 5826

分布式定时任务xxl-Job

一款分布式的任务调度器xxl-job。xxl-job是一款极容易学习上手的轻量级开源分布式调度框架,分为管理端和执行端两块。

sv 2512

vue 插件vue-awesome-swiper实现 三张图片,左右两边显示一半的效果的示例

希望我的愚见能够帮助你哦~,若有不足之处,还望指出,你们有更好的解决方法,欢迎大家在评论区下方留言支持,大家一起相互学习参考呀~

weixin_50450473的博客 3248

SAP PP CSAP_MAT_BOM_MAINTAIN ECN 增加组件

SAP PP CSAP_MAT_BOM_MAINTAIN ECN 增加组件。

GAVIN 410

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

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

zjj2006的专栏 1158

别再傻傻分不清PBR和NPR了!从《原神》到《双城之战》,聊聊游戏里那些让你眼前一亮的渲染风格

本文深入解析了PBR(基于物理的渲染)与NPR(非真实感渲染)在游戏视觉风格中的应用差异,通过《原神》和《双城之战》的案例,展示了两种渲染技术如何创造出截然不同的艺术效果。从技术原理到实战案例,帮助读者理解如何根据项目需求选择合适的渲染风格。

weixin_30425949的博客 147

面试官问:什么是分布式定时任务调度?

面试官问:什么是分布式定时任务调度? 一脸懵逼,啥啊

励志成为一名优秀的全能型软件开发工程师。 921

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

分布式面试题

分布式事务解决方案Seata原理 在 Seata 中主要有以下三种角色,其中 TM 和 RM 是作为 Seata 的客户端与业务系统集成在一起,TC 作为 Seata 的服务端独立部署: 事务协调器(TC):维护全局事务的运行状态,负责协调并驱动全局提交或回滚。 事务管理器(TM):事务发起方,控制全局事务的范围,负责开启一个全局事务,并最终发起全局提交或回滚全局的决议。 资源管理器(RM):事务参与方,管理本地事务正在处理的资源,负责向 TC 注册本地事务、汇报本地事务状态,接收 TC 的命令来驱动本地事

公众号-程序员灿灿 666

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

面试官问:生成订单30分钟未支付,则自动取消,该怎么实现?

来源:blog.youkuaiyun.com/hjm4702192/article/details/80519010今天给大家上一盘硬菜,并且是支付中非常重要的一个技术解决方案,有这块业务的同学注意自己试一把了哈!在开发中,往往会遇到一些关于延时任务的需求。例如生成订单30分钟未支付,则自动取消生成订单60秒后,给用户发短信对上述的任务,我们给一个专业的名字来形容,那就是延时任务。那么这里就会产生一个问题,这...

程序IT圈 108

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

分布式定时任务实战:从Quartz集群到XXL-JOB的避坑指南

定时任务是后端开发中的基础功能,用于在预定时间自动执行程序逻辑,常见于数据清理、报表生成等场景。其核心原理是通过时间触发器驱动任务执行。在单体架构中,可通过操作系统级工具或框架注解实现。然而,当系统演进为分布式架构时,单机方案会暴露任务重复执行、单点故障等问题,此时需引入分布式调度技术。分布式调度通过中心化协调器统一管理任务触发与分派,确保高可用与一致性,其技术价值在于提升系统可靠性与可扩展性。在实际应用中,Spring Boot集成Quartz集群与XXL-JOB是两种典型方案。本文聚焦于**任务重复执行

weixin_33326218的博客 289

【2024届秋招】Golang后端面试场景题面经

Golang后端面试场景题、智力题,面经

qq_56924476的博客 3081

终面倒计时10分钟:候选人用`asyncio`实现分布式任务调度,P8考官追问性能瓶颈

在终面的最后10分钟,面试官要求候选人使用`asyncio`设计一个分布式任务调度系统,用于协调多个异步任务的执行。候选人提出了基于`asyncio`协程和`aiohttp`的解决方案,但面试官紧接着追问系统在高并发场景下的性能瓶颈,并要求深入分析如何优化任务调度的效率。

itAred的博客 926

招行面试: 分布式调度 设计,要考虑 哪些问题?

任务调度,顾名思义,是指对计算任务进行合理安排和调度的过程。在计算机领域,任务调度主要指的是对计算任务在计算资源上的分配和执行顺序的管理。通过任务调度,可以有效利用计算资源,提高系统的运行效率和性能。高并发、大数据、AI智能体 时代来了。单一计算节点已经无法满足海量数据处理和复杂计算的需求。分布式系统以其能够横向扩展、高可靠性等优势成为了解决这一问题的主要手段。而。

架构师尼恩 1678

Java定时任务调度详解,从外包月薪5K到阿里月薪15K

切莫死记硬背,小心面试官直接让你出门右拐1000道互联网Java面试题:Java高级架构面试知识整理:服务实战:[外链图片转存中…(img-M0OQavLZ-1711558127394)]

m0_63102527的博客 604

终面倒计时5分钟:候选人用`asyncio`实现分布式任务调度

在终面最后5分钟,面试官提出如何用`asyncio`解决分布式任务调度的性能瓶颈。候选人需要在短时间内设计一个异步任务调度器,以应对高并发场景下的任务分配与执行问题。

itAred的博客 362

【058期】面试官问:Java 线程中如何保证通信,都有哪些方式?

关于分布式,限流+缓存+缓存,这三大技术(包含:ZooKeeper+Nginx+MongoDB+memcached+Redis+ActiveMQ+Kafka+RabbitMQ)等等。这些相关的面试也好,还有手写以及学习的笔记PDF,都是啃透分布式技术必不可少的宝藏。以上的每一个专题每一个小分类都有相关的介绍,并且小编也已经将其整理成PDF啦存中…(img-Sy6WSAsh-1714506106136)]

2301_76348344的博客 753

xxl-job 源码解析,分布式任务调度xxl-job (一)

-- 客户端主动上报,服务端接收数据。|-- 服务端主动探查,客户端返回数据。5.6 glu模式,客户端不使用继承,或注解方式,如何做到执行一个任务 (好几年之前,有个面试官问过我这个问题==)-- 多语言支持较弱,如果支持多语言是否也可以做成nacos现在这样采用grpc?├─ xxl-job-core -- 执行器 (客户端)带着问题看源码,并且知道它是如何做到的,相信xxl-job你已经搞定了!xxl-job-admin -- 调度器 (服务端)-- 如何优雅下线?

求是 423

Quartz集成springMVC 的方案二(持久化任务、集群和分布式)

阿里的面试官问,如果现在很多调度任务,如何优化,可以使用调度池参考:ScheduledExecutor, 参考:Java 几种调度任务的Timer、ScheduledExecutor、 开源工具包 Quartz、开源工具包 JCronTab 言归正传: Quartz是一个开放源码项目,专注于任务调度器,提供了极为广泛的特性如持久化任务,集群和分布式任务等。Quartz核心是...

100

系统设计题面试八股文背诵版

文章目录:面试时回答系统设计题的思路系统的一些性能指标经典系统设计题与思路分布式ID生成器短网址系统定时任务调度器最近一个小时内访问频率最高的10个IPkey-Value存储引擎Manifest文件Log文件数据流采样基数估计频率估计Top k频繁项范围查询成员查询。...

weixin_70730532的博客 2125
上一篇: 经典面试题——让你设计一个限流的系统怎么做?
下一篇: java登录限流实现
Javaesandyou
博客等级 码龄5年 742粉丝 563原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值