モダンなクラウドアプリケーション開発のベストプラクティスの一つである「The twelve-Factor App」が取り上げられることが多くなった。ビジネスの変化にICTが遅れずについていくためには、エンタープライズ分野の開発も、このプラクティスを取り入れていくべきだ。本稿では、エンタープライズシステムの開発・運用の視点から、従来行われてきたことと比較しながらTwelve-Factor Appを読み解く。シリーズ第3週となる今週は、「リソース増減や運用管理を容易にするためのプラクティス」をみていく。
前回の並行性に続き、今回は「6.プロセス、7.ポートバインディング」を解説する。
6.プロセス、7.ポートバインディング
Twelve-Factor Appの「6.プロセス」「7.ポートバインディング」は、「8.並行性」と併せてアプリケーションの実装方式に言及したもので、これを組み合わせることにより、高いスケーラビリティを持つアプリケーションを実現できることを主張している。個々に見ると、単に「こう実装せよ」という主張だけで「なぜそうしなければならないのか」かが不明確であるため、「8.並行性」にも関連付けて説明する。
それぞれの項目を要約すると、以下のような内容になるる。
6. プロセス
アプリケーションを1プロセス以上の状態を持たないプロセスとして実行せよ
・アプリケーションをプロセスとして実行する
・開発・テスト時は開発機環境上の単一プロセス、本番環境では複数サーバー上の複数プロセスで実行する
・各プロセスはステートレスかつシェアードナッシングとする
・プロセス間で情報を共有する必要がある場合は、データベースなどのバッキングサービス上に置く
・スティッキーセッションに依存してはならない
7.ポートバインディング
サービスをネットワークポートへのバインディングで外部提供せよ
・「Webサーバーの実行環境へのインジェクションによるWeb公開」ではなく、アプリケーション自体がポートへバインドすることによりサービスを公開しリクエストを待ち受けるように実装する
8. 並行性
プロセスモデルによりスケールアウトせよ
・アプリケーションを処理タイプごとにそれに向いたプロセスタイプとして実装し、それぞれを並行実行することにより、単純かつ信頼性のおけるスケールアウトを実現する
・プロセスの起動はUpstartなどのプロセスマネージャーによるものとする
「プロセスモデル」でスケールが容易に
Twelve-Factor Appの主な対象であるWebアプリケーションのシステム構成は、Web3階層モデルで構成されるのが一般的だ。すなわち、「Webサーバー(サービスの公開)」「アプリケーションサーバー(業務ロジック実行、シングルサインオンなど)」「データベースサーバー」の構成である。このようなシステム構成で、Webアプリケーションとしての処理能力を高める必要がある場合、ボトルネックとなる構成要素を特定しその資源を強化することになる。