本文適合有 Java 基礎知識的人群
作者:HelloGitHub-Salieri
HelloGitHub 推出的《講解開源項目》系列。從本章開始,就正式進入 PowerJob 框架的技術剖析環節了。作為技術系列文章開篇的第一章,本文會講述 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 等各界大佬談笑風生、切磋技術~