こんにちは。志御です。
バッチを作る時に結構困るのが、パフォーマンスです。
パフォーマンスを上げるために、アルゴリズム的な最適かや、SQLなどの最適化を行うのは勿論なのですが、他に多重化なども考えると思います。
扱うデータの種類や、データの構造などやモジュール化によって、多重化の可否が変わるのですが、そういったことが問題ない前提で、多重化を考慮するなら、どのような作りにするでしょうか。
もう少し突っ込んでいうと、例えばサーバーをスケールアップした場合に、何も手を加えずとも、自動的に多重化されていったら、楽では無いでしょうか。
通常は、多重化するとなると、特定のキーで対象のデータを抽出し処理するようにして、キーのパターン毎にバッチが起動する、そんな作りにするのではないでしょうか。
例えば、都道府県ごとに家族構成を集計し、次に全国の家族構成を集計するような、バッチ処理を考えたとします。
前提として、家族がどの都道府県に住んでいるか判断ができるデータベースになっているとします。
単純に、都道府県別にgroup byして、処理するような事を考えると、日本の人口は1億数千万人いますから、その分のレコードを処理することになります。
多分、都道府県(コードとか識別できるキー)に基づいて処理するバッチを作り、そのバッチを(実行できるなら)47プロセス同時に起動するようにジョブを組むのではないでしょうか。
しかし、CPUのコア数や、メモリ、I/O性能、ネットワークなどの要因で、簡単には、多重化できないと思います。
更に、そのバッチの集計結果を何処かに保管して、全国で集計するバッチを実行するような気がします。
このような場合に、CPUコア数や、メモリ、I/O性能、ネットワーク性能によって、リニアに多重度を調整して、実行できるバッチが作れたら、結構楽ではないでしょうか。
以前、筆者が関わったプロジェクトで、(家族構成ではないですが)バッチで都道府県別に処理しなければならない要件があった際に、結構、インフラ性能に振り回されて、苦労した事がありました。
当時は、物理サーバーだったのですが、今ではクラウド・サーバーもあり、処理要件に従って、簡単にスケールアップ/スケールダウンが可能になっています。
クラウド・サーバーでスケールアップ/スケールダウンする際に、一々、多重度を再設計するのも、時間の無駄な気がします。
■思い付き
思いついたのは、
・バッチの処理をタスクのような形で管理して、キューに溜めておきます。
・タスクを処理するためのエンジンが、キューを監視するようにします。
・インフラのパワー具合(CPUコア数や空きメモリ、I/Oの余力、ネットワーク・トラフィックなど)を判断して、タスク実行エンジンが、キューに溜まっているタスクを処理します。
・タスク同士は、依存関係を持っているようにして、依存される側のタスクが終わるまで、依存する側のタスクは実行されないなど、タスク実行エンジンが制御します。
・依存関係がなければ、そのタスクは同時並行的に実行されても、当然、影響はありません。
つまり、このタスクは多重化できます。
・タスク実行エンジンは、全てのタスクが完了するまで、ひたすら、タスクを実行し続けます。
・欲を言えば、タスク実行エンジンがサーバー間で繋がっていて、自動的に分散処理できると良いかな...。
と、このような仕組みがあれば、インフラ性能に従って、自動的に多重化されるのではないでしょうか。
これを思いついたのは、ant(Java製のビルドツール)を見た時です。
あと、WinyのようなP2Pシステムと、サーバー監視ツール。
既にある技術ばかりなので、なんとかすればできるような気がします。
Webのサーバーサイドの処理でも、応用が効くのかなっとも思います。
皆さんいかがでしょう。