質問: ddollar/foremanについてです。 ジョブ, プロセス --------- David Dollar > > My apps no longer consist of a single web process; I usually have have > > one or more types of background workers to run different types of jobs > > and a clock process to handle scheduling. > > > 種類の違う**バックグラウンドで動くジョブ**をスケジューリングしているというようなことが書いてあります。 Foreman as Process Manager ここにも**Process Manager**とあり、**ジョブ**のことを**プロセス**とも呼んでいるものと考えます。 ### 具体的にジョブ, プロセスとは? Using foreman and environment variables to isolate and run your apps in development - Maurício Linhares' ramblings > > If you’re building Rails apps you probably found yourself installing > > many external dependencies to run it. A database, a full text search > > engine, an in memory cache, background worker processes and many other > > tools that run as separate processes in your machine. > > > とあるので、具体的に**ジョブ**や**プロセス**と呼ばれているものは、 データベースやフルテキストサーチエンジンやキャッシュと理解しました。 ### 具体的なソフトウェアで考えると... 上記では、データベースやキャッシュなどと表記されていますが、具体的なソフトウェアの名前を上げると、`MySQL`,`PostgreSQL`,`Redis`,`Unicorn(これもforemanの扱う対象?)`といったものが上がると思います。 Process Manager? ---------------- iPhoneアプリ開発では`Objective-C`を用い非同期処理を実現するために、`GCD`を使ったりして処理の制御を頻繁にしておりました。 `foreman`も似たようなことをしているのではないかと推測しているのですが、 `PostgreSQL`,`Redis`,`Unicorn`というものを`foreman`が管理するというのがいまいち想像がつきません。`PostgreSQL`,`Redis`,`Unicorn`といったものを個別に立ち上げても`OS`がプロセスを扱う役目を担っているはずですので、`foreman`がいったい内部でどのようなことをしていてどのようなメリットがあるのでしょうか?
回答: Railsアプリを開発するとき、ウェブサーバーのプロセスを1つ立ち上げて開発出来るのであればforemanは必要ありません。 しかし、開発をすすめるうち、ウェブサーバー以外にも以下のように`rails s`で立ち上げるウェブサーバー以外にも、同時に実行しておかないといけないプロセスがいくつも出てきます。 * バックグラウンドでジョブを実行するためのワーカープロセス * ワーカープロセスに定期的/ある特定の時間に処理を実行してもらうため、適切なタイミングでワーカープロセスにジョブを渡すためのクロックプロセス * ウェブ/ワーカー/クロックプロセスから、ジョブをエンキューするためのキュー * Railsで管理していないアセットをビルドするためのプロセス 具体的なソフトウェアの例 一例ですが、僕がいま開発しているアプリを実行するためには、以下のコマンドを実行して5つのプロセスを同時に立ち上げる必要があります。 * bundle exec rails s * bundle exec sidekiq -c 1 * bundle exec clockwork lib/clock.rb * gulp watch * redis-server ※僕の場合はデータベースは常時立ち上げているのでforemanで管理していません ### foremanを使わない場合 * これらのプロセスを1つ1つ手でコマンドを実行して立ち上げる * デバッグで標準出力をみたいときにはこれらのプロセスの標準出力を1つ1つ見に行く * 全ての開発者がこれらのコマンドを手で実行する * このアプリケーションの実行に必要なコマンドを足したときには他の開発者に知らせる ### foremanを使う場合のメリット * プロセスの種類と立ち上げるコマンドProcfileに書いておけば、foremanのコマンド一発でこれらのプロセスを立ち上げ開発を開始できる * 標準出力をまとめてみれるのでforemanのコマンドを実行した画面を見ればすべてのログがみれる * 開発しているアプリケーションを実行するために必要なコマンドをProcfileに書いておけば誰でもforemanのコマンド1つで実行できる * 開発しているアプリケーションを実行するために必要なコマンドが増えた場合も、Procfileに追加するだけで、誰でもforemanのコマンド1つで実行できる ### foremanがやってること 雰囲気はこの辺みるとわかると思います。