方案架構:本文討論的方案主要包括時序任務管理調度模塊、源數據查詢模塊、數據加工模塊和轉儲任務執行模塊,以下為各模塊的詳細闡述:
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)通過調度器調用執行器的模式進行數據轉儲,調度器滿足高可用要求,執行器可以按照需求動態調整,減少了對源系統的依賴又提升了本系統的兼容性,用戶可按照調度器的任務對象模型自行定義執行器完成數據的轉儲或者異構。