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

还有人不懂什么是分布式任务调度么?

ccwgpt 2024-09-29 09:54 37 浏览 0 评论

什么是任务调度?

在了解分布式任务调度之前,首先我们需要知道什么是任务调度?现在思考这样几个场景。

  • 有一个系统,需要下午18:00举行一个活动。
  • 当你领取了某商场的消费券的时候,需要在到期三天之前提醒你消费
  • 银行核心系统需要在每天凌晨三点做结算操作
  • 618、双十一商家需要定时发送优惠券
  • ……

当然这样的场景会有很多,面对这样的问题很多人就会想到使用定时任务,也就是任务调度去解决。

所谓的任务调度,就是由系统自动去完成某些特定的任务,系统会根据约定的规则在指定的时间去执行一些特定的任务。这样可以在极大程度上减少了人工工作的压力。

如何去实现任务调度呢?

相信很多人都见过这样的代码,这个代码所完成的的功能就是让线程每隔一段时间去执行一次,厉害吧,还有更绝的就是每个24小时执行一次,开发者就把当前的线程Sleep的时间改成24*60*6000,绝了吧

public static void main(String[] args) {    
  	//任务执行间隔时间
    final long timeInterval = 1000;
    Runnable runnable = new Runnable() {
        public void run() {
            while (true) {
                //TODO:something
                try {
                    Thread.sleep(timeInterval);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    };
    Thread thread = new Thread(runnable);
    thread.start();
}

当然上面代码确实可以完成定时任务的调度,但是确实也是有招胜无招呀,总比没有的要强呀。

其实JDK早就为我们提供了定时任务有关的方法,只不过在我们学习Java基础的时候没有认真听讲罢了。

例如我们可以使用Timer来实现定时任务。

public static void main(String[] args){  
   	Timer timer = new Timer();  
   	timer.schedule(new TimerTask(){
        @Override  
        public void run() {  
           //TODO:something
        }  
	}, 1000, 2000);  //1秒后开始调度,每2秒执行一次
}

或者使用ScheduledExecutor的方式来实现任务调度。

public static void main(String [] agrs){
    ScheduledExecutorService service = Executors.newScheduledThreadPool(10);
    service.scheduleAtFixedRate(
        new Runnable() {
            @Override
            public void run() {
                //TODO:something
                System.out.println("todo something");
            }
        }, 1,
        2, TimeUnit.SECONDS);
}

可以看出以上两种方式都可以完成任务的调度。但是会发现,以上的两种方式只能完成在一段时间内定时执行的任务,而无法完成指定时间的任务调度。这该如何是好呢?难道要像上面一样,使用Thread.sleep么?其实不然,下面我们就来介绍几种任务调度的框架。

Quartz任务调度框架

从上面的例子中,我们可以知道,Timer、ScheduledExecutor可以完成一些简单的定时任务的执行调度,但是对于一些复杂的任务调度操作确实很难实现,这个时候,我们就需要使用到Quartz任务调度框架。

Quartz核心设计包括Scheduler、Job以及Trigger等等,其中Job就是用来执行定时任务的具体操作而Trigger则是负责来设计执行的策略也就是说什么时候执行,执行多少次。而Scheduler则是将两者组合到一起共同来完成定时任务操作。

Quartz通过Cron表达式来确定如何去执行定时任务。具体操作有兴趣的读者可以查看相关文档。这里篇幅有限,就不做过多示例。

什么是分布式任务调度?

通常如上面所说的那种情况,定时任务都是在单体应用中去执行的。例如定时发布活动、定时发布优惠券等等操作。但在分布式系统中由于系统是分布式部署的,一个服务往往会存在多个实例的情况,这种在分布式系统中运行的任务调度的情况被称为是分布式任务调度。如下图所示。

分布式任务调度所面临的问题

在分布式系统情况下设计一个任务调度管理需要面对各种各样的问题。

  • 当任务以集群方式部署的时候,同一个调度任务可能会被多次重复执行。例如如果要定期发放优惠券,如果多个实例中出现重复执行的任务,就有可能会出现重复发放优惠券的情况。
  • 如何能够在不去重启服务的情况下实现对于定时任务的动态调整。例如一个活动,因为要临时修改开始时间,所以要动态对于开始时间进行调整
  • 如果存在定时任务的节点发生故障之后,如何能够快速的将任务执行转移到其他节点上,或者是对故障进行快速的解决。
  • 如何能够实现对任务执行情况的实时监控
  • 如何能够在单节点出现瓶颈的时候,进行快速扩容操作
  • 如何能够合理的实现定时任务的拆分,如下图所示。

这些问题都是我们在设计分布式任务调度的时候需要去考虑的问题。例如可以使用分布式锁来解决重复执行问题,可以使用配置文件、或者是Redis KV存储结构来存储任务调度的时间,这样可以保证动态时间调整等等。

分布式调度框架

  • TBSchedule:基于ZooKeeper的纯Java实现,由Alibaba开源
  • Elastic-job:当当网基于quartz 二次开发的弹性分布式任务调度系统,功能丰富强大,采用zookeeper实现分布式协调,实现任务高可用以及分片。Elastic-Job是一个分布式调度的解决方案,由当当网开源,它由两个相互独立的子项目Elastic-Job-Lite和Elastic-Job-Cloud组成,使用Elastic-Job可以快速实现分布式任务调度。
  • XXL-JOB:xxl是xxl-job的开发者大众点评的许雪里名称的拼音开头。其核心设计目标是:学习简单、开发迅速、轻量级、易扩展。

总结

上面我们介绍了定时任务以及分布式任务调度。其实分布式任务调度的核心就是如何能够保证在同一时刻只有一个任务执行,以及如何对一个大任务进行拆分,在解决这两个根本问题的时候就会出现各种各样的小问题,当我们将问题全部解决之后,就实现了分布式任务调度。

相关推荐

如何高效实现API接口的自动化测试?

实现API接口的自动化测试是一个多步骤的过程,涉及需求分析、测试用例设计、环境搭建、脚本编写、执行测试、结果分析和持续集成等多个环节。选择合适的工具和框架也是成功的关键。嘿,咱来聊聊实现API接口自动...

总结100+前端优质库,让你成为前端百事通

1年多时间,陆陆续续整理了一些常用且实用的开源项目,方便大家更高效地学习和工作.js相关库js常用工具类「lodash」一个一致性、模块化、高性能的JavaScript实用工具库。「xij...

混合开发到底怎么个混法?(混合开发rn)

引言最近几年混合开发越来越火,从PhoneGap到Cordova到Ionic,再到ReactNative,到Flutter。同时在搜索引擎中诸如IonicVSReactNativeRN和Weex+...

无所不能,将 Vue 渲染到嵌入式液晶屏

该文章转载自公众号@前端时刻,https://mp.weixin.qq.com/s/WDHW36zhfNFVFVv4jO2vrA前言之前看了雪碧大佬的将React渲染到嵌入式液晶屏觉得很有意思,R...

【直接收藏】前端 VUE 高阶面试题(一)

说说vue动态权限绑定渲染列表(权限列表渲染)首先请求服务器,获取当前用户的权限数据,比如请求this.$http.get("rights/list");获取到权限数据之后,在列表中...

Vue采用虚拟DOM的目的是什么?(vue2 虚拟dom)

虚拟DOM更新其实效率并不像大家想象中的那么高,而且React官方也从来没说过虚拟DOM效率有多高,相反React虚拟DOM的实现也不是所有虚拟DOM产品中最好的。但是通过虚拟D...

什么是 JavaScript?(什么是党的旗帜)

本文首发自「慕课网」,想了解更多IT干货内容,程序员圈内热闻,欢迎关注!作者|慕课网精英讲师然冬JavaScript(JS)是一种具有函数优先的轻量级,解释型或即时编译型的编程语言。(MDN...

Weex在内涵发现页中的工程实践(weex唯客交易所官网)

React-Native和Weex是目前最为火热的两个客户端跨平台解决方案。从去年2016年9月份开始,IES在抖音产品中应用了ReactNative,中途遇到了很多的问题,尤其是长列表的性能问题一...

新恒汇:公司主要业务包括智能卡业务、蚀刻引线框架业务以及物联网eSIM芯片封测业务

证券日报网讯新恒汇7月3日在互动平台回答投资者提问时表示,公司主要业务包括智能卡业务、蚀刻引线框架业务以及物联网eSIM芯片封测业务。具体请关注公司公告和公开披露信息。(编辑王雪儿)...

“移”科普——什么是物联网?(移动设备物联网物联网应用实例)

物联网(InternetofThings,简称IoT)是指通过互联网将物理世界与数字世界相连接,实现物与物之间的智能互联的网络。它是一种新型的信息通信技术,通过传感器、嵌入式系统、网络技术等手段,...

如何自己搭建一个物联网平台?(自建物联网云平台)

自己搭建一个物联网(IoT)平台需要涉及多个关键步骤,包括硬件设备的选择、软件开发、网络通信、安全性设计以及数据管理。以下是搭建物联网平台的基本流程:1.确定物联网平台架构一个完整的物联网平台通常包...

物联网数据接入篇-应用层 Modbus(5)

前四篇文章讲述的是TCP/IP模型中的网络接口层、网络层、传输层、应用层一,这里到了第四层应用层二。由于协议比较多,就分开篇来介绍。这篇讲Modbus协议,后面再讲MQTT协议、CoAP协议、...

乐鑫ESP32-C5全面量产:行业首款双频Wi-Fi 6的RISC-V SoC

IT之家5月2日消息,乐鑫信息科技4月30日宣布,ESP32-C5现已全面进入量产。ESP32-C5宣称是行业首款2.4&5GHz双频Wi-Fi6的RISC-...

Vue Shop Admin:强大而易用的后台管理系统模板

VueShopAdmin是一个基于Vue.js框架的后台管理系统模板。它具有简洁、易用和美观的特点,非常适合开发人员用于快速构建各种类型的管理系统。这个模板使用了最新的技术,如Vue3、V...

基于Prometheus的自动化巡检(prometheus自动发现详解)

!!大家好,我是乔克,一个爱折腾的运维工程,一个睡觉都被自己丑醒的云原生爱好者。作者:乔克公众号:运维开发故事道路千万条,安全第一条。操作不规范,运维两行泪。前言目前,大部分公司都采用Promet...

取消回复欢迎 发表评论: