Elastic-job动态任务调度实战

Elastic-job动态添加任务实战

项目要求

利用任务调度框架,实现一个服务按一定的时间规则给其他服务发送Htttp请求或Mq消息。

  1. 实现任务的动态添加,即通过网页端的Rest风格API添加或删除任务。
  2. 任务参数:任务名称,时间表达式,自定义类(描述Http请求和Mq消息的类)
  3. 集群部署,实现添加和删除作业同步,且失效转移。

难点

  1. 如何暴露添加任务接口?Elastic-job框架大部分被用来部署静态作业,只需将作业的相关配置在application.propeties中配置好,项目启动,直接运行作业。
  2. 自定义类的参数如何传递?基本思路是把Job的相关参数封装传递到JobScheduler中,JobScheduler初始化会调用作业的执行方法,我们需要在这个方法里写业务逻辑。因此问题的关键就是把自定义的参数塞到Job里边,然后在执行方法里取出该参数,做业务处理。
  3. 集群下如何实现失效转移功能?静态作业项目,在每个节点部署,项目启动时,每个节点都初始化了静态任务,当一个节点宕机后,其他节点可以继续该任务,具有失效转移功能。而动态添加作业,例如:在A节点动态添加作业,job注册到zookeeper中,但是B节点不知道,不能初始化该任务,这就意味着,A节点宕机后,B节点没办法继续执行这个job,不具备失效转移的功能。

前世

 之前采用Quartz框架实现动态添加任务,并做了集群部署,实现的效果是:一台服务器宕机后,可以在其他服务器上重启任务;添加任务时,会轮询添加在集群中的服务器上。

在这里插入图片描述
图1 quartz 集群部署
quartz任务调度项目存在的问题:
通过Web端Rest风格API添加任务,由于Gateway,所以任务会随机的在某一台服务器上初始化,并存入数据库。例如:job1在服务器A上运行,服务器A突然宕机,由于job1的信息存入了数据库,因此服务器B或者C能从数据库中取得job1的配置,然后继续执行job1。
但是,当在Web端调用删除或者修改任务的API时,而由于gateway随机分发请求,导致无法找到job实例。例如:job1在服务器A上运行,这时网页调用删除job1的API,gateway将此请求分发到服务器B,服务器B上没有Job1的实例,因此报错。

今生

特别的:对分片的理解,
若任务的业务是打印“hello world”和Job的参数

  1. 若一个作业分2片,设置每5秒执行一次作业,只有一台服务器的时候,控制台会同时每隔5秒输出两次“你好”,两次的Job的shardingItemParameter一次是“0”,一次是“1”,shardingTotalCount为“2”。
  2. 若一个作业分2片,设置每5秒执行一次作业,有两台服务器,两台服务器会同时每隔5秒输出一次“hello world”。

对别人解释任务调度:
别人在这里注册一个任务,即别人写了一个url和时间参数在我这,我按时间要求(比如每5分钟调用一个url),而url可能是指一个方法,方法里边有业务逻辑,相当于我只是定时触发一个行为。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值