3,000語で、XXL-JOBタスクスケジューリングプラットフォームを理解できます

マインドマッピング

ここに写真の説明を挿入

記事はGithubセレクションに含まれています。スターへようこそhttps//github.com/yehongzhi/learningSummary

I.概要

通常のビジネスシナリオでは、次のような時間指定のタスクを使用する必要があるシナリオがよくあります。

  • 時間主導のシナリオ:特定の時点でクーポンを送信したり、SMSを送信したりします。
  • バッチ処理データ:先月の請求書のバッチ統計、先月の販売データの統計など。
  • 固定頻度シナリオ:5分ごとに実行する必要があります。

したがって、通常の開発では時限タスクが珍しくなく、消費が速い時代には、毎日さまざまなプッシュを送信する必要があり、メッセージは非常に広く使用されている時限タスクで完了する必要があります。

2.なぜタスクスケジューリングプラットフォームが必要なのですか

Javaでは、Timer、Quartzなどの従来のタイミングタスク実装ソリューションには、多かれ少なかれ問題があります。

  • クラスターのサポート、統計、管理プラットフォーム、障害アラーム、監視などはありません。

また、現在の分散アーキテクチャでは、分散タスクのスケジューリングが必要なシナリオがいくつかあります。

  • 同じサービスの複数のインスタンスのタスクが相互に排他的である場合、統一されたスケジューリングが必要です。
  • タスクスケジューリングは、高可用性、監視、および障害アラームをサポートする必要があります。
  • 各サービスノードのタスクスケジューリングの結果を一律に管理および追跡する必要があり、タスク属性情報を記録および保存する必要があります。

明らかに、従来のタイミングタスクは現在の分散アーキテクチャにはもはや十分ではないため、分散タスクスケジューリングプラットフォームが必要です。現在、より主流のタスクはelasticjobとxxl-jobです。

ElasticjobはDangdangによってオープンソース化されています。現在、githubには6.5k Starがあり、公式Webサイトには76社が登録されています。

xxl-jobとは異なりelasticjobはzookeeperを使用して分散調整を実現し、高いタスクの可用性と断片化を実現します。
ここに写真の説明を挿入

3つ目は、XXL-JOBを選ぶ理由です。

実際、より多くの企業がxxl-jobを選択しています。現在、xxl-jobのgithubには15.7kの星があり、348の登録企業があります。Elasticjobとxxl-jobの両方が非常に優れた技術フレームワークであることは間違いありません。次に、より多くの企業がxxl-jobを選択する理由をさらに比較、議論、調査します。

最初にxxl-jobを紹介します。これはDianpingXu Xueliのオープンソースプロジェクトです(xxlは作者の名前の最初の文字です)。公式ウェブサイトでは、これを軽量の分散タスクスケジューリングフレームワークとして紹介しています。その中心的な設計目標は迅速な開発です。 、習得が容易で、軽量で、拡張が容易です。elasticjobとは異なり、xxl-job環境はZooKeeperではなくmysqlに依存しています。これも最大の違いです。

Elasticjobの本来の目的は、取引量が多く、サーバーが多い場合でも、同時実行性の高い複雑なサービスに直面することです。これにより、適切なジョブスケジューリングを実行し、サーバーリソースを可能な限り使用できます。ZooKeeperを使用して、可用性、一貫性、およびスケーラブル性を高めます。公式サイトに書かれているelasticjobは分散化されており、ZooKeeperの選出メカニズムによりメインサーバーが選出されます。メインサーバーに障害が発生した場合、新しいメインサーバーが再選出されます。したがって、elasticjobは優れたスケーラビリティと可用性を備えていますが、その使用、操作、および保守はやや複雑です。
ここに写真の説明を挿入
xxl-jobはその逆で、集中型スケジューリングプラットフォームを使用して、複数のエグゼキュータをスケジュールしてタスクを実行します。スケジューリングセンターは、DBロックを使用して、クラスタ分散スケジューリングの一貫性を確保します。これにより、エグゼキュータを拡張すると、DBへのプレッシャーが増大します。実際、ここのデータベースは、タスクのスケジューリングと実行のみを担当します。しかし、多数の実行者とタスクがなければ、データベースに圧力がかかることはありません。実際、ほとんどの企業には、タスクの数について多くの実行者がいません(ただし、インタビューでは、並行性の高い質問が頻繁に行われます)。

