超詳細な分散スケジューリングフレームワーク Elastic-job の実践的な説明

超詳細な分散スケジューリングフレームワーク Elastic-job の実践的な説明

[[378874]]

この記事はWeChatの公開アカウント「Java Geek Technology」から転載したもので、著者はYaxue Fansです。この記事を転載する場合は、Java Geek Technology の公開アカウントにお問い合わせください。

1. はじめに

前回の記事では、Quartz のアーキテクチャ原則とアプリケーションの実践について詳細に紹介しました。 Quartz もクラスタリングによってサービスの高可用性を確保できますが、サービスノードの数を増やしてもタスクの実行効率が向上しない、つまり水平拡張が実現できないという欠点もあります。

この結果の理由は、Quartz が分散クラスター環境でデータベース ロックを使用して、サービスを実行する有効なサービス ノードが 1 つだけであることを確認し、クラスター環境内のサービスのスケジュールされたタスクが繰り返し呼び出されないようにするためです。

実行するスケジュールされたタスクが少ない場合は、Quartz を使用しても大きな問題にはなりません。しかし、金融商品など、そのような要件がある場合、システムは毎日6時に各アカウントの昨日の収益を計算する必要があります。この金融商品に何億人ものユーザーがいて、その全員が 1 つのサービス インスタンスで実行されている場合、翌日にはこのタスクを完了できない可能性があります。

同様のシナリオはたくさんあります。明らかに、Quartz では大規模かつ長期サイクルのタスク スケジューリングに対応できません。

そのため、Dangdang.com は、分散環境でのサーバー リソースの効率的な使用に適した、Quartz ベースの Elastic-Job タイミング タスク フレームワークを開発しました。

Elastic-Job-Lite の最大の特徴は、弾性拡張と収縮をサポートしていることです。それはどのように達成されるのでしょうか?

例えば、今実行すべきタスクがある場合、そのタスクを 10 個に分割すると、お互いに影響を与えることなく同時に 10 個のサービス インスタンスで並列実行できるため、タスク実行の効率が大幅に向上し、サーバー リソースを最大限に活用できます。

上記の金融商品の場合、このタスクが 1 億人のユーザーを処理する必要がある場合、水平方向に拡張できます。たとえば、タスクを 500 に分割し、500 のサービス インスタンスを同時に実行し、各サービス インスタンスが 200,000 のデータを処理し、予期しない事態が発生しなければ、すべてを 1 ~ 2 時間で完了できます。それでも時間がかかる場合は、水平方向に拡張を続け、実行するサービス インスタンスを追加できます。

2015年にDangdang.comが一般公開し、瞬く間に多くのプログラマーの注目を集め、中国のオープンソースで第1位にランクされました。

広く使用されているこの分散スケジューリング フレームワークを見てみましょう。

2. プロジェクトアーキテクチャの概要

Elastic-Job にはもともと、軽量で分散化された elastic-job-core という 1 つのプロジェクトしかありませんでした。そのコアサービスは、弾力的な拡張とデータシャーディングをサポートすることでした。

バージョン 2.X 以降では、主に Elastic-Job-Lite と Elastic-Job-Cloud の 2 つのサブプロジェクトに分かれています。

その中でも、Elastic-Job-Lite は軽量の分散ソリューションとして位置付けられており、jar パッケージの形式で分散タスクの調整サービスを提供します。

Elastic-Job-Cloud は Mesos + Docker ソリューションを使用し、リソース管理、アプリケーションの配布、プロセスの分離などの追加サービスを提供します (Lite との唯一の違いはデプロイメント方法です。同じ API を使用し、開発は 1 回だけで済みます)。

