[]分散分散タスクスケジューリングプラットフォーム

I.概要

タイミングタスクとは何ですか

  • 一定時間、いくつかのタスクの操作に対応したタスクスケジューリング(現像)タイミング。タイミング(期間の動作2:00を想定)タスク(需要)スケジュール(トリガー)
  • ケース:タスクスケジューリング例をタイミング、私は昨日、アクティブな一日のユーザーの量を知る必要があり、毎朝が、定期的な仕事を書き込み、9時毎朝、その日のお問い合わせは昨日UIのユーザーがメールで自分のメールボックスに送信され、毎月の量を生きます。
  • タイミングタスクシナリオ:データ同期、トランザクション情報、明確なユーザー情報は、定期的にイベントをプッシュし、レポートデータを送信します
  • 問題につながる:分散の分野における分散タスクスケジューリングプラットフォームサーバクラスタ、そして、仕事冪等のタイミングを確実にする方法

タイミングタスクを達成するために2つ、Javaの道

2.1スレッド

public class Demo01 {
    static long count = 0;
    public static void main(String[] args) {
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                while (true) {
                    try {
                        Thread.sleep(1000);
                        count++;
                        System.out.println(count);
                    } catch (Exception e) {
                        // TODO: handle exception
                    }
                }
            }
        };
        Thread thread = new Thread(runnable);
        thread.start();
    }
}

2.2 TimerTaskを

/**
 * 使用TimerTask类实现定时任务
*/
public class Demo02 {
    static long count = 0;
    public static void main(String[] args) {
        TimerTask timerTask = new TimerTask() {
            @Override
            public void run() {
            count++;
            System.out.println(count);
        }
    };
    Timer timer = new Timer();
    // 天数
    long delay = 0;
    // 秒数
    long period = 1000;
    timer.scheduleAtFixedRate(timerTask, delay, period);
}

}

2.3 ScheduledExecutorService

Javaの使用からScheduledExecutorService
ツールは導入によって複雑にされるとしているjava.util.concurrentのJavaSE5が、これは、スケジュールされたタスクを達成するための理想的な方法です。

public class Demo003 {
    public static void main(String[] args) {
        Runnable runnable = new Runnable() {
            public void run() {
                // task to run goes here
                System.out.println("Hello !!");
            }
        };
        ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
        // 第二个参数为首次执行的延时时间,第三个参数为定时执行的间隔时间
        service.scheduleAtFixedRate(runnable, 1, 1, TimeUnit.SECONDS);
    }
}

2.4クォーツ

導入Mavenの依存性

<dependencies>
    <!-- quartz -->
    <dependency>
        <groupId>org.quartz-scheduler</groupId>
        <artifactId>quartz</artifactId>
        <version>2.2.1</version>
    </dependency>
    <dependency>
        <groupId>org.quartz-scheduler</groupId>
        <artifactId>quartz-jobs</artifactId>
        <version>2.2.1</version>
    </dependency>
</dependencies>

タスクのスケジューリングクラス

public class MyJob implements Job {
    public void execute(JobExecutionContext context) throws JobExecutionException {
        System.out.println("quartz MyJob date:" + new Date().getTime());
    }
}

スタートアップクラス

 //1.创建Scheduler的工厂
  SchedulerFactory sf = new StdSchedulerFactory();
  //2.从工厂中获取调度器实例
  Scheduler scheduler = sf.getScheduler();

  //3.创建JobDetail
  JobDetail jb = JobBuilder.newJob(MyJob.class)
          .withDescription("this is a ram job") //job的描述
          .withIdentity("ramJob", "ramGroup") //job 的name和group
          .build();

  //任务运行的时间,SimpleSchedle类型触发器有效
  long time=  System.currentTimeMillis() + 3*1000L; //3秒后启动任务
  Date statTime = new Date(time);

  //4.创建Trigger
      //使用SimpleScheduleBuilder或者CronScheduleBuilder
  Trigger t = TriggerBuilder.newTrigger()
              .withDescription("")
              .withIdentity("ramTrigger", "ramTriggerGroup")
              //.withSchedule(SimpleScheduleBuilder.simpleSchedule())
              .startAt(statTime)  //默认当前时间启动
              .withSchedule(CronScheduleBuilder.cronSchedule("0/2 * * * * ?")) //两秒执行一次
              .build();

  //5.注册任务和定时器
  scheduler.scheduleJob(jb, t);

  //6.启动 调度器
  scheduler.start();

