見出し画像

バッチ処理とは何ですか?

ふと、若手のエンジニアからそんなことを聞かれました。

答えるのは至極簡単だったんですけど、そもそも私はQA。いくら若手とは言え、技術部で現役のエンジニアからQAに対して聞く質問ではないな、と思いちょっと気になったので、周囲にいる先輩エンジニア数名に、同じ質問をしてみました。

すると、半数以上がまともに答えられなかったのです。

ェ…マジデ…_(:3」∠)_

もう少し面倒な質問も用意していたのですが、少々ビックリしました。あれ、今どきのエンジニアってどこもこんなものなのかな?

仮に答えられたとしても、さらに「では、一般的にバッチ処理に求められる要件って何ですか?」と聞かれるとどうでしょう。「バッチとは」の質問に答えられた人の中でも、おそらくは大多数が答えられないのではないでしょうか。

バッチとは

順を追って説明しますと、一般的に、バッチとは

 「まとめて一括処理する」

ことを指します。データベースやファイルから大量のレコードを読み込み、処理し、書き出す処理である傾向が強いことが特徴かもしれません。画面操作などを一切必要とせず、あらかじめ定められたルールや手順に則り、「読込」「確認」「編集」「出力」と言った動作を行う処理を、ある単位でまとめ、バックグラウンドで活躍する処理群のことです。

バッチ形式の処理には次のような"特徴"があり、フロントエンド(人が操作することで動作する)処理と比較して、応答性より処理スループットを優先した処理方式であると言えます。

 ・データを一定の量でまとめて処理する
 ・処理に一定の順序がある
 ・スケジュールに従って実行・管理される

人の手を介さず、自動的にいくつもの処理群を実施することが多いため、ある程度固定化されたルールや順序などが定められているのが一般的です。


バッチを利用する主な目的

大別すると、次の4点です。

 ・スループットの向上
 ・応答性の確保
 ・時間やイベントへの対応
 ・外部システムとの連携上の制約

スループットとは、単位時間あたりに処理できる量のことで、たとえば「人」が1件1件処理をしていては時間がかかって仕方がない業務でも、単純作業であればコンピューターにさせた方が良いって事例、みなさんの周りでも良くありますよね?

画像1

あくまで一例ですが、こんなテキストファイルがあったとして、

 「日付の昇順に並べ替えたい」
 「役職クラスごとに件数を数えたい」
 「"分からなかった"人の分布を知りたい」

と言った場合に、1件ずつ人が編集したり、集計していくのは大変ですよね。もちろん、Excelだったり、テキストエディタだったりを使いこなせる人は、簡単にできちゃうのは分かっていますけど、このデータがもっと複雑なものになっていたり、条件が絡み合ってたり、データ件数が7桁、8桁、9桁となってくるとどうでしょう。あるいは1日に何十回もこんなファイルが届けられてきたらどうでしょう。

毎回毎回、みなさんなら自分で作業しますか?

大変ですよね。それに自動化する処理に比べたら人の手で作業するのは時間がかかると思います。ファイルを開く時間、セーブする時間、閉じる時間のオーバーヘッドだって馬鹿になりません。そういった時にバッチ処理は効果を発揮します。

また、人がなんでもかんでも処理しようとすると、1日あたり他にできることが減ってしまいます。人は、人が関与しなければならない作業に集中させ、その必要性がない処理はバッチに任せてしまうことで、フロントエンドの応答性を向上することが可能になります。

たとえば、今、上司に頼まれてコピーを取っていたとしましょう。

その際中に、外線電話がかかってきたとします。その時「コピー中だから、電話は後回し」とするかと言えば、そんなことはしませんよね。優先すべきは「電話」のはずです。コピーはボタンさえ押してしまえば、放っておいても勝手に出来上がっていますよね。

このように、人が関与しなければならない処理の応答性を向上させるために、その裏で処理できることをバッチに任せてしまうわけです。

他にも、バッチは大量データを取り扱うことが多い(人は面倒くさがり屋な)ため、基本的にバッチの処理中はコンピューターの負荷を大きく占めることが多いと思います。そのため、日中に処理しようとすると他の処理が遅くなってしまうこともあるため、特定の日の夜間や休日に実行されることが多いと思くなるように設計されていることでしょう。

 日次バッチ
 週次バッチ
 月次バッチ
 年次バッチ
 年度次バッチ

