バッチ処理とは?わかりやすく解説します|具体例あり
バッチ処理について調べる人
「バッチ処理とは、どのようなものですか?わかりやすく解説してほしいです。
オンライン処理とは何が違うのでしょうか。
どういうものなのかイメージがつかないので、具体例とか出して欲しいです。
あと、バッチ処理ってWindowsとかLinuxとかの環境にもよるのですか?バッチのプログラミングにはどのような言語を使うのでしょうか。」
こんな疑問を解決します。
この記事を書いている私はバッチ歴12年の金融エンジニアです。 現在の年収は1,000万円ちょっと。
インフラエンジニアを6年、アプリケーションエンジニアを6年経験しました。サーバの停止起動などのインフラ処理にも、日締め処理などを行う業務処理にもそれぞれのバッチ処理は存在します。
これまでの開発経験を活かして、バッチ処理とは何か、わかりやすく解説します。参考になれば幸いです。
バッチ処理とは? 身近なバッチ処理はごみ収集
あらかじめ決められた時間までにゴミ置場にゴミを出しておくと、収集車が来て処分してくれます。
もちろんバッチ処理というのはコンピュータで処理を行う上での概念なんですが、バッチ処理のコンセプトは「ゴミ収集」と全く同じです。
バッチ処理は処理の「流れ」と「時間」が重要です
- 流れ:ゴミを出すと、回収され、焼却場などに運ばれ、処理される
- 時間:いつまでにゴミを出し、いつ回収し、いつまでに処分するか
それでは具体的にコンピュータでどのような事をバッチ処理するのか、そして処理の方法(「流れ」と「時間」)について詳しく見ていきたいと思います。
本記事の内容
どういう時にバッチ処理を行う?
冒頭でバッチ処理を「ごみ収集」に例えましたが、バッチ処理以外にどのような処理があるかというと、「オンライン処理」です。この違いについてまず解説します。
オンライン処理とバッチ処理の違いとよく使われる言語
オンライン処理は、スーパーやコンビニのようなものです。バッチ処理が「ゴミ収集」のように特定の時間に一括処理されるのに対して、スーパーやコンビニは一つ一つの買い物に対して、その場で会計し処理を行います。
処理方式 | 処理タイミング | よく使われる言語 | イメージ |
オンライン処理 | リクエストの都度、 リアルタイムに処理 |
Java、PHP、Rubyなど | コンビニのレジ |
バッチ処理 | リクエストを まとめて処理 |
シェル、Javaなど | ごみ収集 |
バッチ処理イメージ
バッチ処理イメージ(参考)
バッチ処理の具体例
よくあるバッチ処理の例を示します
- 毎月1回サーバを再起動する
- 毎日1回その日の終わりに売上の集計処理を行う
バッチフローとは?
バッチ処理で重要なのが処理順序と処理時間ですが、何より絵を書くと理解しやすいです。
これをバッチフロー図と言います。バックアップ処理を例に解説していきます。
バッチフロー図
サーバ再起動処理のバッチフローを具体例として示します。サーバ3台(A〜C)を再起動するため、前後でサービス停止する一覧のバッチ処理例です。
バッチ処理順序
フロー図を参考にしていただきたいのですが、バッチ処理には順序があります。この例では、再起動をするために事前にサービスを停止しており、再起動後に再開しています。
実際のビジネスで使われるバッチ処理はもっと複雑なのですが、イメージはこんな感じです。
バッチ処理時間
この例では、バッチ処理が午前0時に始まっています。このように、処理の開始時間を指定するのが一般的です。
お客様がサーバを使わない時間帯に処理を開始する場合もありますし、この時間にならないと処理が正しく行えない、という時間を指定する場合もあります。
バッチ実行を管理するジョブスケジューラ
例:Zabbixのジョブ管理画面
このようなフロー図を作って、その通り実行する製品のことはジョブスケジューラと呼ばれています。フリーで使うことのできるジョブスケジューラ製品を紹介します。
製品名 | サポートされるOS | 参考URL | |
JobArranger for Zabbix | Linux,Windows | https://enterprise.zabbix.co.jp/solutions/4555 | |
Hinemos | Linux,Windows | http://www.hinemos.info/ja/option/jobmap | |
JobScheduler | Linux,Windows | https://www.ossl.co.jp/?page_id=148 | |
cronでもいいんじゃない?
ZabbixやHinemosを使わなくても、OS標準のcronやWindowsのタスクスケジューラでもいいのではないか?と思われるかもしれません。
小規模なシステムではそれでもいいのですが、サーバ台数が5台、10台、100台と増えるにつれて、サーバ間での連携や、複数のサーバで1つの処理とみなすジョブが増え、専用のジョブスケジューラが必要となるのです。
ジョブスケジューラはバッチ処理を行う司令塔のようなもので、JOBの時間になったり順番がくると、処理を行うべきサーバにJOB実行指示を行うのです。
バッチ処理に欠かせないシェルスクリプト
バッチ処理を実際に処理するのはプログラムです。バッチではシェルスクリプトやJavaがよく用いられます。
Linuxのバッチ処理はシェルスクリプトを用いるのが一般的
Javaなどバリバリのプログラミング言語を用いてバッチを作ってもいいのですが、シェルスクリプトなら比較的簡単に様々な処理が行えるため、シェルスクリプトが用いられるのが一般的です。
シェルスクリプトといってもBash,tcsh,ksh,zshなど様々な種類があるのですが、これについては別の場で解説したいと思います。また、LinuxではBashがデフォルトのシェルとなっていることから、Bashでバッチ処理を記述するのが最も一般的と言っていいでしょう。
古いシステムを保守する場合には、もともとそのシステムがLinuxではなく、HP-UXやSolaris、AIXで稼働していたかもしれません。そういう場合にはLinuxに移植された後も未だにBash以外のシェルが使われているかもしれませんね。
OS | 標準シェル | ||
Linux | Bash | ||
HP-UX | sh | ||
Solaris | tcsh,csh | ||
AIX | ksh | ||
Windows | バッチ(.bat),WSH,パワーシェル | Mac | Bash |
Windowsでもバッチ処理が行える
Windowsでも様々なバッチ処理の仕組みがあり、ビジネス用途でも利用されています。ただしWindowsは歴史的にクライアントOSとしてシェアを伸ばしてきた経緯があり、バッチサーバはWindowsよりもLinuxを用いるのが一般的です。
今回は以上です。シェルスクリプトの記述方法については別の記事でまとめたいと思います。
バッチ処理とは何か、イメージがつきましたでしょうか。少しでも理解のお役にたてば幸いです。