バッチアプリケーションの概要⚓︎
バッチアプリケーションとは⚓︎
バッチアプリケーションは、一連のタスクやプログラムを自動的に実行するアプリケーションです。 自動化された実行によって、人による操作を最小限に抑え人為的ミスを防止する利点があります。 また、複数の処理をまとめて自動的に実行することで効率的な処理が可能となります。 主に大量なデータ処理や繰り返し処理などに利用されます。
バッチ処理の種類⚓︎
バッチアプリケーションで実行するバッチ処理の方式として、以下に示す「適時バッチ」、「常駐バッチ」、「ディレイドバッチ」の 3 種類があります。
適時バッチ⚓︎
適時バッチは、ユーザーの任意のタイミングで実行されるバッチ処理です。 ユーザーが必要に応じて実行できます。 例えば、特定のデータを一括で処理したい場合や特定の操作をするためにバッチ処理を実行する場合などに利用されます。
適時バッチはユーザーの操作に応じた柔軟な実行が利点であることから、後述する定期バッチと比較して複雑なバッチ処理を実行できる利点があります。 しかしながら、処理が複雑になった場合、バッチ実行によるシステムの負荷が大きくなります。 そのため、処理を高速化したり使用するリソースを削減したりといった、システムの負荷を軽減するための対処を考える必要があります。
常駐バッチ⚓︎
常駐バッチは、あらかじめ設定された一定の間隔で自動的に実行されるバッチ処理です。 定期的にデータを更新する必要がある場合に利用されます。 例えば、毎日深夜にデータベースのバックアップを取る処理や、毎週月曜日に売上データを集計する処理などです。
常駐バッチは、あらかじめ設定されたリソースを利用して実行されるため、リソースを効率的に管理できます。 その反面、他の重要な処理やリクエストとリソースが競合することで、複雑なバッチ処理の場合に遅延が考えられます。 また、常駐バッチ処理は自動的に実行されるため、エラーや問題が発生した場合にその発見が遅れる可能性もあります。
ディレイドバッチ⚓︎
オンライン処理の正常なレスポンスを確保するために、即時処理を行う必要がない処理をバッチ処理に切り出すことがあります。 このような処理方式をディレイドバッチといいます。
バッチ処理で考慮すべき要件⚓︎
業務処理を実現するために、バッチ処理で考慮すべき要件を以下にまとめます。
大量データを効率よく処理できること⚓︎
バッチ処理はオンライン処理と比較してプロセッサー利用量が多く、多量なデータの入出力要求を処理します。 そのため、大量データの処理を一定時間以内に完了できるスループットが重視されます。
- 処理を加えるデータ量がどの程度か
- 処理に必要な時間はどれくらいか
- いつから処理を始める必要があるのか
- いつまでに処理を完了させる必要があるのか
上記のような処理件数や処理時間の制約を考慮しながら、スループットが向上するように対応していく必要があります。
異常発生時にリカバリーできること⚓︎
バッチ処理を実行する場合、通常の画面オンライン処理と異なりユーザーとの対話なく処理が進められます。 その途中で異常が発生した場合、その内容を検知できず終了してしまうことは避けなければなりません。 バッチ処理に対して適切にエラーハンドリングし、異常を検知するよう設計する必要があります。
また、異常検知後にどのように処理を継続させるかについてもあらかじめ検討する必要があります。 バッチ処理の扱うデータが膨大な場合、 一件の失敗によってバッチ処理をやり直すことで、効率的な処理を妨げる結果につながる可能性があります。
- エラーがあった場合、該当処理をスキップして続行する
- エラーの許容範囲を設けて、範囲以内の場合は続行する
- 一件のエラーがシステムに重要な問題を引き起こす場合に処理全体を失敗とし、ロールバックして始めからやり直す
このように、バッチ処理を行うデータの特性に合わせて適切な方法を選択してリカバリーできるようにする必要があります。
様々な入出力インターフェースが利用できること⚓︎
バッチ専用データベースを定義する場合はもちろん、 CSV や XML といった様々なインターフェースを扱えることが重要です。 このような異なる種類のデータソースやデータ形式を扱えることで、様々な外部システムやアプリケーションとの互換性が向上します。
実行契機に応じて柔軟に実行できること⚓︎
時刻を契機とする場合、オンラインや外部システムとの連携を契機とした場合など、様々な実行契機に対応する仕組みが必要となります。 適時バッチではスケジューラから定時になったら処理を起動する、 常駐バッチではプロセスを起動しておきイベントに応じたバッチ処理を行う、 というように、特定のタスクが必要となった時点で即座に実行できるように設計する必要があります。 これにより、バッチ処理の待ち時間を減らし全体のシステムの効率を向上させることができます。
リソース消費への対策ができていること⚓︎
バッチ処理中はシステムに大きな負荷がかかります。 オンライン処理と並行してバッチ処理を実行してしまうことで、リソース不足となる可能性があります。 これによって発生するバッチ処理の突き抜けは、システム障害につながってしまいます。 突き抜けを防止するために、以下のような対策が考えられるでしょう。
- オンライン処理とバッチ処理の実行時間帯を分割する(日次バッチや夜間バッチの利用)
- クラウドサービスを利用して、ニーズに合わせたリソースの増減を実現する