HerokuがJRubyを公式サポート言語に追加
2012年12月13日、HerokuがJRubyを公式サポート言語に加えたと発表しました。公式サポート言語、フレームワークは、
- Ruby
- JRuby
- Node.js
- Clojure
- Python
- Java
- Gradle
- Grails
- Scala
- Play
ということになりました。すでにScalaやClojureといったJVM言語をサポートしていたので、意外に対応が遅かったような印象もあります。RubyコミュニティがC実装のRubyとUnixのプロセス並列によるスケーリングを好む傾向にあって、JRubyがRuby側からはさほど普及していないことが理由として挙げられるかもしれません。
Herokuは2011年8月にJava対応を開始していて、すでにJRubyを動かすこと自体はできました。今回は公式サポート開始ということで、特別な設定をすることなく利用可能となったということです。
既存のCRubyをターゲットとしたRailsアプリをJRubyでHerokuにデプロイする方法は、「Moving an Existing Rails App to run on JRuby」というドキュメントに書かれていますが、
- ローカルにJRubyをインストールしてRailsアプリの動作を確認
- JRuby非対応のgemがあったら何とかする
- Gemfileにjrubyを使うむね、宣言を書く
- pumaなどJRuby対応のWebサーバを使うよう変更する
- Procfileの起動コマンドを書き換える
- PostgreSQLのドライバを pg から JDBC対応の activerecord-jdbcpostgresql-adapterに変える
というような流れのようです。
ちなみに、サードパーティー製のHeroku向け言語サポートが「ビルドパック」という仕組みで存在しています(リンク)。言語によらず、gitでコードをpushするとHeroku側でslugというバイナリにコンパイルされますが、ビルドパックというのは、このコンパイル手順を書いたスクリプトです。標準サポートのRubyやNode.jsも同様の仕組みを利用しているそうです。サードパーティ製のビルドパックには、DartやGo、Erlang、Perl、Lua、Meteorといった比較的メジャーなものから、EmacsLispやPhantomJS、R、Elixirといったエキゾチック(?)なものまであります。EmacsLispでWebアプリが作れるんですね……。EmacsLispで書かれたNode.jsのような非同期Webサーバ「Enlode」を使うそうです。
ともあれ、JRubyを使うメリットは、Javaのライブラリが使えることと、CRubyのようにGIL(Global Interpreter Lock)が存在せず、スレッドを使った並列化で高速化がやりやすいことでしょうか。公式サポートとなったことで、JRubyの利用が増えるかもしれませんね。