1. はじめに
なんとなくRailsを始めて、なんとなく自分なりのWebアプリを作ってみて、なんとなくHerokuにデプロイしてということをしてきたが、いまいちHerokuの仕組みについてはよくわかっていないのでまとめてみる。
2. 前提
まず前提として、Herokuにデプロイした際にドメインが与えられるが、そのHerokuアプリには固定IPアドレスが与えられていない。
3. dynoとは何か
dynoとは軽量のLinuxコンテナであり、デプロイしたアプリはこのdynoの中で実行される。(ほぼサーバー)
dynoは言ってみればアプリケーションを動かすための箱のようなものであるため、dynoのグレードによってできることが変わってくる。dynoにはFree, Hobby, Standard, Performanceがある。Railsを始めてそれほど経ってない自分みたいなペーペーがデプロイするのは大体Free dyno。
dynoのグレードを上げる(例えばFreeからHobbyに変更する)ことを垂直方向への拡張といい、dynoの数を増やすことを水平方向への拡張という。垂直方向への拡張はサーバーを強くすることみたいな感じで、水平方向への拡張はサーバーの台数を増やすことによって負荷を分散するみたいな感じ。
dynoにはグレードがあるが、種類もある。web dyno, worker dyno, one-off dynoの3つである。
web dynoはwebプロセスを実行するタイプのdynoであり、HTTPのリクエスト・レスポンスを処理するものである。従って大半の処理はweb dynoによって行われる。Procfileに書く[web:]から始まるコマンドはまさにこれのためのもの。
worker dynoはバックグラウンド処理を行う為のdyno。バックグラウンド処理っていうのは外部の API またはサービスとの通信 (Amazon S3 へのファイルのアップロードなど)、リソース消費の大きいデータ操作の実行 (画像やビデオの処理など)のこと。詳しくはWorker dyno、バックグラウンドジョブ、キューイング
one-off dynoはよくわかりません:)
(なおFreeプランHobbyプランではdynoは1つしか動かせないからweb dynoのみ)
4. HerokuにおけるHTTPルーティング
で、ブラウザから検索されたときにそのdynoまで届くのか。(ここが1番謎だった)
- リクエストがあったときにまず到達するのはロードバランサー
- ロードバランサーはルーター(複数ある)うちの1つにリクエストを送る
- ルーターはweb dynoを特定し、dynoに対してHTTPリクエストを送る(web dynoが複数ある場合は独自のアルゴリズムを用いてランダムに選択される。)