elasticjob分布式任务调度中间件

来源:互联网 发布:手机文件软件 编辑:程序博客网 时间:2024/05/30 05:41

1.elasticjob

elasticjob是当当开源的分布式定时任务调度方案,其可用于替代quartz-db的分布式定时调度框架,并且支持单个任务的分片处理。其中分布式集群定时调度框架,需要解决的主要问题是:如何保证当个任务只会在集群中一台机器上执行。
quartz-db是通过对QRTZ_LOCKS表中的trigger记录进行加互斥锁(select for update),从而保证集群中只有一个jvm程序会得到改锁,从而进行任务的执行。并且在每批次任务执行完之后,该jvm会释放数据库记录的锁,然后集群再重新申请数据库锁,保证了任务随机的分配到集群中不同机器中执行。
elasticjob是通过zookeeper来进行多进程之间的协同作用。其通过zookeeper提供的LeaderLatch,从集群中选择一个组织者,然后组织者执行quartz的job任务,在任务执行中会进行任务的分片,将不同的分片放到不同的机器上,并且触发该分片机器的执行。因此elasticjob可以理解为quartz-memory+zookeeper的形式。
其中elasticjob和quartz-db的使用quartz是不太一样的:

  • quartz-db在集群的机器上只有一个主线程QuartzSchedulerThread,该主线程负责进行竞争锁,然后将任务提交给线程池使用,然后释放锁。并且前后两次的加锁结果并不一样,可以保证任务随机分配到机器上执行。
  • elasticjob实现方式是每一个任务对应一个QuartzSchedulerThread的主线程和一个线程的线程池。每个主线程在启动的时候都会使用zookeeper的LeaderLatch进行加锁,其他没有得到锁的机器wait状态。这样就实现了不同的任务其组织者(或者得到锁的机器)是不一样的,保证了任务可以随机分配到不同的机器中(即使只有一个分片的任务,默认一个分片的任务会在组织者上运行)。最终达到了单个任务只会在集群中一台机器上执行的目的,并且集群是负载均衡的。

2.elasticjob设计理念

可以简单理解为
1. quartz-memory模式解决任务的定时调度问题
2. zookeeper来解决任务执行服务器间的信息同步和任务执行唯一性问题
3. zookeeper来实现控制任务服务器的任务实时调度功能

image

3.elasticjob的任务执行流程

3.1 整体执行流程

image

3.2 任务分片

elasticjob除了支持常规的一个任务在一个服务器进行运行以外,还支持任务的分片执行。其中每个分片是对应处理什么逻辑需要用户自己定义。

举个例子:加入需要插入1000条记录到数据库中,我们可以通过将任务分为10片,1、3、5、7、9对应100-200、300-400、500-600、700-800、900-1000的记录的插入在服务器1上进行,而0、2、4、6、8对应0-100、200-300、400-500、600-700、800-900的记录的插入在服务器2上进行。

elasticjob的分片是,通过主服务(leader服务器)的定时执行时,去zookeeper上获取每个分片对应的机器,然后通过模拟调度端的调度命令,发送到各个分片对应的job服务器上,然后开始进行任务的执行。最终实现了任务分片执行的目的

3.3 DataFlowJob

DataFlowJob与SimpleJob相比,其在处理每个分片分为了两步,第一步fetchData获取待处理的数据,第二步processData根据获取的数据进行处理。其中如果将streamingProcess=true,则会重新执行fetchData和processData直到fetchData范围结果为空为止。

3.4 相关文档

http://elasticjob.io/docs/elastic-job-lite/00-overview

微信号:架构点滴

原创粉丝点击