本日は主に Elastic-Job-Lite を紹介します。主な機能は次のとおりです。

  • 分散スケジューリングと調整: Zookeeper を使用して、統一されたスケジューリングのための登録センターを実装します。
  • タスク スライシングをサポート: 実行するタスクをスライシングに分割して、並列スケジューリングを実現します。
  • 弾力的な拡張と縮小をサポート: タスクを n 個のタスク項目に分割した後、各サーバーは割り当てられたタスク項目を個別に実行します。新しいサーバーがクラスターに参加するか、既存のサーバーがオフラインになると、elastic-job は現在のタスクの実行を変更せずに、次のタスクが開始する前にタスクの再シャーディングをトリガーします。

もちろん、フェイルオーバーや失敗したジョブ実行の再トリガーなどの機能もあります。より詳しい情報については、公式 Web サイトのドキュメントをご覧ください。

アプリケーションはそれぞれのノード上でタスクを実行し、Zookeeper レジストリを通じて調整されます。ノード登録、ノード選出、タスクシャーディング、監視はすべて E-Job コード内で完了します。下の画像は公式サイトで提供されているアーキテクチャ図です。

では早速、実際にどのようにプレイするのかを理解しやすいように、以下の実践的な紹介を見ていきましょう。

3. 応用演習

3.1、Zookeeperのインストール

elastic-job-lite は zookeeper に直接依存しているため、開発前に対応する zookeeper 環境を準備する必要があります。 Zookeeper のインストール プロセスについてはあまり説明しません。非常に簡単で、オンラインでチュートリアルも提供されています。

3.2. elastic-job-lite-consoleのインストール

elastic-job-lite-console は主にタスクジョブの視覚化インターフェース管理システムです。

プラットフォームとは関係なく、独立して展開できます。主に登録センターとデータソースを構成することでデータを取得します。

入手方法も非常に簡単です。 https://github.com/apache/shardingsphere-elasticjob に直接アクセスし、バージョン番号 2.1.5 に切り替えてから、mvn clean install を実行してパッケージ化し、対応するインストール パッケージを取得して解凍し、bin フォルダーでサービスを開始します。

インターネットの速度がカタツムリのように遅い場合は、別の方法として、このアドレス https://gitee.com/elasticjob/elastic-job から対応するソース コードを取得します。

サービスを開始したら、ブラウザで http://127.0.0.1:8899 にアクセスし、アカウントとパスワード (両方とも root) を入力して、次のインターフェイスに似たコンソール ページに入ります。

入力後、データベース mysql のデータソースを含め、前述の Zookeeper 登録センターを構成します。

3.3.プロジェクトを作成する

この記事では、例として springboot を使用してプロジェクトをビルドし、プロジェクトを作成して elastic-job-lite の依存関係を追加します。

  1. <! -- elastic-job-lite コアモジュールを導入 -->  
  2. <依存関係>
  3. <groupId>com.dangdang</groupId>
  4. <artifactId>elastic-job-lite-core</artifactId>
  5. <バージョン>2.1.5</バージョン>
  6. </依存関係>
  7.  
  8. <! -- springframework カスタム名前空間を使用するときに導入 -->  
  9. <依存関係>
  10. <groupId>com.dangdang</groupId>
  11. <artifactId>elastic-job-lite-spring</artifactId>
  12. <バージョン>2.1.5</バージョン>
  13. </依存関係>

事前に、設定ファイル application.properties で Zookeeper 登録センター関連の情報を設定してください。

  1. #zookeeper の設定
  2. 動物園飼育員サーバーリスト=127.0.0.1:2181
  3. zookeeper.namespace=例-elastic-job-test

3.4.新しいZookeeperConfig構成クラスを作成する

  1. @構成
  2. @ConditionalOnExpression( "'${zookeeper.serverList}'.length() > 0" )
  3. パブリッククラスZookeeperConfig {
  4.  
  5. /**
  6. * Zookeeperの設定
  7. * @戻る 
  8. */
  9. @Bean(initメソッド = "init" )
  10. パブリックZookeeperRegistryCenter zookeeperRegistryCenter(@Value( "${zookeeper.serverList}" ) 文字列 serverList,
  11. @Value( "${zookeeper.namespace}" ) 文字列名前空間){
  12. 新しい ZookeeperRegistryCenter(新しい ZookeeperConfiguration(serverList,namespace))を返します
  13. }
  14.  
  15. }

