還在手寫任務調度代碼?試試這款可視化分布式調度框架

在微服務系統中,經常會有用到任務調度的場景。比如每天定時同步數據、定時生成業務報表、定期清理日志等。今天給大家推薦一個分布式調度框架,助你你輕松完成任務調度工作!

PowerJob 簡介

PowerJob是全新一代分布式調度與計算框架,能讓你輕松完成任務的調度與繁雜任務的分布式計算。

主要特性:

  • 使用簡單:提供前端Web界面,允許開發者可視化完成調度任務的管理及查看任務運行狀態和日志。
  • 定時策略完善:支持CRON表達式、固定頻率、固定延遲和API四種定時調度策略。
  • 執行模式豐富:支持單機、廣播、Map、MapReduce四種執行模式。
  • 依賴精簡:最小僅依賴關系型數據庫(MySQL等),擴展依賴為MongoDB(用于存儲龐大的在線日志)。

為什么要有調度中心

一般情況下我們會使用QuartZ或Spring Task這些框架在應用中實現定時任務來進行任務調度,但是在微服務架構下,如果很多應用都充斥著這種任務調度代碼就顯得有些不合適。合理的方案應該是這樣的,任務的執行方法存在于應用中,而我們有一個調度中心,調度中心負責調度這些方法,我們只需在調度中心配置好任務即可,PowerJob正是這樣一個分布式調度框架。

安裝準備

由于PowerJob的調度中心(powerjob-server)需要使用MySQL存儲數據,使用MongoDB存儲日志,所以我們先安裝并啟動這兩個服務。

  • 在Docker容器中啟動MySQL服務;
docker run -p 3306:3306 --name mysql \
-v /mydata/mysql/log:/var/log/mysql \
-v /mydata/mysql/data:/var/lib/mysql \
-v /mydata/mysql/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=root  \
-d mysql:5.7
  • 在MySQL中創建PowerJob需要的數據庫powerjob-product;
CREATE DATABASE IF NOT EXISTS `powerjob-product` DEFAULT CHARSET utf8mb4
  • 在Docker容器中啟動MongoDB服務。
docker run -p 27017:27017 --name mongo \
-v /mydata/mongo/db:/data/db \
-d mongo:4.2.5

安裝調度中心

在Docker環境下安裝PowerJob的調度中心非常簡單,分分鐘搞定!

  • 下載鏡像powerjob-server的Docker鏡像:
docker pull tjqq/powerjob-server:latest
  • 在Docker容器中運行powerjob-server服務:
docker run -p 7700:7700 -p 10086:10086 --name powerjob-server \
--link mysql:db \
--link mongo:mongo \
-e TZ="Asia/Shanghai" \
-e JVMOPTIONS="" \
-e PARAMS="--spring.profiles.active=product --spring.datasource.core.jdbc-url=jdbc:mysql://db:3306/powerjob-product?useUnicode=true&characterEncoding=UTF-8 --spring.datasource.core.username=root --spring.datasource.core.password=root --spring.data.mongodb.uri=mongodb://mongo:27017/powerjob-product" \
-v ~/docker/powerjob-server:/mydata/powerjob/powerjob-server \
-v ~/.m2:/mydata/powerjob/.m2 \
-d tjqq/powerjob-server:latest
  • 運行成功后即可訪問powerjob-server的Web界面,注意Linux防火墻需要開放7700和10086兩個端口,訪問地址:http://192.168.3.101:7700/
還在手寫任務調度代碼?試試這款可視化分布式調度框架

在應用中初始化執行器

安裝完調度中心后,我們需要在SpringBoot應用中初始化PowerJob的執行器(powerjob-worker)。

  • 首先在pom.xml中添加powerjob-worker的相關依賴:
<dependency>
    <groupId>com.github.kfcfans</groupId>
    <artifactId>powerjob-worker-spring-boot-starter</artifactId>
    <version>3.2.3</version>
</dependency>
  • 之后在application.yml配置文件中添加powerjob-worker相關配置,注意powerjob.worker.app-name這個配置;
powerjob:
  worker:
    akka-port: 27777 # akka 工作端口
    app-name: mall-tiny-powerjob # 接入應用名稱,用于分組隔離
    server-address: 192.168.3.101:7700 # 調度服務器地址
    store-strategy: disk # 持久化方式
  • 添加一個單機處理器StandaloneProcessor,只需繼承BasicProcessor接口并實現process方法即可;
package com.macro.mall.tiny.job;

@Slf4j
@Component
public class StandaloneProcessor implements BasicProcessor {

    @Override
    public ProcessResult process(TaskContext context){
        //OmsLogger可以直接將日志上報到powerjob-server
        OmsLogger omsLogger = context.getOmsLogger();
        omsLogger.info("StandaloneProcessor start process,context is {}.", context);
        log.info("jobParams is {}", context.getJobParams());
        return new ProcessResult(true, "Process success!");
    }
}
  • 打包上傳好鏡像后,在Docker容器中運行SpringBoot應用服務,注意配置好時區要和調度中心一致。
docker run -p 8080:8080 --name mall-tiny-powerjob \
--link mysql:db \
-v /etc/localtime:/etc/localtime \
-v /mydata/app/mall-tiny-powerjob/logs:/var/logs \
-e TZ="Asia/Shanghai" \
-d mall-tiny/mall-tiny-powerjob:1.0-SNAPSHOT

任務的配置與執行

有了執行器和調度中心,我們只需在調度中心中配置好任務即可實現任務調度。

  • 首先我們需要在調度中心注冊好應用(集成執行器的),應用名稱為application.yml中的powerjob.worker.app-name屬性,這里使用的是mall-tiny-powerjob:123456;
還在手寫任務調度代碼?試試這款可視化分布式調度框架
  • 之后我們可以在首頁看見一臺機器信息;
還在手寫任務調度代碼?試試這款可視化分布式調度框架
  • 之后在任務管理功能中添加一個任務,這里我們用CRON方式設置每20秒執行執行器中的處理方法;
還在手寫任務調度代碼?試試這款可視化分布式調度框架
  • 在任務列表中點擊運行開始執行任務;
還在手寫任務調度代碼?試試這款可視化分布式調度框架
  • 在任務列表中點擊更多->運行記錄可以查看任務的運行日志;
還在手寫任務調度代碼?試試這款可視化分布式調度框架
  • 點擊日志可以查看處理器中上報的日志,jobParams為之前我們創建任務時設置的參數;
還在手寫任務調度代碼?試試這款可視化分布式調度框架
  • 點擊詳情可以查看此次觸發任務的結果,即我們在ProcessResult中返回的信息。
還在手寫任務調度代碼?試試這款可視化分布式調度框架
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。