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

削微寒發表於2020-07-23

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

作者:HelloGitHub-Salieri

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

專案地址:

https://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 等各界大佬談笑風生、切磋技術~

相關文章