3.5.新しいタスク処理クラスを作成する

Elastic-jobは3種類のジョブタスク処理をサポートします。

  • シンプル タイプ ジョブ: シンプル タイプは一般的なタスクを処理するために使用され、SimpleJob インターフェイスのみを実装する必要があります。このインターフェースは、Quartz のネイティブ インターフェースと同様に、定期的に実行されるオーバーライド用の単一のメソッドのみを提供します。
  • データフロー型ジョブ: データフロー型はデータ ストリームを処理するために使用され、DataflowJob インターフェイスを実装する必要があります。このインターフェースは、データの取得 (fetchData) と処理 (processData) に使用されるオーバーライド用の 2 つのメソッドを提供します。
  • スクリプト タイプのジョブ: スクリプト タイプのジョブとは、シェル、Python、Perl などのすべてのタイプのスクリプトをサポートするスクリプト タイプのジョブを指します。コンソールまたはコードを使用して scriptCommandLine を構成するだけで、コーディングは必要ありません。実行スクリプトのパスにはパラメータを含めることができます。パラメータが渡されると、ジョブ フレームワークは最後のパラメータをジョブ実行時情報として自動的に追加します。

3.6.新しいシンプルタイプのジョブを作成する

SimpleJob インターフェースを実装するクラス MySimpleJob を記述します。現在の作業は主にログの印刷です。

  1. 翻訳者
  2. パブリッククラスMySimpleJobはSimpleJobを実装します{
  3.  
  4. @オーバーライド
  5. パブリックvoid実行(ShardingContext shardingContext) {
  6. log.info(String.format( "スレッドID: %s、ジョブスライスの合計数: %s、" +
  7. 「現在のシャードアイテム: %s。現在のパラメータ: %s」 +
  8. 「ジョブ名: %s。ジョブのカスタム パラメータ: %s」  
  9. スレッド.currentThread().getId()、
  10. シャーディングコンテキスト.getShardingTotalCount()、
  11. シャーディングコンテキスト.getShardingItem()、
  12. シャーディングコンテキスト.getShardingParameter()、
  13. シャーディングコンテキスト.getJobName()、
  14. シャーディングコンテキスト.getJobParameter()
  15. ));
  16. }
  17. }

MySimpleJob タスクの実行を監視するために、MyElasticJobListener タスク リスナーを作成します。

  1. 翻訳者
  2. パブリッククラス MyElasticJobListener は ElasticJobListener を実装します {
  3.  
  4. プライベートlong beginTime = 0;
  5.  
  6. @オーバーライド
  7. ジョブが実行される前のパブリックvoid(ShardingContexts shardingContexts) {
  8. beginTime = System.currentTimeMillis();
  9. log.info( "===>{} MyElasticJobListener 開始時刻: {} <===" 、shardingContexts.getJobName()、DateFormatUtils.format(new Date ()、 "yyyy-MM-dd HH:mm:ss" ));
  10. }
  11.  
  12. @オーバーライド
  13. ジョブ実行後のパブリックvoid(シャーディングコンテキストshardingContexts) {
  14. 長い endTime = System.currentTimeMillis();
  15. log.info( "===>{} MyElasticJobListener 終了時刻: {}、合計キャスト: {} <===" 、shardingContexts.getJobName()、DateFormatUtils.format(new Date ()、 "yyyy-MM-dd HH:mm:ss" )、endTime - beginTime);
  16. }
  17.  
  18. }

