PowerJob 技術綜述,能領悟多少就看你下多少功夫了~

本文適合有 Java 基礎知識的人群

作者:HelloGitHub-Salieri

HelloGitHub 推出的《講解開源項目》系列。從本章開始,就正式進入 PowerJob 框架的技術剖析環節了。作為技術系列文章開篇的第一章,本文會講述 PowerJob 整體的架構設計,同時介紹相關的技術,以便於後面的講解。

項目地址:

//github.com/KFCFans/PowerJob

一、架構設計

前面說過,PowerJob 的設計目標是企業級的分散式任務調度框架,適合統一部署調度中心成為公司內部的任務調度中間件。因此,在架構設計時,不同於 QuartZ 這種自產自銷一個 Jar 包搞定一切的模式,PowerJob 引入了調度中心來統一解決任務的配置和調度,具體的架構如下圖所示:

由圖可見,整個 PowerJob 系統由調度中心(powerjob-server)和執行器(powerjob-worker)構成。

調度中心是一個基於 SpringBoot 的 Web 應用,根據提供服務的對象可以劃分為對外和對內兩層。對外部分面向用戶,即提供 HTTP 服務,允許開發者在前端介面上可視化得完成任務、工作流等資訊的配置與管理;對內部分則負責完成開發者所錄入任務的調度和派發,同時維護註冊到本註冊中心所有執行器集群的狀態。

執行器是一個普通的 Jar 包,需要接入調度中心的應用依賴該 Jar 包並完成初始化後,powerjob-worker 便正式啟動並提供服務。執行器的整體邏輯非常簡單(複雜的是MapReduce、廣播等高級處理任務的實現,敬請期待後面的文章),就是監聽來自調度中心的任務執行請求,一旦接收到任務就開始分配資源、初始化執行器開始處理,同時維護著一組後台執行緒定期上報自身的健康狀態、任務執行狀態。

調度中心和執行器之間通過 akka-remote 進行通訊。調度中心可以多實例部署來進行水平擴展,提升調度性能的同時做到調度中心高可用,執行器也可以通過集群部署實現高可用,同時,如果開發者實現了 MapReduce 這一具有分散式處理能力的處理器,也可以調動整個集群的計算資源完成任務的分散式計算。

二、知識點概覽

總體來講,PowerJob 中主要涉及了以下的知識點,通過閱讀源碼和之後的一系列技術剖析文章,你將能學到:

  • Java 基礎:Java 8 新特性(Stream、Optional、Lambda、FunctionalInterface)
  • Java 進階:多執行緒與並發安全(執行緒池、並發容器、可重入鎖、分段鎖、ThreadLocal 等)、Java I/O(網路操作、文件流操作)、熱載入(自定義類載入器、Jar包操作)
  • Java Web:主要是 SpringBoot 相關的 Web 知識,包括基礎 Controller 用法、WebSocket、文件上傳下載、ControllerAdvice 全局處理異常、跨域 CORS 等
  • Spring 相關:AOP(記錄 Web 日誌)、非同步方法(@Async)、定時任務(@Scheduled)、自建容器(ClassPathXmlApplicationContext)、上下文使用(各種 Aware)
  • 資料庫:編寫資料庫無關的持久化層程式碼(Spring Data JPA)、資料庫基礎理論(各種SQL、索引用法等)、多數據源配置、MongoDB (GridFS)的使用
  • 演算法知識:圖(DAG)、引用計數器(實現小型 GC)、分散式唯一 ID 演算法(snowflake)、時間輪
  • 分散式知識:遠程通訊、集群高可用、服務發現、故障轉移與恢復、分散式一致性、分散式鎖(基於資料庫實現可靠的分散式鎖)
  • 序列化相關:kryo、jackson-cbor、對象池技術
  • Akka 基礎:Actor 模型、akka-remote、akka-serialization

如果你是初學的萌新,通過本項目和本教程,相信你能更好地掌握 Java 相關的基礎知識。

如果你是輕車熟路的老司機,通過本項目和本教程,相信你也會在分散式計算、任務調度等方面有所啟發。

三、總結與預告

本章介紹了 PowerJob 整體的架構設計以及項目中所涉及的相關技術知識點。下一章,我將會為大家帶來 PowerJob 的基石:Akka Toolkit 的介紹與使用教程。

那我們下期再見嘍~預告:下期內容很乾,需要帶足水!

HelloGitHub 交流群現已全面開放(作者在 Java 群),添加微訊號:HelloGitHub 為好友入群,可同前端、Java、Go 等各界大佬談笑風生、切磋技術~