アウトプットができる技術者に

it's a time to take a new step !

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