MySimpleJobConfig クラスを作成し、MySimpleJob を Zookeeper に挿入します。

  1. @構成
  2. パブリッククラスMySimpleJobConfig {
  3.  
  4. /**
  5. * タスク名
  6. */
  7. @Value( "${simpleJob.mySimpleJob.name}" )
  8. プライベート文字列 mySimpleJobName;
  9.  
  10. /**
  11. * Cron式
  12. */
  13. @Value( "${simpleJob.mySimpleJob.cron}" )
  14. プライベート文字列 mySimpleJobCron;
  15.  
  16. /**
  17. * ジョブスライスの合計数
  18. */
  19. @Value( "${simpleJob.mySimpleJob.shardingTotalCount}" )
  20. プライベートint mySimpleJobShardingTotalCount;
  21.  
  22. /**
  23. * ジョブスライスパラメータ
  24. */
  25. @Value( "${simpleJob.mySimpleJob.shardingItemParameters}" )
  26. プライベート文字列 mySimpleJobShardingItemParameters;
  27.  
  28. /**
  29. * カスタムパラメータ
  30. */
  31. @Value( "${simpleJob.mySimpleJob.jobParameters}" )
  32. プライベート文字列 mySimpleJobParameters;
  33.  
  34. オートワイヤード
  35. プライベート ZookeeperRegistryCenter registryCenter;
  36.  
  37. @ビーン
  38. パブリックMySimpleJob mySimpleJob() {
  39. 新しいMySimpleJob()を返します
  40. }
  41.  
  42. @Bean(initメソッド = "init" )
  43. パブリックジョブスケジューラー simpleJobScheduler(final MySimpleJob mySimpleJob) {
  44. //タスクリスナーを構成する
  45. MyElasticJobListener の elasticJobListener を新しい MyElasticJobListener() に追加します。
  46. 新しい SpringJobScheduler(mySimpleJob、registryCenter、getLiteJobConfiguration()、elasticJobListener)を返します
  47. }
  48.  
  49. プライベートLiteJobConfiguration getLiteJobConfiguration() {
  50. // ジョブのコア構成を定義する
  51. JobCoreConfiguration simpleCoreConfig = JobCoreConfiguration.newBuilder(mySimpleJobName、mySimpleJobCron、mySimpleJobShardingTotalCount)。
  52. shardingItemParameters(mySimpleJobShardingItemParameters).jobParameter(mySimpleJobParameters).build();
  53. // SIMPLE型の設定を定義する
  54. SimpleJobConfiguration を simpleJobConfig に追加します。
  55. // Liteジョブのルート構成を定義する
  56. LiteJobConfiguration の simpleJobRootConfig を LiteJobConfiguration.newBuilder(simpleJobConfig).overwrite( true ).build();
  57. simpleJobRootConfigを返します
  58.  
  59. }
  60. }

構成ファイル application.properties で対応する mySimpleJob パラメータを構成します。

  1. #弾性ジョブ
  2. #simpleJob タイプのジョブ
  3. simpleJob.mySimpleJob。名前=mySimpleJob
  4. simpleJob.mySimpleJob.cron=0/15 * * * * ?
  5. simpleJob.mySimpleJob.shardingTotalCount=3
  6. simpleJob.mySimpleJob.shardingItemParameters=0=a、1=b、2=c
  7. simpleJob.mySimpleJob.jobParameters=helloWorld

プログラムを実行して、どのように動作するかを確認します。

上記のデモでは、設定されているシャードの数は 3 です。この時点で、3 つのスレッドが同時にタスクを実行します。これらはすべて 1 台のマシンで実行されるため、このタスクは 3 回実行されます。次に、ポート設定を変更し、3 つの同一のサービス インスタンスを作成します。効果は次のようになります。

タスクが一度実行されたことは一目瞭然です。

3.7.新しいDataFlowJobタイプのジョブを作成する

DataFlowJob タイプのタスク構成は SimpleJob に似ており、操作も非常にシンプルです!

