タイミングタスクを優雅に実現--この3つを覚えておけば十分です


前言
タイミングタスク=スケジューリング+実行
スケジューリングには多くのフレームワークが実現されています.elastic-job、quartzなどです.
実行にはプログラマがタスクキューを実装する必要があります.タスクキューの実装には、データベース、redis、kafkaなど多くの方法があります.
タスクキューの実装は簡単ですが、ちょっとした不注意も問題になりやすいです.
コード実装
まず問題を単純化し,単一ライブラリでタイミングタスクを実現する必要がある場合,最適化コードを徐々に実現する.
初めて実現
public void execute1() {
	List jobEntities = jobEntityMapper.getAllToBeProcess();
	for (JobEntity jobEntity : jobEntities) {
		this.businessProcess(jobEntity);
	}
}

以上のコードには何か問題がありますか?
メモリが耐えられない可能性があります(インデックスを移動しないと、タイミングタスクの実行が遅い場合)
最適化方法
ページング、sqlスクリプトのインデックス付けが必要
sqlはページングを実現するには、多くの方法があり、効率が異なり、同様に真剣に考慮する必要がある.
例:
select * from table limit m,n;
select * from table order by id limit m;
select * from table_name inner join ( select id from table_name where (user = xxx) limit 10000,10) b using (id)
この3つのsql文にはそれぞれ長所と短所がある.
セカンドインプリメンテーション
public void execute2() {
	List jobEntities = jobEntityMapper.getFirstPageToBeProcess();
	while (null != jobEntities && !jobEntities.isEmpty()) {
		for (JobEntity jobEntity : jobEntities) {
			this.businessProcess(jobEntity);
		}
		jobEntities = jobEntityMapper.getNextPageToBeProcess();
	}
}

今回の実装ではページング機能が追加されました
今回は何か問題がありますか?
5行目のコードに異常が発生した場合、問題が発生します(表象:実行が遅い、偽死)
3回目の実装
public void execute3() {
	List jobEntities = jobEntityMapper.getFirstPageToBeProcess();
	while (null != jobEntities && !jobEntities.isEmpty()) {
		for (JobEntity jobEntity : jobEntities) {
			try {
				this.businessProcess(jobEntity);
			} catch (Exception e) {
				e.getStackTrace();
			}
		}
		jobEntities = jobEntityMapper.getNextPageToBeProcess();
	}
}

今回はtry_に参加catchは異常をキャプチャしますが、これで問題はありませんか?
答えは否定的
6行目のコードに異常が発生した場合、データが処理されず、次回もクエリーされて処理され、実行が遅くなり、偽死状態になる可能性があります.
4回目の実装
public void execute4() {
	List jobEntities = jobEntityMapper.getFirstPageToBeProcess();
	while (null != jobEntities && !jobEntities.isEmpty()) {
		for (JobEntity jobEntity : jobEntities) {
			try {
				this.businessProcess(jobEntity);
			} catch (Exception e) {
				e.getStackTrace();
				updateProcessCount(jobEntity);
			}
		}
		jobEntities = jobEntityMapper.getNextPageToBeProcess();
	}
}

今回異常が発生した場合、この異常データの処理回数を更新します.
したがって、タイミングタスクの各タスクには、正常に処理された終了条件と異常な終了条件を含む明確な終了条件が必要です.
異常終了条件には、次のようないくつかの実装方法があります.
  • 一定回数を超える
  • 一定時間を超える
  • 異常削除
  • 用状態制御(処理対象、処理失敗)
  • まとめ
    タイミングタスクの実装に関する注意事項
  • は必ずページを分け、インデックスを歩かなければならない.
  • 必ず異常捕獲がある.
  • には、必ず明確な正常/異常終了条件が必要です.