The Twelve-Factor App

VIII. 並行性

プロセスモデルによってスケールアウトする

すべてのコンピュータープログラムは、一度実行されると、1つ以上のプロセスとして表される。Webアプリケーションでは様々なプロセス実行形態がとられてきた。例えば、PHPのプロセスはApacheの子プロセスとして実行され、リクエスト量に応じて起動される。Javaプロセスは反対の方法をとる。JVMが1つの巨大な親プロセスを提供し、起動時にシステムリソース(CPUやメモリ)の大きなブロックを確保し、スレッドを使って内部的に並行性を管理する。どちらの場合でも、実行されるプロセスはアプリケーションの開発者にはほとんど見えない。

スケールは実行されるプロセスの数として表現され、ワークロードの種類はプロセスタイプとして表現される。

Twelve-Factor Appではプロセスは第一級市民である。 Twelve-Factor Appにおけるプロセスの考え方は、サービスのデーモンを実行するためのUnixプロセスモデルから大きなヒントを得ている。このモデルを使い、個々のワークロードの種類を プロセスタイプ に割り当てることで、開発者はアプリケーションが多様なワークロードを扱えるように設計することができる。例えば、HTTPリクエストはWebプロセスによって処理し、時間のかかるバックグラウンドタスクはワーカープロセスによって処理することができる。

このモデルは、ランタイムVM内のスレッドや、EventMachineTwistedNode.jsなどの非同期イベントモデルによって、個々のプロセスがプロセス内部で多重化することを禁止するわけではない。しかし個々のVMはそれほど大きくなる(垂直にスケールする)ことができないため、アプリケーションは複数の物理マシンで動作する複数のプロセスへと拡大できなければならない。

このプロセスモデルが真価を発揮するのは、スケールアウトが必要になったときである。シェアードナッシングで水平分割可能なTwelve-Factor Appプロセスの性質は、並行性を高める操作が単純かつ確実なものであることを意味する。プロセスタイプとそれぞれのタイプのプロセス数の配列は、 プロセスフォーメーション と言われる。

Twelve-Factor Appのプロセスは決してデーモン化するべきではないし、PIDファイルを書き出すべきではない。その代わりに、OSのプロセスマネージャー(例:Upstart、クラウドプラットフォームの分散プロセスマネージャー、あるいは開発環境におけるForemanのようなツール)を頼ることで、出力ストリームを管理し、プロセスのクラッシュに対応し、ユーザーによる再起動やシャットダウンを処理すべきである。