DataflowJob タイプの実装クラス MyDataFlowJob を作成します。

  1. 翻訳者
  2. パブリッククラス MyDataFlowJob は DataflowJob<String> を実装します {
  3.  
  4. プライベートブールフラグ = false ;
  5.  
  6. @オーバーライド
  7. パブリックリスト<String> fetchData(ShardingContext shardingContext) {
  8. log.info( "データの取得を開始します" );
  9. if (フラグ) {
  10. 戻る ヌル;
  11. }
  12. Arrays.asList( "qingshan" , "jack" , "seven" )を返します
  13. }
  14.  
  15. @オーバーライド
  16. パブリックvoid processData(ShardingContext shardingContext、List<String> データ) {
  17. (文字列値:データ) {
  18. // データを処理した後は、データを削除する必要があります。削除しないと、実行が継続されます。上記の方法で処理が行えます。ここではフラグを使用します
  19. log.info( "データの処理を開始します: " + val);
  20. }
  21. フラグ = true ;
  22. }
  23. }

次に、MyDataFlowJob の構成クラスを作成し、それを Zookeeper レジストリに挿入します。

  1. 構成
  2. パブリッククラスMyDataFlowJobConfig {
  3.  
  4. /**
  5. * タスク名
  6. */
  7. @Value( "${dataflowJob.myDataflowJob.name}" )
  8. プライベート文字列jobName;
  9.  
  10. /**
  11. * Cron式
  12. */
  13. @Value( "${dataflowJob.myDataflowJob.cron}" )
  14. プライベート文字列jobCron;
  15.  
  16. /**
  17. * ジョブスライスの合計数
  18. */
  19. @Value( "${dataflowJob.myDataflowJob.shardingTotalCount}" )
  20. プライベートint jobShardingTotalCount;
  21.  
  22. /**
  23. * ジョブスライスパラメータ
  24. */
  25. @Value( "${dataflowJob.myDataflowJob.shardingItemParameters}" )
  26. プライベート文字列 jobShardingItemParameters;
  27.  
  28. /**
  29. * カスタムパラメータ
  30. */
  31. @Value( "${dataflowJob.myDataflowJob.jobParameters}" )
  32. プライベート文字列jobParameters;
  33.  
  34. オートワイヤード
  35. プライベート ZookeeperRegistryCenter registryCenter;
  36.  
  37.  
  38. @ビーン
  39. パブリックMyDataFlowJob myDataFlowJob() {
  40. 新しいMyDataFlowJob()を返します
  41. }
  42.  
  43. @Bean(initメソッド = "init" )
  44. パブリックジョブスケジューラーデータフロージョブスケジューラー(最終MyDataFlowJob myDataFlowJob) {
  45. MyElasticJobListener の elasticJobListener を新しい MyElasticJobListener() に追加します。
  46. 新しい SpringJobScheduler(myDataFlowJob、registryCenter、getLiteJobConfiguration()、elasticJobListener)を返します
  47. }
  48.  
  49. プライベートLiteJobConfiguration getLiteJobConfiguration() {
  50. // ジョブのコア構成を定義する
  51. JobCoreConfiguration dataflowCoreConfig = JobCoreConfiguration.newBuilder(jobName、jobCron、jobShardingTotalCount)。
  52. shardingItemParameters(jobShardingItemParameters).jobParameter(jobParameters).build();
  53. // DATAFLOW型の構成を定義する
  54. データフロー ジョブ構成 dataflowJobConfig = 新しいデータフロー ジョブ構成 (dataflowCoreConfig、MyDataFlowJob.class.getCanonicalName()、 false ) ;
  55. // Liteジョブのルート構成を定義する
  56. LiteJobConfiguration dataflowJobRootConfig = LiteJobConfiguration.newBuilder(dataflowJobConfig).overwrite( true ).build();
  57. dataflowJobRootConfigを返します
  58.  
  59. }
  60. }