相対的に言えば、xxl-job集中型スケジューリングプラットフォームは、軽量ですぐに使用でき、操作が簡単で、すぐに開始でき、SpringBootと非常によく統合されています。また、監視インターフェイスはスケジューリングセンターに統合されており、インターフェイスはシンプルで企業にとって便利です。メンテナンスコストは高くなく、メールアラートの失敗などがありますこれにより、多くの企業がスケジューリングプラットフォームとしてxxl-jobを選択するようになります。

4、インストール

4.1ソースコードをプルする

xxl-jobの設定は非常に簡単です。ドッカープルイメージの展開とソースコードのコンパイルには2つの方法があります。ドッカーの展開方法は比較的簡単です。ソースコードのコンパイルについて説明します。まずgithubに移動して、xxl-jobのソースコードをローカルにプルします。
ここに写真の説明を挿入

4.2IDEAのインポート

ソースコードをプルダウンすると、プロジェクトの構造が次のように表示されます。

IDEAにインポートし、Mavenを構成し、関連するjarパッケージをダウンロードします。しばらくすると、次のようなプロジェクトが表示されます。

4.3データベースを初期化する

前述のように、xxl-jobはmysqlに依存する必要があるため、データベースを初期化する必要があります。xxl-jobdocdbパスの下にあるtables_xxl_job.sqlファイルを見つけます。mysqlでsqlファイルを実行します。

4.4構成ファイル

次に、構成ファイルを変更し、adminプロジェクトの下にapplication.propertiesファイルを見つけます。

### 调度中心JDBC链接
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
### 报警邮箱
spring.mail.host=smtp.qq.com
spring.mail.port=25
[email protected]
spring.mail.password=xxx
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory
### 调度中心通讯TOKEN [选填]:非空时启用;
xxl.job.accessToken=
### 调度中心国际化配置 [必填]: 默认为 "zh_CN"/中文简体, 可选范围为 "zh_CN"/中文简体, "zh_TC"/中文繁体 and "en"/英文;
xxl.job.i18n=zh_CN
## 调度线程池最大线程配置【必填】
xxl.job.triggerpool.fast.max=200
xxl.job.triggerpool.slow.max=100
### 调度中心日志表数据保存天数 [必填]:过期日志自动清理;限制大于等于7时生效,否则, 如-1,关闭自动清理功能;
xxl.job.logretentiondays=10

4.5コンパイルして実行する

adminプロジェクトのmainメソッドを実行するだけで開始できます。
ここに写真の説明を挿入
サーバーにデプロイされている場合は、jarパッケージにパッケージ化し、Mavenプラグインを使用してIDEAにパッケージ化する必要があります。
ここに写真の説明を挿入
次に、xxl-jobxxl-job-admintargetパスでjarパッケージを見つけます。

次に、jarパッケージを取得し、java-jarコマンドで開始できます。
ここに写真の説明を挿入
ここで完了です!ブラウザを開き、http:// localhost:8080 / xxl-job-adminと入力して管理ページ入ります。デフォルトのアカウント/パスワード:admin / 123456。
ここに写真の説明を挿入

五、永遠にHelloWord

ディスパッチセンターを展開した後、エグゼキュータをディスパッチセンターに登録し、スケジューリングタスクを追加する必要があります。次に、xxl-jobを参照して簡単な例を記述します。

まず、「xxljob-demo」というSpringBootプロジェクトを作成し、依存関係を追加します。

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>
    <dependency><!-- 官网的demo是2.2.1,中央maven仓库还没有,所以就用2.2.0 -->
        <groupId>com.xuxueli</groupId>
        <artifactId>xxl-job-core</artifactId>
        <version>2.2.0</version>
    </dependency>
