BashでBatchJobの設計のポイント
個人的なメモなので参考まで
設計時の心得
- 一般的に Batch処理は、前処理 > 本処理 > 後処理 となる
- 性能は考慮して作らないと後で泣きをみる
リアルタイム / 更新頻度の高いジョブ
- 異常時は極力早く対応するため、アラートが出るようにしておく
- リカバリ対応は次を考慮する
- 直ぐに復旧できること
- 更新系の処理であれば、止まってしまった間のデータ復旧ができること
- バッチ処理の途中の不整合なデータ状態が発生しないように注意
- 不整合データはユーザーサイドに見せないようにするため、バッチジョブの最後にコミットする
日付について
- 処理の最初に日付を生成して、保持しておく(長時間処理で日を跨ぐ可能性を考慮)
- 海外のデータを扱う場合は 夏時間・冬時間に注意
- 祝日の対応を考慮
可読性の向上
- 一つのシェルに全部書かない
- 各シェルの in/out はわかりやすく設計する
- どのファイルがインプットになっているかが、わからなくなりがち。
- 可能であれば、インプット/アウトプットになる情報は引数にしてしまう
- あまりに多い場合は、export 使って 環境変数でも良いかも
デバッグ・テストのために
- 実行対象の一覧は、外から引数で与えられるようにしておくのが良い。
- テストのときに楽。大抵ののバッチジョブは処理量が多いため
- 一時ファイルは上書き/削除せず、実行前に一時ファイル格納ディレクトリをクリアにする
- デバッグが楽になる
- Logは必ず残そう
運用を楽にするために
- リカバリーを簡単にしておくことは大事
- もう一度、実行するだけにするのがBEST
- エラー発生時には、止めるのか できるとこだけ続けるのかを握っておく
- 祝日どうするかって意外と大事
- 誰かがメンテしないとね
理想な構成
- execute.sh ./intialize.sh if [ $? -ne 0 ] ; then echo "error has happend in ..." exit 1 fi ./main_process.sh if [ $? -ne 0 ] ; then echo "error has happend in ..." exit 1 fi ./finalize if [ $? -ne 0 ] ; then echo "error has happend in ..." exit 1 fi exit 0