最後に、構成ファイル application.properties で対応する myDataflowJob パラメータを構成します。

  1. #データフロー型ジョブ
  2. データフロージョブ。myDataflowJob。名前=myDataflowJob
  3. dataflowJob.myDataflowJob.cron=0/15 * * * * ?
  4. データフロージョブ.myDataflowJob.shardingTotalCount=1
  5. dataflowJob.myDataflowJob.shardingItemParameters=0=a、1=b、2=c
  6. dataflowJob.myDataflowJob.jobParameters=myDataflowJobParamter

プログラムを実行して、どのように動作するかを確認します。

ストリーミング処理タイプが設定されている場合は、継続的にデータがプルされ、処理されることに注意してください。プル時に、戻り値が空の場合、データは処理されません。

非ストリーミング処理タイプが設定されている場合、処理は上記の simpleJob タイプと同じになります。

3.8.新しいScriptJobタイプのジョブを作成する

ScriptJob タイプのタスク構成は上記と同様です。主にスケジュールされた時間にスクリプトを実行するために使用されます。一般的にはあまり使用されません。

対象がスクリプトなので実行するタスクがないので、タスクジョブ型を記述する必要はありません!

ScriptJob タイプの構成クラスを記述するだけで、コマンドは echo 'Hello World! になります。コンテンツ!

  1. @構成
  2. パブリッククラスMyScriptJobConfig {
  3.  
  4. /**
  5. * タスク名
  6. */
  7. @Value( "${scriptJob.myScriptJob.name}" )
  8. プライベート文字列jobName;
  9.  
  10. /**
  11. * Cron式
  12. */
  13. @Value( "${scriptJob.myScriptJob.cron}" )
  14. プライベート文字列jobCron;
  15.  
  16. /**
  17. * ジョブスライスの合計数
  18. */
  19. @Value( "${scriptJob.myScriptJob.shardingTotalCount}" )
  20. プライベートint jobShardingTotalCount;
  21.  
  22. /**
  23. * ジョブスライスパラメータ
  24. */
  25. @Value( "${scriptJob.myScriptJob.shardingItemParameters}" )
  26. プライベート文字列 jobShardingItemParameters;
  27.  
  28. /**
  29. * カスタムパラメータ
  30. */
  31. @Value( "${scriptJob.myScriptJob.jobParameters}" )
  32. プライベート文字列jobParameters;
  33.  
  34. オートワイヤード
  35. プライベート ZookeeperRegistryCenter registryCenter;
  36.  
  37.  
  38. @Bean(initメソッド = "init" )
  39. パブリックジョブスケジューラscriptJobScheduler() {
  40. MyElasticJobListener の elasticJobListener を新しい MyElasticJobListener() に追加します。
  41. 新しい JobScheduler(registryCenter、getLiteJobConfiguration()、elasticJobListener)を返します
  42. }
  43.  
  44. プライベートLiteJobConfiguration getLiteJobConfiguration() {
  45. // ジョブのコア構成を定義する
  46. JobCoreConfiguration scriptCoreConfig = JobCoreConfiguration.newBuilder(jobName、jobCron、jobShardingTotalCount)。
  47. shardingItemParameters(jobShardingItemParameters).jobParameter(jobParameters).build();
  48. // SCRIPT型の設定を定義する
  49. ScriptJobConfiguration scriptJobConfig = new ScriptJobConfiguration(scriptCoreConfig, "echo 'Hello World!'" );
  50. // Liteジョブのルート構成を定義する
  51. LiteJobConfiguration の scriptJobRootConfig を LiteJobConfiguration.newBuilder(scriptJobConfig).overwrite( true ).build();
  52. scriptJobRootConfigを返します
  53.  
  54. }
  55. }

構成ファイル application.properties で対応する myScriptJob パラメータを構成します。

  1. #スクリプト型ジョブ
  2. scriptJob.myScriptJob。名前=myScriptJob
  3. scriptJob.myScriptJob.cron=0/15 * * * * ?
  4. scriptJob.myScriptJob.shardingTotalCount=3
  5. scriptJob.myScriptJob.shardingItemParameters=0=a、1=b、2=c
  6. scriptJob.myScriptJob.jobParameters=myScriptJobParamter