など、大量データの集計系処理であれば、おそらくそうした単位で実施されているのではないでしょうか。たとえば、月々の売上集計であったり、年度末の決算資料の作成であったりと言った具合です。小売などで1日に1000件の取引があれば、240営業日で240,000件のデータになりますし、1件ごとに平均20個の商材が取引されていれば、4,800,000個の商品データが登録されているということになりますよね。しかも、全国に100店舗あったとしたら、480,000,000個ものデータが蓄積されているということになります。これをいちいち手で計算していたら、1日あっても終わりません。

そこで、夜間や休日の、誰も利用していない時間…つまりはCPUの負荷が最も低い時間帯を有効利用して、自動的に処理を行っておき、朝出勤した時にはすべて終わっている状態にしておきます。

こういったことをジョブスケジューラー/タスクスケジューラーなどを用いて、「ある条件を満たしたら自動実行する」ようにしておくと、一切人の手を介さずに毎日、毎週、毎月、毎年、毎年度、自動化されて便利になるわけです。

ちなみに。

私が携わったことがある、とあるトラブルプロジェクトでは、2分に1回の単位で1分~1分半ほどかかるバッチが起動していました。頻繁にバンバンやってくるメールを受信し、その内容を読み取って、システムのデータベースに書き込む処理をしていたのです。

ちょっと珍しい使い方でしたが、用途の幅は広く、人の判断や行動の必要がないものについては、なんでもバッチ化することが可能です。


バッチ処理に求められる要件

「人が実施するには超面倒」であればあるほど、バッチ処理はその効果を発揮します。元々、IT化の目的は「自動化」「効率化」があって、バッチ処理はその意味で、最もITであることの目的に合致したモノであるとも言えます。

その目的を最大化するために、バッチ処理に求められる要件には以下のようなものがあります。

 ・性能向上
  →向上するほど、限られた時間内でさばけるデータ量が増やせる。
 ・異常発生時のリカバリー(回復)
  →自動化する関係上、異常終了で処理が止まることが一番怖い。
   異常があっても、ダメージを最小限にできる方策が必要。
 ・多様な起動方式
  →取扱うデータによって、同期/非同期での実行などを検討する。
 ・さまざまな入出力インターフェース
  →取扱うデータによって、形式が異なっていることは多い。
   インターフェース形式にあわせて、処理できるようにする。

よく問題を起こすのが、夜間のうちに「帳票(印刷物/印刷物形式のファイル)」を作っておきたい…と言うバッチで、Excel形式などを求められる場合です。

機能要件としては決して難しい話ではないのですが、ExcelやWordなどをプログラムから操作するのは、色々と面倒な手続きが必要になります。今でこそ無償化されたライブラリが一部で出ていたりしますが、一昔前はMicrosoftライセンスにも抵触するため、有償化されているのが一般的でした。そのため、ブラックボックスとなっていることも多く、大量データを取り扱うには、様々な課題もあったのです。

まぁ、今でも言語によっては変わっていないかもしれません。

たとえば、Java言語などでは、無償の「Apache POI」などを使うのが有名ですが、使い方によっては数万件程度の処理でシステムがダウンしてしまったりします(今でも同じかは知りませんが、数年前はそうでした)。

こう言うことを知らずに、「機能要件だけを満たせば大丈夫」と勘違いして設計/実装すると、後で困ったことになります。ライブラリ都合の特性などは知らないまま利用しようとするエンジニアも多いため、問題が起きてしまうと、原因特定までに非常に時間がかかってしまったりすることもしばしばです。


バッチの特性を最大限活用すると

一例として挙げると、たとえば、昨今業務の改善などが大幅に行われている中でよく出てくるRPA(Robotic Process Automation)などに行きつきます。あれは、AIなどが搭載されているものもありますが、基本的な技術としては、バッチ処理の理想的な活用方法の1つではないでしょうか。

まぁ、利用者にはバッチ処理が行われている実感もないかもしれませんが、システムの裏側では同じようなコンセプト、同じような処理技術が用いられています。

元々、人が行っていた業務も、定常化してくると

 「人が介していないと、絶対にできないもの」
 「別に人でなくてもいいもの」

に分かれてきます。たとえ上司が承認しなければならない、と言うものであったとしても、必ず上司に承認させなければならないものとは限りません。その上司の感性や個性、独善的な考え方に依存してビジネスが成り立っていればいい…と言うわけでないのなら、必ず定型的な判断基準、ルール、条件等があるはずです。

複雑かも知れませんが、そういった思考の手順や手続きを明確化すれば、アルゴリズムが出来上がり、自動化することが可能になります。RPAはそういった定型業務の自動化に非常に相性がいいのです。

いただいたサポートは、全額本noteへの執筆…記載活動、およびそのための情報収集活動に使わせていただきます。