2013-05-22 6 views
12

Node.jsが出た後、それはイベントプログラミングを普及させたものでした。 しかし、Rubyには、イベントコードの記述をサポートするEventMachineがあります。レールがイベントコードの書き込みを完全にサポートしていないのはなぜですか

レールで、イベンティングをサポートするための要件は以下のとおりです。イベント化コードより簡単に書くようにするために原子炉
2.繊維(ルビー1.9.3)を実行
1.イベント化サーバ(薄い、虹)、それ以外の我々スレッドを使用している可能性があります。
3.イベントが発生したすべての宝石(例mysql2)。

Nodejsは、イベントプログラミングの明らかな利点を示しました。だから、なぜレールコミュニティはイベントマシンを採用していないのですか?レールがイベントマシンに完全に移植可能でない理由の1つは、発生しない可能性がある基礎となる宝石への依存性のためであると私は思う。しかし、その方向に動く計画があるかどうか誰にも知られていますか?

RailsはNodejsの機能を果たすことができますが、Nodejsはすべてのライブラリメーカーでイベントプログラミングを主導することから始まります。したがって、ノード内のpackage.jsonにほとんどの依存関係を追加すると、イベントが発生し、ボックスからすぐにnodejsで。

+0

これは私たちをすべてコールバック地獄に導きます。 – Ven

+0

Ryan DhalがJavaScriptを選択したときに、http://rubylearning.com/blog/2010/10/01/an-introduction-to-eventmachine-and-how-to-avoid-callback-spaghetti/ –

+3

を避ける方法があります(1)JavaScript用のIOライブラリはありませんでした。そのため、すべてゼロから非同期に構築することができました。(2)言語はイベント駆動型に使用されていましたまずはあなたが話す問題 - Railsの使い方を変えることはJavaScriptがnodejのためにルビーよりもピックアップされていた最大の理由です(V8 JavaScriptエンジンはまったく問題ありませんでしたが、それほど重要ではありませんでした)。私はクリスの答えがうまくいっていると思う。 –

答えて

15

最大の理由は、RailsエコシステムがイベントIOのために構築されておらず、アプリケーションにイベントIDのないIOが1つ導入されていることです。 Ruby(とRails)にイベントコードを書くことは非常に可能ですが、必ずしも簡単なことではありません。宝石がイベントIOを実行するかどうかは必ずしも明確ではなく、開発者は多くの時間を費やす必要がありますアプリケーションがブロックされている場所を追いかけるこれとは対照的に、ノードは、IOが同期してはならないという暗黙の理想をもって作成され、その全体的なエコシステムがその理想から流れ出したので、IO操作が同期するかどうかについて開発者が気にする必要はありませんか否か;デフォルトでは非同期であるという前提があります。

さらに、イベントが発生したWebアプリケーションは、IOバインド時にのみ有効です。アプリケーションがCPUにバインドされている場合や、シンクロナスCPUの処理が大量に行われている場合、イベントが発生したモデルはおそらく適切なアプローチではありません。 Rubyは、主に言語のメタプログラミング構造とガベージコレクタ(これはRuby 2.1で大幅に改善されるはずです)のためにかなりの量のCPUを必要とすることがあります。これは、Node to evented programmingよりもあまり適していません。

Railsには、フォーク、プリエンプティブスレッド、イベントなど、多くの並行性モデルが用意されています。アプリドメインに最も適したモデルを選択するのは開発者次第です。 POSIXシステムにデプロイしている限り、フォークはデフォルトであるため、特別な配慮は必要ありません。また、Railsを作成したときにRubyにはシステムスレッドがありませんでした。今、Ruby 1.9+(システムスレッド、GIL)とJRuby(GILなし)では、スレッドコードは非常に簡単にデプロイできます。 Ruby 2.0は、COWに優しいガベージコレクタを提供します。これは、フォークが以前よりも効率的であることを意味します。

イベントコードはデベロッパーからのより多くの作業が必要なためデフォルトではなく、多くの人にとってデフォルトのフォークモデルで十分です。そうでない場合、開発者は、インフラストラクチャとアプリケーションドメインに最適なスレッドまたはイベントコードのオプションを持っています。

+0

"デフォルトフォークモデルは十分です"。私の経験では、これは多くの多くのWebアプリケーションで当てはまります。 –

+1

私はよく説明された答えに対して+1を持っていましたが、 "開発者からのより多くの作業が必要なため、イベントコードはデフォルトではありません"と強く反対します。 nodejsのようなイベントモデルを使用するシステムとレールモデルの両方で働いていれば、慣れてもそれ以上の作業は必要ないと思います。最初は急な学習曲線がありますが、それを過ぎてしまえば、フォークモデルで簡単にコーディングすることができます。 –

+0

Railsのエコシステムでは多くの作業があります。なぜなら、あなたはすべてのI/Oを自分で確認する必要があるからです。 Nodeのようなエコシステムでは、精神的なオーバーヘッドはありません。あなたがそれを得ることができれば、em-synchronyモデルのファイバーは素晴らしいです! –

関連する問題