プログラムを実行して、どのように動作するかを確認します。

3.9.タスクステータスをデータベースに保存する

elastic-job がどのようにデータを保存するのか疑問に思う人もいるかもしれません。 ZooInspector クライアントを使用して Zookeeper レジストリに接続すると、対応するタスク構成が対応するツリー ルートに保存されていることがわかります。

特定のタスク実行トラックとステータスの結果は Zookeeper に保存されないため、プロジェクト内のデータ ソースを通じてそれらを永続化する必要があります。

タスクのステータスをデータベースに保存する構成プロセスも非常に簡単です。対応する構成クラスにデータ ソースを挿入するだけで済みます。 MySimpleJobConfig を例にとると、コードは次のようになります。

  1. @構成
  2. パブリッククラスMySimpleJobConfig {
  3.  
  4. /**
  5. * タスク名
  6. */
  7. @Value( "${simpleJob.mySimpleJob.name}" )
  8. プライベート文字列 mySimpleJobName;
  9.  
  10. /**
  11. * Cron式
  12. */
  13. @Value( "${simpleJob.mySimpleJob.cron}" )
  14. プライベート文字列 mySimpleJobCron;
  15.  
  16. /**
  17. * ジョブスライスの合計数
  18. */
  19. @Value( "${simpleJob.mySimpleJob.shardingTotalCount}" )
  20. プライベートint mySimpleJobShardingTotalCount;
  21.  
  22. /**
  23. * ジョブスライスパラメータ
  24. */
  25. @Value( "${simpleJob.mySimpleJob.shardingItemParameters}" )
  26. プライベート文字列 mySimpleJobShardingItemParameters;
  27.  
  28. /**
  29. * カスタムパラメータ
  30. */
  31. @Value( "${simpleJob.mySimpleJob.jobParameters}" )
  32. プライベート文字列 mySimpleJobParameters;
  33.  
  34. オートワイヤード
  35. プライベート ZookeeperRegistryCenter registryCenter;
  36.  
  37. オートワイヤード
  38. プライベート DataSource dataSource;;
  39.  
  40.  
  41. @ビーン
  42. パブリックMySimpleJobストックジョブ() {
  43. 新しいMySimpleJob()を返します
  44. }
  45.  
  46. @Bean(initメソッド = "init" )
  47. パブリックジョブスケジューラー simpleJobScheduler(final MySimpleJob mySimpleJob) {
  48. //イベントデータソース構成を追加する
  49. ジョブイベント構成 jobEventConfig = 新しい JobEventRdbConfiguration(dataSource);
  50. MyElasticJobListener の elasticJobListener を新しい MyElasticJobListener() に追加します。
  51. 新しい SpringJobScheduler(mySimpleJob、registryCenter、getLiteJobConfiguration()、jobEventConfig、elasticJobListener)を返します
  52. }
  53.  
  54. プライベートLiteJobConfiguration getLiteJobConfiguration() {
  55. // ジョブのコア構成を定義する
  56. JobCoreConfiguration simpleCoreConfig = JobCoreConfiguration.newBuilder(mySimpleJobName、mySimpleJobCron、mySimpleJobShardingTotalCount)。
  57. shardingItemParameters(mySimpleJobShardingItemParameters).jobParameter(mySimpleJobParameters).build();
  58. // SIMPLE型の設定を定義する
  59. SimpleJobConfiguration を simpleJobConfig に追加します。
  60. // Liteジョブのルート構成を定義する
  61. LiteJobConfiguration の simpleJobRootConfig を LiteJobConfiguration.newBuilder(simpleJobConfig).overwrite( true ).build();
  62. simpleJobRootConfigを返します
  63.  
  64. }
  65. }

同時に、構成ファイル application.properties で対応するデータ ソース パラメータを構成する必要があります。

  1. spring.datasource.url=jdbc:mysql://127.0.0.1:3306/example-elastic-job-test
  2. spring.datasource.username=root
  3. spring.datasource.password =ルート
  4. spring.datasource.driver-class- name =com.mysql.jdbc.Driver

