Dynoの呼称
Dynoはその役割によって修飾された呼び方をされることがあります。大きくは以下の3つの呼称があります。
- Web Dyno
- Worker Dyno
- One off Dyno
以下にそれぞれの役割を説明します。
Web Dyno
Web Dynoとは、ブラウザからのHTTPリクエストをさばくDynoのことです。Herokuで作られるアプリケーションのほとんどはWebアプリケーションであることから、Web DynoのないHerokuアプリケーションはほとんどありませんし、実際に稼働しているDynoのほとんどもWeb Dynoです。
これまでの連載でgit pushしたコードがそのまま動作することを見てきましたが、それらはすべてWeb Dynoとして動作していました。
Worker Dyno
Worker DynoはHttpリクエストを受け付けないバックエンドの処理を行うDynoです。例えば、次のような処理をバックエンドで行います。
- キューを監視して、投入されたリクエストを処理する
- メールボックスを監視して、自動応答を行う
Worker Dynoはその処理内容ごとに複数定義できますが、そのコードベースはすべてWeb Dynoと同じものであることに注意してください。
通常は起動時のオプションによって処理を切り替えます。
One off Dyno
One off Dynoとは必要なときに起動して、処理が終わったらすぐに終了するDynoのことです。One off Dynoが実行されるケースには次の2つがあります。
- スケジューラによるタスクの実行
- heroku runコマンドによるタスクの実行
One off Dynoもコードベースは同じです。Rubyであれば、Rakeでタスクを作成することが多いようです。Javaの場合は、単純なコマンドラインアプリケーションを、通常通りのmainを持つクラスとして作成することが多いです。
一時的に起動するOne off Dynoに対して、常時起動しているWeb DynoとWorker DynoをまとめてRegular Dynoと呼ぶこともあります。
Procfile
Procfileは、アプリケーションのルートディレクトリに置くWeb DynoとWorker Dynoの起動コマンドを記述したファイルです。書式は次のとおりです。
<プロセス名>: 起動コマンド
改行区切りで複数定義することができ、それぞれの定義をプロセスと呼びます。
プロセス名に「web」を指定した場合、Web Dynoとなり、それ以外の名前を指定した場合はWorker Dynoとなります。
この連載で作成しているサンプルアプリケーションのProcfileでは、次の1行が定義されています。
web: java $JAVA_OPTS -jar target/dependency/webapp-runner-7.0.40.0.jar --port $PORT target/heroku-sample
見てのとおり、javaコマンドでJavaアプリケーション(Webサーバ)を起動しているだけです。$XXXXは環境変数(heroku configコマンドで設定可能)によって置換されます。WebDynoがHttpリクエストを受け取るポートは、$PORTという環境変数で定義されています。
Dynoの起動数
Procfileで定義した各プロセスには、個別にDyno Size(1X、2X、PX)と起動数を設定することができます。
設定はWebコンソールまたはコマンドから実行できます。
Dyno数は0から100まで設定できます。Web Dynoを0にした場合はアプリケーションのURLにアクセスしても、アプリケーションが起動していない、というHerokuのエラーメッセージが表示されるだけになります。
Dyno数はアプリケーションの負荷(アクセス数、メモリ使用量など)によって調整しますが、テスト環境や今回のサンプルアプリケーションのようにアクセスが多くないものの場合は1Dynoでも十分です(ただし、1Dynoでの運用には後述の制限事項があります)。
また、Add-onを利用することによってアクセス数によってオートスケールさせたり、アクセスの少ない夜間はDyno数を減らす、といった制御も可能です。
1Dynoの制限
アプリケーションをWeb Dyno1台のみで運用する場合、次の制限があります。
- Web Dynoに1時間以上アクセスがないとシャットダウンする(次にリクエストが来た時にDyno起動からスタートするので初回リクエストのレスポンスが極端に遅くなる)
- WebコンソールのMetrics機能が使えない
- preboot(後述)が使えない
Herokuに限った話ではありませんが、プロダクションとして運用するサービスの場合はWebサーバを2台以上の冗長構成とすることが推奨されます。
Herokuの場合、DynoManagerが常にDynoの状況を監視しており、異常が発生していると思われるDyno(レスポンスが極端に遅くなっている、メモリ使用量が超過しているなど)を即座に再起動するので、冗長構成での運用が一般のIaaSやオンプレミスに比べてはるかに楽です。これもHerokuを利用するメリットの1つといえるでしょう。