クォーツ表現

http://cron.qqe2.com/

第三に、どのような問題は、定期的なタスクは、状況に配布されますか?

分散クラスタの場合は、保証するために、どのようにスケジュールされたタスクの実装が繰り返されることはありません

  1. 同じJVMに保存されている定期的なタスクとビジネス・コード(小さなプロジェクト)
  2. タスクコードの実行をスケジュール設定し、コード・サーバーの操作が分離されている実行大規模なインターネット企業は、独立したJVMです。
  3. 定期的なタスクは非常に同時サーバー考慮する必要があるかどうか?間隔シーンが必要とされていない同時に複数のタスクを実行するポイント、および並行性の高いシナリオが発生する可能性があります
  4. どのようにして高い同時実行の場合の場合は、定期的なダウンタイムは仕事に対処すべきか?(シングルノード)ハートビートの再起動を自動的に監視を使用して、エラーの途中で突然補償機構(各タスクは、小さなマークを作るために)定期的なタスクのコードを実行するときエラーをログの使用は、補償するタイミングエラージョブスキャンログレコードの情報を使用して、継続してスキップ。実行時のタイミング] OBは、仕事で結果は、運用・保守担当者に送信電子メール通知を中止します

伝統的な分散タスクとタイミングタスク間のタイミング差
従来のスケジュールされたタスクの特性:単一(NOクラスタ)

第四に、定期的なタスクを分散ソリューション

  1. 分散ロック・短所を実装飼育係を使用します(一時的なノードを作成する必要があり、イベント通知が拡大することは容易ではありません)
  2. 欠点のリリース後にスイッチを作るために、構成ファイルを使用して再起動する必要があり、タスクスイッチがオンになっている、オープンなタスクに代わって、trueにサーバーのいずれかに設定されていることになる設定、falseに設定し、他のサーバー、サーバーがtrueに設定されている場合は、この方法ダウン、タスクは無効になります。(推奨しません)
  3. 唯一の制約データベース、効率が低いという欠点(推奨)
  4. 分散タスクスケジューリングプラットフォームXXLJOBを使用して、Elastric-仕事、TBSchedule

五、XXLJOB導入

5.1分散スケジューリングプラットフォームは、私たちはそれらのものを達成するのを助けることができます

  1. サポートジョブのクラスター(冪等の問題を保証する前提)回転中のジョブの負荷分散メカニズム
  2. サポートジョブのジョブ実行の補償、それが失敗した場合、それが繰り返し再起動するか、運用、保守担当者に電子メール通知を送信するために失敗した場合、それが自動的にメカニズムを再試行します。
  3. サポートジョブのログ
  4. 伝統的な時限ジョブトリガルールのルールタイミング動的な構成が死んで、動的構成ジョブルールを書かれています

5.2 XXLJOB GitHubの

XXLJOBプロジェクトとドキュメント

XX-JOB
XX-JOB

5.3原則

  • XXL-仕事原理:実行、タスクマネージャ
    • アクチュエータ式の意味:定期的なサービスは、仕事の実用化に取り組みます
    • つまりタスク細管:タイミングタスク構成ルール、ルーティングポリシー、許可モード、などが挙げられます。

ステップ

  • ①展開:XXLジョブ管理者登録センターなど
  • ②作成アクチュエータ(特定のアドレスをスケジュールする)は、クラスタをサポートすることができます
  • ③プロファイルはXXLジョブレジストリのアドレスを入力する必要があります
  • 接続ポート番号ネッティーを確立する④各特定のジョブ実行サーバ
  • ⑤ジョブコンテナにジョブタスククラス、統合IJobHandler抽象クラスの登録を実行する必要があります
  • ⑥特定のジョブ・タスクを準備する方法を実行して、

