なぜ私たちは NodeJS から Ruby on Rails に移行したのか

以下の文章は Targeter App Blog の記事を翻訳したものです。原文は 2012年5月12日 に書かれました。


Why we moved from NodeJS to RoR
http://blog.targeterapp.com/post/22984987832/why-we-moved-from-nodejs-to-ror

免責事項:この記事は NodeJS や Ruby on Rails について騒ぎ立てるものではありません。ただ私たちの決定とその理由について振り返るものです。両フレームワークはそれぞれが作られた目的において素晴らしいものであり、そのことは、私たちのスタックの一部がいまだ NodeJS で動いている理由でもあります。

私は NodeJS のすごいファンで、これは非常にエキサイティングな技術だと信じていて、これらの人気が出る様を目にするだろうと思う。私はとても賞賛しているが、それにもかかわらず、私たちは Targeter App を NodeJS から Ruby on Rails に移行した。

私たちが当初 NodeJS でアプリを書いた理由というのはいたって単純だ。アプリをすぐ出すのに使えるライブラリがあったということと(Startup Weekend で使える時間は 54 時間だった)、Ruby に比べると、 JavaScript の方がコーディングする機会が多かったということだ。私たちのスタックは MongoDB を含んでいて、JS 環境で生かされることに意味があった。しかし、アプリが成長してくると、NodeJS がこのアプリには間違った選択だと気づいた。以下に主だった理由を挙げる。

NodeJS は数多くの短いリクエスト(short lived requests)を実行するアプリに適している。伝統的な CRUD アプリでも上手く動作はするが、理想的なツールというわけではない。PHPRubyPythonにもフレームワークがあり、そういった用途のアプリには十分磨き抜かれ、成熟している。NodeJSがすべて非同期(async everything)であるということは CRUD アプリでは効果がない。人気のフレームワークは、とても良いキャッシュや、アプリに必要なものをすべて備えていて、同期処理であっても十分に上手く動作する。

NodeJS はとても若いフレームワークで、パッケージ周りは未成熟だ。このことで多くの優れたパッケージを生み出してきた素晴らしいコントリビュータを攻撃するつもりはまったくない。しかし、ほとんどのパッケージはまだ成長段階だし、NodeJSの急速な開発は、新しいバージョンになる度にたくさんの変更があるということを意味する。つまり、最先端の技術を使うには、最新バージョンに出来るだけ早く更新しなければならない。これはスタートアップには多くの問題となる。

さらなる理由として、テスティングがある。NodeJS のテスティングフレームワークは良いが、DjangoRoR といったプラットフォームで利用できるものには敵わない。1日に数十のコミットがあってそれらすべてを1、2日中に使えるようにしなきゃならないときに重要になってくるのが、何も壊れていないと保証することで、それができなければ、苦労して獲得したアーリー・アドプターを失うことになる。ささいなバグを直すのに丸一日を費やしたい人はいない。

最後に、私たちは、すべてをキャッシュすることが必要で、それをできるだけ早く終わらせる必要があった。アプリが成長して秒間数千ヒットになったが、洪水のようなリクエストを経験することはなかった。チャットアプリじゃないんだ! 最大でもメインアプリは 1000 RPS で、それぐらいは、RoR と Nginx を使えば容易に対応できる。

さて、ここまで読んでいる人は、私たちがどこで NodeJS を使っているか死ぬほど訊きたいのだと思う。説明しよう。私たちのアプリは 2 つの部分で構成されている。1つはユーザが見るユーザインターフェースで、もう一つはレポートを管理する部分だ。後者は NodeJS を使うのに完璧なシナリオだ。たくさんの短いリクエストがある。この部分は、多くのものをプッシュしているときでもレスポンスをできるだけ速く終わらせる。リクエストがオープンになっている間はブラウザがそれの終了待ちになり、ユーザ・エクスペリエンスを損なってしまうので、これは重要なことだ。NodeJSがすべて非同期だということが私たちを救ってくれた。データは DB に書き込まれたり、ガシガシ処理されたりする一方で、リクエストは終了し、ブラウザはより重要なことを続行できる。

私たちが従事しているプロジェクトは Targeter App で、私たちのアプリの更新を twitter や ニューズレターにサインアップすると受けとることができる。

PS: ここに NodeJS をどこで使うべきか、また、上司を説得して使わせる方法についての優れたガイドがある。
http://nodeguide.com/convincing_the_boss.html