方案架构:本文讨论的方案主要包括时序任务管理调度模块、源数据查询模块、数据加工模块和转储任务执行模块,以下为各模块的详细阐述:
1)时序任务管理调度模块
时序任务管理调度模块主要负责转储任务的管理与调度工作。该模块依赖Redis集群的高可用和Redis原子性实现了模块本身的高可用和线程安全。本模块的核心是任务栈:任务主要包含了数据源信息、数据加工逻辑和数据转储目的信息;任务栈的管理是通过时间戳计算出周期序号作为Redis存储任务列表的key,时序的周期性递进执行通过Redis的原子命令RPOPLPUSH实现。任务中的数据源信息包含了数据源的类型以及对应的连接信息;任务中的加工逻辑包含了需要转换的数据格式和数据转储的方式等;任务中的数据转储目的信息包含了转储的目的数据持久化系统的类型和连接信息。时序中周期序号的计算公式为:
N为周期序号;mod 为取模运算;t为当前时间戳,单位秒;T为每个周期的时间,单位秒。
2)源数据查询模块
源数据查询模块主要负责查询当前周期内的数据。本模块根据任务实体中提供的数据源信息建立与数据源系统的连接并执行分页查询逻辑,查询到数据后根据当前周期内的任务信息调用数据加工模块对数据进行分类与整理。本模块通过调度模块的周期调度执行以代替海量用户的不定时的高频的、重复的查询,从而控制了数据源系统的并发与系统开销。
3)数据加工模块
数据加工模块主要负责对查询模块查询到的数据进行分类与筛选。数据查询模块将查询到的数据与转储任务信息传递给数据加工模块,由数据加工模块按照任务要求对数据进行加工处理,处理完成后调用数据转储模块进入数据转储逻辑的执行。
4)转储任务执行模块
转储任务执行模块主要负责将处理好的数据转储到对应的数据存储系统。数据转储模块通过任务实体中配置的信息,与目标数据存储系统建立连接,并利用目标数据存储系统的接口将数据存入对应的系统中。
方案流程:本方案的核心流程如下。
- 通过时序任务管理调度模块把待转储的任务信息(任务的数据源类型、数据源地址、目标系统类型、目标系统地址、转储数据范围、数据转储格式等字段)构造成转储任务对象存储到当前任务周期的Redis的键值对中,key为通过公式(下文中的任务周期序列号计算公式均指代为本公式)计算后得到,value的数据结构为列表,任务入栈通过Redis的原子指令LPUSH完成。
在以上公式中N为当前的周期序列号暨是key的特异性标识,mod 为取模运算;t为当前时间戳,单位为秒;T为每个周期的时间也是时序分段的时间长度,单位为秒。
- 时序任务管理调度模中按周期执行的线程计通过任务周期序列号计算公式和key的生成策略生成键值对的key,再调用RPOPLPUSH将当前周期的任务出栈后再入栈到下一周期,利用出栈的任务数据启动子线程调度源数据查询模块。通过这样的方式让转储任务按照分段的时间依次向下一时间周期流转,直到该任务被终止执行。周期执行的线程通过定时任务的形式每个周期的起始时间开始执行,周期的起始时间计算公式为:,公式中为定线程启动务执行的时间戳,单位为秒,N为当前周期的序列号,T为单个周期时长,单位为秒。
- 在上一步骤中,会启动子线程调度数据源查询模块,并传入任务对象信息,数据查询模块接受到调度命令后依据任务对象中的转储信息与数据源信息与数据源系统建立连接并执行数据查询任务,如果单批次数据量较大则进行分页查询。查询到数据之后调度数据加工模块。
- 数据加工模块接收到数据源查询模块的调度指令之后,按照转储任务要求调用数据加工模块对原始数据进行加工处理,数据加工完成后调度转储任务执行模块。
- 最后,转储任务执行模块与目标数据存储系统建立连接并执行数据转储任务。
方案优势:本方案提供了一种高可用的操作记录按时序分段保存的方法,主要的优势如下。
1)通过以时间序列为key,以栈为数据结构将任务列表保存在Redis中,并周期性的让任务依次在当前周期任务栈和下一周期任务栈单向流转,将海量的多任务的查询转为一个周期的单次查询,大幅度的降低了源数据系统与目的数据系统的负载。
2)任务对象按周期存放在栈中,任务对象在按照时序排列的栈中流转,因此数据的转储本身就支持按时序分段,数据转储形式更灵活,不用全量导出数据再筛选造成计算资源的浪费。
3)通过调度器调用执行器的模式进行数据转储,调度器满足高可用要求,执行器可以按照需求动态调整,减少了对源系统的依赖又提升了本系统的兼容性,用户可按照调度器的任务对象模型自行定义执行器完成数据的转储或者异构。