バッチ処理の
基本的に
1. 1. 目次
以下の
- 1. 1. 目次
- 2.Javaの
バッチ処理の 実装パターンに ついて - 3.JSR-352 の
処理モデルに ついて - 4.ジョブスケジューラーに
ついて - 5.グルー言語
- 6.レビュー時の
観点に ついて - 7.テスト観点に
ついて - 8.エラー発生時の
調査、 対応フロー - 9.参考
2. Javaの バッチ処理の 実装パターンに ついて
個人的な
2.1. public static void main(String[] args)
を 実装実行する パターン
シンプルな
jar に
Linux上からであれば、
大規模な
と
2.2. Servetや、 WebAPIが バッチ処理の エンドポイントに なっている ケース
Servetや、
DB接続に
2.3. スケジュール実行の ための APIが 使われる ケース
J2SEの
10年くらい前に、
2.4. スケジュール実行の ための ライブラリが 使われる ケース
Spring Boot にはこの@Scheduled
と
Dropwizardにも、dorpwizard-jobs
と
また、
J2SEの
Javaアプリケーション上で、
2.5. JBatch関連の フレームワーク
JSR-352 Javaの
起動方法や
partition
等は
ライブラリ
spring-projects/spring-batch: Spring Batch is a framework for writing offline and batch applications using Spring and Java spring-batch JOB定義は
XMLで 作成していく。 j-easy/easy-batch: The simple, stupid batch framework for Java
XMLを書かなくても、 spring-batch風の コードを 実装できる ライブラリ。
SpringBootや、Dropwizardの CLIと 組み合わせて 実装すると、 良い 感じに 使えます。
参考
2.6. CLIコマンドラインライブラリ
コマンドラインから
picocli
の
- CLI Comparison · remkop/picocli Wiki
今まで、Args4Jを 良く 使っていましたが、 picocli
良さそうに思いました。
コマンドラインのHelpが カラー表示される あたりは Django臭が して 良い 感じです。
3. JSR-352 の 処理モデルに ついて
JSR-352の
それぞれの
3.1. タスクベースの 処理 (タスクレットモデル)
全体で
内部で、
メリット
- 再実行時は、
Jobを リランするだけで、 復旧できる。 - 実装は
シンプルなので、 処理の 見通しが 良くなる。
- 再実行時は、
デメリット
- 大量データの
処理を 行うと All or Nothing の 処理であることが 原因で、 リソースが 枯渇する 場合が ある。
- 大量データの
3.2. アイテムベースの 処理 (チャンクモデル)
件数ベースでの
指定した
メリット
- 大量データを
処理する バッチの 実装を シンプルに できる。
- 大量データを
デメリット
- 実装が
タスクレットに 比べて 複雑 - ジョブを
再実行する 場合、 エラーデータのみを 処理するなどの 考慮が 必要
- 実装が
3.3. 並列処理と 多重処理
Spring Batch スケーリングと
- マルチスレッドステップ (単一プロセス)
- 並行ステップ (単一プロセス)
- リモートステップの
チャンキング (マルチプロセス) - ステップの
分割 (シングルまたは マルチプロセス)
Spring Batch を
パーティショニング に
4. ジョブスケジューラーに ついて
バッチ処理の
以下の
基本的に、
5. グルー言語
バッチ処理の
グルー言語 - Wikipedia を
グルー言語 (英: glue language) とは
プログラミング用語の ひとつであり、 ソフトウェアコンポーネント同士を 結びつける ことを 主眼と した プログラミング言語の 総称である。 「グルー」とはにかわ 状の 接着剤の ことを 意味する。
Windows環境でbatファイル(CMDスクリプト)
、PowerShell
が
Linux環境では、シェルスクリプト
が
高機能な
6. レビュー時の 観点に ついて
以下のような
基本的に、
6.1. 前提
以下の
RDB への
CRUD が 中心 cron 等 の
job sheduler 起動 jobnet が
組まれていない。 (後続 job が ない。 ) 日次で
変化が 発生する、 データ集合を 処理する。 同時起動数は
1で、 パラレル実行は 発生しない。 ユーザー側システム部門が、
IT ベンダーに 対しての チェックを 行う 状況。
6.2. チェック観点
6.2.1. Transaction の Save Point の 単位
データ集合を
1件ずつ
6.2.2. Shedule の 設定
どのような
6.2.3. リトライ時の 動作
Shedule 設定に
単純などのようなSE作業を<wbr>したら<wbr>希望通りに<wbr>動くのか<wbr>?
と動作の<wbr>合意は<wbr>とれているのか<wbr>?
が
動作には、Transaction の<wbr> Save Point の<wbr>単位
、Shedule の<wbr>設定
が
リトライ時のSave Point
の
6.2.4. 異常系処理の 確認
異常系時の
振る 舞いの 確認
RDB アクセスであれば、クエリ発行ポイントで エラー(これは システムエラー、 アプリケーションエラー双方)が 発生した 場合、 どのような<wbr>振る<wbr>舞いとなるのか<wbr>?
を確認します。
ロールバックが期待通り 行われるのか?が 重要な 確認ポイントに なります。 監視アラート
Logポリシーで監視アラートも 決まる ケースも あり、 その 場合は 必要ありません。
Logポリシーと監視通知が 切り離されている 場合は、 何を 監視アラート通知対象に するのか、 何を 対象外に するのかを 決めて おきます。
6.2.5. Logポリシー
どのような
LOG LEVEL と、
例えば、
Logに、
6.2.6. 集合データの 取得の ポリシー
どういう
前処理で
6.2.7. 処理対象データ取得する 際の SQLの 実行計画等の 取得有無と、 テストでの 評価
バッチ処理では、
バッチの
実行計画などを
6.3. 確認の 仕方で 気を つけている こと
指摘ではなく、今回作成していただいた<wbr>週次の<wbr>スケジューラーバッチで、<wbr>リトライ動作の<wbr>観点で<wbr>気を<wbr>つけた<wbr>ところは<wbr>ありますか?
みたいな
この
7. テスト観点に ついて
テスト観点はレビュー時の<wbr>観点に<wbr>ついて
での
7.1 Transaction の Save Point の 単位
Taransaction の
- 指定した
コミット件数で データの コミットが 行われているか? - エラーで
落ちた 際に、 指定している Save Pointまで データが ロールバックされているか?
7.2. Shedule の 設定
指定した
- 指摘した
稼働時刻に バッチが 起動しているか? - 開発環境と、
本番環境で スケジュール設定が 別途必要であれば、 それぞれの テストを 計画しているか?
7.3. リトライ時の 動作、 常系処理の 確認
ここは、
以下を
- エラー時に
監視アラートの 対象に なり、 検知できるか? - 検知後に
リトライが できるか? - 想定外エラーの
場合も 原因が 特定できる 情報が ログなどに 出力されるか? - 運用手順正を
準備している 場合、 想定した 運用手順で 復旧が できるか?
7.4 ログ
ログに
- 何件処理した
等の 必要な ログが 出力されているか? - 不必要な
情報が 出力されていないか?
必要な情報とは、 ログを 出し過ぎると いう 意味での 不必要と 個人情報に 当たる 情報を 出力していないと いう 観点が あるかと 思います。
7.5 集合データの 取得の ポリシー
データ集合に
- ポリシーに
合致しない データを パターン別に 準備して テストしているか? - いっそ
本番環境で データ取得クエリを 実行して 想定外の データが 取得できていないか?
7.6 処理対象データ取得する 際の SQLの 実行計画等の 取得有無と、 テストでの 評価
データ負荷に
- 負荷テストを
計画、 実施しているか? - データ増加量に
対しての 見積もりを 実施しているのならばその 見積もり 妥当性を 検証しているか?
7.7 チェックリストに する
上記の
正常系/異常系 | 内容 |
---|---|
正常系 | 処理対象0件の挙動を確認しているか? |
正常系 | 処理対象1件の挙動を確認しているか? |
正常系 | 処理対象2件のの挙動を確認しているか? |
正常系 | 指定したコミット件数でデータのコミットが行われているか? |
正常系 | 指摘した稼働時刻にバッチが起動しているか? |
正常系 | 開発環境と、本番環境でスケジュール設定が別途必要であれば、それぞれのテストを計画しているか? |
正常系 | ポリシーに合致しないデータをパターン別に準備してテストしているか? |
正常系 | いっそ本番環境でデータ取得クエリを実行して想定外のデータが取得できていないか? |
正常系 | 負荷テストを計画、実施しているか? |
正常系 | データ増加量に対しての見積もりを実施しているのならばその見積もり妥当性を検証しているか? |
正常系 | 何件処理した等の必要なログが出力されているか? |
正常系 | 不必要な情報が出力されていないか? |
異常系 | エラーで落ちた際に、指定しているSave Pointまでデータがロールバックされているか? |
異常系 | エラー時に監視アラートの対象になり、検知できるか? |
異常系 | 検知後にリトライできるか? |
異常系 | 想定外エラーの場合も原因が特定できる情報がログなどに出力されるか? |
異常系 | 運用手順正を準備している場合、想定した運用手順で復旧ができるか? |
8. エラー発生時の 調査、 対応フロー
バッチ処理が
エラーは
障害発生時の
8.1. フロー図の 補足説明
フロー図に
8.1.1. 初期対応フレーム
エラー内容確認から、
エラー内容確認
Javaのバッチ処理であれば、 まともに 実装されていれば、 エラー情報と して スタックトレースを 出力しています。
まずスタックトレースを 見て、 エラー発生箇所を 特定します。
またに、ログにのみ スタックトレースが 出力されていて、 その ログの 取得に 時間が かかる。
酷いケースだと、 ログに すら スタックトレースが 出力されない ケースが あります。 この スタックトレースが 出力されない ケースは、 周辺の ログ情報から エラーの 原因を 推測するか、
エラーが再現する オペレーションが 特定できている 場合は、 扱っている データを 確認すると 原因が 特定できることが あります。 優先度判断
初期対応フレームは判断の 速度が 必要に なります。 エラー内容確認
と、優先度判断
等は、自分よりも システムに 詳しい 人が いるなら、 まず 詳しい 人に 聞くのも 重要です。
エラーになった バッチで、 大まかな 優先度が 決まる ケースも あります。
タスクレットモデルのバッチが、 ジョブフロー上で 動いている 場合、 後続バッチも 動いていない 可能性が 高く、 復旧優先度が 高まります。 復旧が
必要か?の 判断
エラーとなったから 復旧が 必ず 必要かと いうと そういう 訳ではなく、 実行タイミングの 問題で 処理済の データを 再度処理しようとして エラーに なる 等の ケースも あります。
プログラム実装で考慮できていない データ状態が あると いう ことなので、 厳密に プログラムバグですが、 ヒヤリハットで 実データへの 影響は ありません。 データ復旧
データ復旧が必要な 場合は、 バッチ処理の モデルへの 理解度が、 復旧手順の 作成スピードを 早めます。 以下、 ざっくり 対応を 記載していますが、 チャンクモデルで、 処理途中に ミットを 行うような ケースが あると、 復旧の パターンは 複雑に なります。 - タスクレットモデル
エラー原因を特定、 解消して 再実行。 - チャンクモデル
エラー発生したデータ以降の 処理が 行われているか 確認。 行われている 場合は、 エラー発生した データのみを 再実行対象と して バッチを リランする。 行われていない 場合は、 エラーが 発生した データ以降の データも 含めて、 再実行対象と して バッチを リランする。
- タスクレットモデル
8.1.2. 恒久対応フレーム
恒久対応方法の
恒久対応方法検討
恒久対応方法として 以下が あると 考えました。
改修のコストと、 発生した 際の コストを 天秤に かけて、 どの 対応を とるのか 決めていきます。 - エラー無視
対象エラーを監視アラートの 対象から 外します。
アラートを送出する ツールの 設定変更。 プログラム回収を して、 アラート通知する 処理を 削除するなど システムに よって 実施内容は 異なります。 - システム改修
エラーの発生原因その ものを 解消する ため システム改修を 行う。
もしくは、 発生時の 自動復旧を 実施する ツールを 作ります。
アプリケーションサーバ負荷や、DBアクセスの 処理の 滞留で エラーに なる ケースは、 自動復旧する ツールを 作ると 手が かからなくなります。 - 何もしない
発生頻度が低く、 優先度が 高くない エラーは 何もしない
で良いです。 ROI算出した 結果、 リスク許容と 判断した ものに なります。
- エラー無視
対応履歴作成、
復旧手順作成
1つの文書でまと まっている ケース、 文書が 分かれている ケースが あるかもしれませんが、 それぞれ 作成します。
何もしない
場合も、忘れた 頃に 同じ 事象が 発生するので 復旧手順を 作成して おきます。
8.1.3. 再発防止フレーム
恒久対応後は、
原因分析
原因分析には様々な 手法が あります。 個人的には なぜなぜ<wbr>分析
は実施したことが ありますが、 その 他の 手法は 実施経験が ありません。
なぜなぜ<wbr>分析
のアンチパターンに なっていなそうで、 個人攻撃に なっているを よく 目に します。
Project Fabreのスライドの 内容が 刺さりました。 対策実施
原因分析の結果を もとに、 対策を 実施します。 対策を 実施後は、 実施した 対策の 効果測定を 実施する 必要が あり、 この フロー上ではなく それは 施策の 効果測定フロー 行きになるのかと 思います。
9. 参考
以下、
JSR-352
ジョブスケジューラと
グルー言語 一般的な
バッチ処理 障害対応
原因分析
以上です。
コメント