天天看点

定时任务

三丰 soft张三丰

常见的定时任务处理方式有线程的while(true)和sleep组合、使用timer定时器触发任务又或者是使用quartz框架。这些传统的定时任务处理方式面临如下几个方面的挑战:

Ø 高可用

单机版的定时任务调度只能在一台机器上运行,如果程序或者系统出现异常就会导致功能不可用。虽然可以在单机程序实现的足够稳定,但始终有机会遇到非程序引起的故障,而这个对于一个系统的核心功能来说是不可接受的。

Ø 多任务管理复杂,系统负载不均

一个系统可能会有很多需要定时执行的任务,当出现单机无法承载所有的任务时,一般会简单地进行拆分,让不同的机器各自分配一定数量的任务。在这种方式下,需要由开发人员人工管理和分配各个机器上所负责运行的任务,新的任务的加入,需要重新考虑各个机器的负载并合理安排任务分配,以保证整体集群负载均衡。这种方式对开发人员的心智负担过于沉重,并且可能因为人工分配的不合理而造成系统负载不均。

Ø 单机处理极限

原本1分钟内需要处理1万个订单,但是现在需要1分钟内处理10万个订单;原来一个统计需要1小时,现在业务方需要10分钟就统计出来。可以通过多线程、单机多进程处理来提高单位时间的处理效率。但是,单机毕竟资源有限(cpu、内存和磁盘等),始终会有单机能力处理不过来的情况。

架构设计采用分布式任务调度平台来实现定时任务。它的设计思想为:将调度行为抽象形成“调度中心”公共平台,而平台自身并不承担业务逻辑,“调度中心”负责发起调度请求;将任务抽象成分散的jobhandler,交由“执行器”统一管理,“执行器”负责接收调度请求并执行对应的jobhandler中业务逻辑。“调度”和“任务”两部分可以相互解耦,提高系统整体稳定性和扩展性。

单体调度

定义

一个集群中只有一个节点运行调度进程,该调度进程负责集群资源管理和任务调度,也就是说单体调度器拥有全局资源视图和全局任务

特征

容易实现对作业的约束并实施全局性的调度策略,因此适合批处理任务和吞吐量较大、运行时间较长的任务

容易进行状态同步,并且很稳定

调度算法全部内置在核心调度器中,因此调度框架的灵活性和策略的扩展性不高,但是调度算法可以扩展甚至自定义

存在单点故障的可能性

应用

google borg/kubernetes

两层调度

资源的使用状态同时由中央调度器和第二层调度器管理,中央调度器从整体上进行资源的管理和分配,将资源分配到第二层调度器;再由第二层调度器负责将资源和具体的任务进行配对,因此第二层调度可以由多个调度器以支持不同的任务类型

mesos调度架构

架构图

定时任务

resource offer机制:mesos master主动将节点空闲资源,以类似发放的形式发送给每个框架,如果框架需要则使用,不需要则归还

资源分配算法

最大最小公平算法

定时任务

主导资源公平算法

定时任务

共享状态调度

定时任务

state storage模块负责存储和维护资源以及任务状态

resource pool为多个节点集群,接收并执行scheduler调度的任务

scheduler值包含任务调度操作

举例:google omega

定时任务

并发控制

乐观并发控制:在乐观并发控制中,用户读取数据时不锁定数据。当一个用户更新数据时,系统将进行检查,查看该用户读取数据后其他用户是否又更改了该数据。如果其他用户更新了数据,将产生一个错误。一般情况下,收到错误信息的用户将回滚事务并重新开始。对应于乐观并发调度,强调时候检测,在事务提交时检查是否避免了冲突,若避免则提交,否则回滚并自动重新执行

悲观并发控制:一个锁定系统,可以阻止用户以影响其他用户的方式修改数据。如果用户执行的操作导致应用了某个锁,只有这个锁的所有者释放该锁,其他用户才能执行与该锁冲突的操作。对应于悲观并发控制,强调事前预防,在事务执行时检查是否会存在冲突,不存在,则继续执行,否则等待或回滚

总结对比

定时任务