プログラムを実行し、elastic-job-lite-console コンソールで対応するデータ ソースを構成します。

最後に[ジョブトラック]をクリックすると、該当するジョブの実行ステータスが表示されます。

IV.まとめ

この記事では主にelasticjobの使い方を紹介します。そこから何かを学んでいただければ幸いです。

分散環境では、elastic-job-lite は、最大の特徴である弾力的な拡張とタスク シャーディングをサポートします。実際の使用では、タスク シャードの合計数は、シャーディング時にタスクがより均等に分散されるように、できるだけ大きく、サービス インスタンスの数の倍数にする必要があります。

elasticjob についてさらに詳しく知りたい場合は、公式ドキュメントにアクセスして詳細なチュートリアルを参照してください。

5. 参考資料 1. elasticjob - 公式ドキュメント

2. ブログパーク - Wu Zhenzhao - タスクスケジューリングのための Elastic Job

<<:  マイクロソフトが第2四半期の収益を発表、インテリジェントクラウドの収益は146億ドルに達する

>>:  Spring Security 実践ヒント: 分散オブジェクト SharedObject

推薦する

分散サービス電流制限の実践、私たちはすでにあなたのためにピットを手配しました

[[273022]] 1. 電流制限の役割API インターフェースは呼び出し側の動作を制御できないた...

SEOの真髄: 最新のBaiduアルゴリズムに遅れずについていく

中国最大の検索エンジンである百度検索エンジンは、ウェブサイトの開発において非常に重要な補助的な役割を...

Liehuo Vision は Best Logistics がプロモーション ビデオで企業責任を説明するのを支援します

ショートビデオ、セルフメディア、インフルエンサーのためのワンストップサービス「顧客が指定した場所がサ...

分散機械学習用パラメータサーバー

導入多くの機械学習の問題は、トレーニングと推論に大量のデータに依存しています。インターネット規模の大...

ポータルサイトの2012年第1四半期財務報告の比較分析

5月23日のニュース: 最近、いくつかの大手ポータルが2012年第1四半期の財務報告を発表したが、そ...

Docker をすぐに使い始めるのに役立つ 30 個のコマンドライン

コンテナとクラウドは現在最も人気のあるテクノロジーであり、IT 担当者なら誰でも習得すべきスキルです...

ハイブリッドクラウドを利用する企業にとっての障害と解決策

調査会社ガートナーは2021年8月のレポートで、ハイブリッド、マルチクラウド、エッジ環境が拡大し、新...

ウェブサイト構築におけるSEO最適化の考慮方法

SEO 最適化は、ウェブサイト構築の秘訣となっています。今日、顧客はオンライン マーケティングをます...

2019年のオラクル、変化と苦戦

中国人なら誰でも、ウォーレン・バフェットと彼のバークシャー・ハサウェイ社についてよく知っているだろう...

ハイブリッドクラウド変革のための3つの重要な質問

現在、クラウドベースではないデジタル変革イニシアチブを実施している企業はほとんどありません。実際、ほ...

草の根成長のマイルストーン:テクノロジー

「SEO戦略計画策定 - 草の根成長のマイルストーン」という記事から、SEO最適化戦略では、計画策定...

ベテランが段階的に外部リンクスペシャリストを「育成」する方法

SEO スーパーバイザーは、最適化プランの全体的な構築だけでなく、より重要な最適化アイデアのカバーに...

WeChatが料金を請求するかどうかは、運営者のCCTVとは関係ありません。

最近、ネット上で最も議論されている問題は、WeChatのユーザー数が3億人を超えているため、料金を請...

コミュニティウェブサイトのSEOはウェブサイト構築システムから始まります

コミュニティ ウェブサイトは、その名前が示すように、インターネット上の小さなコミュニティです。例えば...