[Heroku][Ruby on Rails] Heroku で オートスケーリング(auto scaling)

先日、"Heroku" のTipsを紹介します。Salseforce.com に買収されることが発表されたRuby on RailsホスティングのPaaSサービスですね。

Herokuはとても良く出来たサービスなのですが、いくつか弱点があるのかなと思っています。

  • ログが削除される
  • cron が 1時間ごと/1日ごと しか選べない
  • クラウドなのにオートスケールしない
  • ...

僕は、Ruby on Rails プログラマーですし、Herokuの考え方がとても好きなので、弱点を克服する方法を考えました。今回は、"クラウドなのにオートスケールしない"という弱点を考えました。

Herokuは、スケールは可能です。サーバプロセス数を指定することができるので、それを増やすと大規模なアクセス数があるサービスでも十分に対応可能となっているそうです。しかし、"自動"ではないので、アクセスが減ったときに自動で減らせず余分なコストが発生します。また、アクセスが増えたときに自動でプロセスを増やせず、レスポンスが遅くなってユーザに不便をかける可能性があります。

そこで、私の考えた方法はHerokuのとても優れている外部サービスとの連携(Add-onsと呼ばれる)を利用してこれを解決しました。Herokuは、NewRelicというパフォーマンスをモニタリングしてくれるサービスと連携しています。そのデータを取得し、パフォーマンスが下がったときはプロセス数を上げ、パフォーマンスが十分になったときはプロセス数を下げることで自動スケールを実現します。

以下のようなスクリプトを書いてみました。

非常に、シンプルなコードなので読んでみてもらうと分かると思いますが、上に書いたことをそのまま書いています。それぞれのサービスのgemがあるのでそれを利用するとすぐに実現できました。

使い方は、setup config部分に自動スケールしたいアプリのIDとNewRelicのAPIキーを入力だけでOKです。NewRelicのキーは、Addonsのコンソールの中から探してもらうか

heroku config --long

とアプリのDirでコマンドを打ってもらうと、NEW_RELIC_LICENSE_KEYに表示さます。

あとは、このコマンドをcronなどで定期的に実行すれば、その時のパフォーマンスに応じてプロセス数を調整し最適なものにしてくれるでしょう。

今回は、Herokuの弱点である自動スケールができないを克服する方法を紹介しました。是非ご利用ください。