</dependencies>

次に、application.propertiesを変更します。

# web port
server.port=8081
# log config
logging.config=classpath:logback.xml
spring.application.name=xxljob-demo
### 调度中心部署跟地址 [选填]:如调度中心集群部署存在多个地址则用逗号分隔。执行器将会使用该地址进行"执行器心跳注册"和"任务结果回调";为空则关闭自动注册;
xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin
### 执行器通讯TOKEN [选填]:非空时启用;
xxl.job.accessToken=
### 执行器AppName [选填]:执行器心跳注册分组依据;为空则关闭自动注册
xxl.job.executor.appname=xxl-job-demo
### 执行器注册 [选填]:优先使用该配置作为注册地址,为空时使用内嵌服务 ”IP:PORT“ 作为注册地址。从而更灵活的支持容器类型执行器动态IP和动态映射端口问题。
xxl.job.executor.address=
### 执行器IP [选填]:默认为空表示自动获取IP,多网卡时可手动设置指定IP,该IP不会绑定Host仅作为通讯实用;地址信息用于 "执行器注册" 和 "调度中心请求并触发任务";
xxl.job.executor.ip=
### 执行器端口号 [选填]:小于等于0则自动获取;默认端口为9999,单机部署多个执行器时,注意要配置不同执行器端口;
xxl.job.executor.port=9999
### 执行器运行日志文件存储磁盘路径 [选填] :需要对该路径拥有读写权限;为空则使用默认路径;
xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler
### 执行器日志文件保存天数 [选填] : 过期日志自动清理, 限制值大于等于3时生效; 否则, 如-1, 关闭自动清理功能;
xxl.job.executor.logretentiondays=10

次に、構成クラスXxlJobConfigを記述します。

@Configuration
public class XxlJobConfig {
    private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class);
    @Value("${xxl.job.admin.addresses}")
    private String adminAddresses;
    @Value("${xxl.job.accessToken}")
    private String accessToken;
    @Value("${xxl.job.executor.appname}")
    private String appname;
    @Value("${xxl.job.executor.address}")
    private String address;
    @Value("${xxl.job.executor.ip}")
    private String ip;
    @Value("${xxl.job.executor.port}")
    private int port;
    @Value("${xxl.job.executor.logpath}")
    private String logPath;
    @Value("${xxl.job.executor.logretentiondays}")
    private int logRetentionDays;

    @Bean
    public XxlJobSpringExecutor xxlJobExecutor() {
        logger.info(">>>>>>>>>>> xxl-job config init.");
        XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
        xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
        xxlJobSpringExecutor.setAppname(appname);
        xxlJobSpringExecutor.setAddress(address);
        xxlJobSpringExecutor.setIp(ip);
        xxlJobSpringExecutor.setPort(port);
        xxlJobSpringExecutor.setAccessToken(accessToken);
        xxlJobSpringExecutor.setLogPath(logPath);
        xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);
        return xxlJobSpringExecutor;
    }
}

次に、Beanモードを使用して、タスククラスXxlJobDemoHandlerを記述します。

@Component
public class XxlJobDemoHandler {
    /**
     * Bean模式,一个方法为一个任务
     * 1、在Spring Bean实例中,开发Job方法,方式格式要求为 "public ReturnT<String> execute(String param)"
     * 2、为Job方法添加注解 "@XxlJob(value="自定义jobhandler名称", init = "JobHandler初始化方法", destroy = "JobHandler销毁方法")",注解value值对应的是调度中心新建任务的JobHandler属性的值。
     * 3、执行日志:需要通过 "XxlJobLogger.log" 打印执行日志;
     */
    @XxlJob("demoJobHandler")
    public ReturnT<String> demoJobHandler(String param) throws Exception {
        XxlJobLogger.log("java, Hello World~~~");
        XxlJobLogger.log("param:" + param);
        return ReturnT.SUCCESS;
    }
}