5.4 SpringBoot統合XXLJob

プロファイル情報

application.properties

# web port
server.port=8081
    
# log config
logging.config=classpath:logback.xml
    
### xxl-job admin address list, such as "http://address" or "http://address01,http://address02"
xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin
    
### xxl-job executor address
xxl.job.executor.appname=text-job
xxl.job.executor.ip=
xxl.job.executor.port=9999
    
### xxl-job, access token
xxl.job.accessToken=
    
### xxl-job log path
xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler
### xxl-job log retention days
xxl.job.executor.logretentiondays=-1

設定XxlJobConfig

@Configuration
@ComponentScan(basePackages = "com.xxl.job.executor.service.jobhandler")
public class XxlJobConfig {
    private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class);

@Value("${xxl.job.admin.addresses}")
private String adminAddresses;

@Value("${xxl.job.executor.appname}")
private String appName;

@Value("${xxl.job.executor.ip}")
private String ip;

@Value("${xxl.job.executor.port}")
private int port;

@Value("${xxl.job.accessToken}")
private String accessToken;

@Value("${xxl.job.executor.logpath}")
private String logPath;

@Value("${xxl.job.executor.logretentiondays}")
private int logRetentionDays;

@Bean(initMethod = "start", destroyMethod = "destroy")
public XxlJobExecutor xxlJobExecutor() {
    logger.info(">>>>>>>>>>> xxl-job config init.");
    XxlJobExecutor xxlJobExecutor = new XxlJobExecutor();
    xxlJobExecutor.setAdminAddresses(adminAddresses);
    xxlJobExecutor.setAppName(appName);
    xxlJobExecutor.setIp(ip);
    xxlJobExecutor.setPort(port);
    xxlJobExecutor.setAccessToken(accessToken);
    xxlJobExecutor.setLogPath(logPath);
    xxlJobExecutor.setLogRetentionDays(logRetentionDays);
    return xxlJobExecutor;
}
}

ハンドラ・インタフェースを作成します。

@JobHandler("demoJobHandler")
@Component
public class DemoHandler extends IJobHandler {
    @Value("${server.port}")
    private String serverPort;
    
    @Override
    public ReturnT<String> execute(String param) throws Exception {
        System.out.println("######端口号:serverPort" + serverPort + "###定时Job开始执行啦!!!!######");
        return SUCCESS;
    }
}

5.5ディスパッチセンタークラスター

  XX-ジョブ管理プラットフォームがハングアップした場合、その後、派遣センターは、クラスタの派遣センターを展開する必要があるので、クラスタの展開をサポートし、タスクを実行することはできませんつながるスケジューリングシステムの災害復旧および可用性が向上します。とき派遣センタークラスターの展開、いくつかの要件および推奨事項:

  1. DB構成一貫;
  2. ログインアカウント設定の整合性。
  3. 一貫性のあるグループのマシンクロック(単一クラスタネグレクト)。
  4. 勧告は:nginxのことで負荷分散クラスタ派遣センター、ドメイン名の割り当てを行うことをお勧めします。発送センターのアクセス、コールバックを設定したアクチュエータは、APIサービスや他の操作を呼び出すには、ドメイン名によって行われています。

原則XXLジョブクラスター
原則XXLジョブクラスター

nginxの設定情報

upstream  backServer{
server 127.0.0.1:8080 weight=1;
server 127.0.0.1:8081 weight=1;
}
server {
    listen       80;
    server_name  127.0.0.1 ;
    #charset koi8-r;
    #access_log  logs/host.access.log  main;
    location / {
        proxy_pass   http://backServer;
        index  index.html index.htm;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   html;
    }
}

おすすめ

転載: www.cnblogs.com/haoworld/p/distributed-fen-bu-shi-ren-wu-diao-du-ping-tai.html