大規模システムにおけるタスクスケジューリングモジュールの実装アイデア

製品要件: タスク スケジュール モジュールが必要です。ユーザーはページを通じて新しいタスクを作成できます。主なタスクは、定期的に電子メールを送信すること、または毎週電子メールを送信することです。ユーザーは送信ルールをカスタマイズでき、ユーザーは一時停止することができますタスクの確認、タスクの削除、およびタスクの実装を知ることができます。

一。Spring フレームワークの @Scheduled アノテーション

従来の時間指定タスクは、Spring フレームワークの @Scheduled アノテーションを使用して実装できます。

 

上に示したように、プロジェクト内の cron 式で @Scheduled アノテーションを使用して、データを毎分同期する効果を実現します。これにより、タスクのタイミングを計る機能も実現されます。

考察: この方法でタイミング タスクを実装する場合の欠点は何ですか?

欠点 1: シングルポイント アーキテクチャの負荷分散が必要な場合、タスクが複数回開始される可能性があり、これによりデータの不整合や、深刻な場合には同時実行の問題が発生する可能性があります。分散アーキテクチャでは、タスク モジュールが 1 つだけデプロイされている場合、タスクが一度に 1 回だけ実行されることは保証されますが、高可用性は保証できません。

解決策: 分散ロックを導入する

 

上の図に示すように、Zhejiang Zhengding のすべてのユーザーを同期するためのスクリプトがユーザー モジュールに記述されており、スケジュールされたタスクによって開始されます。Redis 分散ロックがタスク モジュールに導入され、スケジュールされたタスクが 1 つだけ同時に実行されるようになります。

デメリット 2: タスクが開始されると、監視や制御ができなくなります。例: タスクの実行を継続したくない場合、または実行間隔を変更する必要がある場合は、コードを変更して再発行することによってのみ実現できます。

二。Jdk の組み込み Timer と TimerTask はタイミング タスクを実装します。

実装を見てみましょう:

 

まず、Timer スケジューラを定義し、次に TimerTask を定義してタスクを定義します。タイマー スケジューラは、スケジュールされたタスクの定期的な実行に加えて、実行をキャンセルする cancel メソッドも提供するため、ある程度の制御が可能です。実行中のタスク。

   

    このアプローチの欠点は何ですか?

分析ソースコード:

Sched メソッドの核心はタスクをキューに追加することであり、このメソッドはロックを追加します。このソース コードを分析すると、タイマーはスレッドセーフであり、シングルスレッド操作であると結論付けることができます。

 

次に、コアコードを見てみましょう。スケジュールされたタスクをトリガーする方法です。

 

無限ポーリング (スレッド スリープなし) を通じて、タスクをリアルタイムで実行する必要があるかどうかを判断します。例外処理でのみキャッチします

InterruptedException。タスクで実行時例外がスローされた場合、スレッドが強制終了されることを意味します。

タイマーの欠点は、ソース コード分析を通じて簡単に取得できます。

  1. 一般的なパフォーマンス
  2. タイマーには実行スレッドが 1 つだけあります。例外が発生すると、すべてのタスクがキャンセルされます (この問題を解決するために、ScheduledThreadPoolExecutor はマルチスレッドを実装しています。興味がある場合は、詳細を学ぶことができます。ここでは説明しません)詳細)
  3. すべてのタスクはメモリ キューに配置され、サービスが再起動されるかタスクが失敗すると、すべてのデータは永続化されずに失われます。

三つ。クォーツフレームワーク

Quartz フレームワークは、オープンソースのジョブ スケジューリング フレームワークです。

スケジューラ、ジョブ、ジョブ詳細に基づいてタスクのスケジューリングを実装します。

 

 

スケジューラインターフェースは、ジョブの追加、ジョブの削除、ジョブの一時停止、ジョブの再開を行うためのAPIインターフェースを提供し、開発者がさまざまなニーズに合わせてビジネスを自由に組み合わせることができます。

 

さらに、Quartz は、マルチスレッドの最適化、永続化戦略 (jdbc と組み合わせ可能)、クラスター戦略も組み合わせています。

四。Xxl ジョブ フレームワーク

   

 

これは springboot をベースにしたオープンソース プロジェクトであり、視覚的なインターフェイスを提供し、簡単に開始できます。

ただし、個人的にはカプセル化されすぎていると感じます。開発の場合は、基礎となる機能のみを提供する必要があります。ビジュアル インターフェイスを介して cron 式を追加して、スケジュールされたタスクをトリガーすることが可能です。それが純粋に技術的なスケジュールされたタスクの場合、これはフレームワークを利用することも可能ですが、業務レベルでのカスタマイズ開発となると、改修コストが比較的高くなります。

おすすめ

転載: blog.csdn.net/babing18258840900/article/details/131961582