resourcesディレクトリに、logback.xmlファイルを追加します。

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false" scan="true" scanPeriod="1 seconds">
    <contextName>logback</contextName>
    <property name="log.path" value="/data/applogs/xxl-job/xxl-job-executor-sample-springboot.log"/>
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>
    <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.path}.%d{yyyy-MM-dd}.zip</fileNamePattern>
        </rollingPolicy>
        <encoder>
            <pattern>%date %level [%thread] %logger{36} [%file : %line] %msg%n
            </pattern>
        </encoder>
    </appender>
    <root level="info">
        <appender-ref ref="console"/>
        <appender-ref ref="file"/>
    </root>
</configuration>

書き込み後、サービスを開始すると、管理インターフェイスを開き、アクチュエータ管理を見つけて、アクチュエータを追加できます。
ここに写真の説明を挿入
次に、タスク管理に移動してタスクを追加します。
ここに写真の説明を挿入
ここに写真の説明を挿入
最後に、タスク管理に移動して、demoJobHandlerをテストして実行できます。
ここに写真の説明を挿入
ここに写真の説明を挿入
保存をクリックすると、すぐに実行されます。[ログの表示]をクリックすると、タスク実行の履歴ログレコードが表示されます。
ここに写真の説明を挿入
実行したばかりの実行ログを開くと、操作が成功したことがわかります。
ここに写真の説明を挿入
これは簡単なデモのデモで、非常に簡単ですぐに開始できます。

6、アーキテクチャ設計について話します

xxl-jobのアーキテクチャについて簡単に説明しましょう。まず、分析用に公式Webサイトで提供されているアーキテクチャ図を見てみましょう。
ここに写真の説明を挿入
アーキテクチャ図からわかるように、ディスパッチセンターとアクチュエータの2つの主要コンポーネントがあります。

  • 派遣センター。担当するスケジューリング情報を管理、スケジューリング設定に従ってスケジューリング要求を送信し、ビジネス・コードについては責任を負いません。ビジュアルインターフェイスをサポートし、ディスパッチセンターでタスクを追加、更新、削除できます。これはリアルタイムで有効になります。スケジューリング結果の監視、実行ログの表示、スケジューリングタスク統計レポートの表示、タスク失敗アラームなどをサポートします。
  • アクチュエータ。スケジューリング要求を受信し、スケジューリングタスクのビジネスロジックを実行する責任があります。アクチュエーターの始動後、ディスパッチセンターに登録する必要があります。ディスパッチセンターから実行要求、終了要求、ログ要求などを受信します。

次に、xxl-jobの動作原理を見ていきます。
ここに写真の説明を挿入

  • タスクエグゼキュータは、設定されたディスパッチセンターのアドレスに従って、ディスパッチセンターに自動的に登録されます。
  • タスクトリガー条件に達すると、ディスパッチセンターがタスクを発行します。
  • エグゼキュータは、スレッドプールに基づいてタスクを実行し、実行結果をメモリキューに入れ、実行ログをログファイルに書き込みます。
  • エグゼキュータのコールバックスレッドは、メモリキュー内の実行結果を消費し、ディスパッチセンターにアクティブに報告します。
  • ユーザーがディスパッチセンターでタスクログを表示すると、ディスパッチセンターはタスクエグゼキュータを要求し、タスクエグゼキュータはタスクログファイルを読み取り、ログの詳細を返します。

トーク

上記の内容を読んだ後は、基本的には紹介です。実際、xxl-jobにはまだ多くの機能があります。詳細に学習するは、公式Webサイトにアクセスして学習および探索する必要があります最良の方法は、ローカルでxxl-jobを作成してプレイおよびプレイすることです。実践的な練習は、学ぶための最速の方法です。

 

元のリンク
この記事は、AlibabaCloudの元のコンテンツです。

おすすめ

転載: blog.csdn.net/yunqiinsight/article/details/109175769