Node.jsまたはErlang


86

処理できる並行性レベルに関しては、これらのツールが本当に気に入っています。

Erlang / OTPははるかに安定したソリューションのように見えますが、関数型言語のパラダイムについてさらに多くの学習と多くの知識が必要です。そして、マルチコアCPUに関しては、Erlang / OTPの方がはるかに優れているようです(間違っている場合は訂正してください)。

しかし、どちらを選ぶべきですか?短期的および長期的な観点からどちらが優れていますか?

私の目標は、高負荷でのWebプロジェクトのスケーリングを従来の言語よりも簡単にするツールを学ぶことです。



2
@ToddMoses正しい質問にコメントしてもよろしいですか?
flavien Volken 2014

リンゴとオレンジ。Node.JS(コア)はlibevent(C)+ Javascript相互運用です。Erlangは完全にカスタムのIO実装です。Node.JSは、シングルスレッドアプリ用に作成されています。あなたのデレマは、Facebook / Googleで仕事をしたいですか、それともキックアスソフトウェアを作りたいですか。
バンS

回答:


87

アーランを試してみます。学習曲線は急勾配になりますが、関数型プログラミング言語を学習するため、学習曲線をさらに活用できます。また、Erlangは信頼性が高く、並行性の高いシステムを作成するように特別に設計されているため、同時に拡張性の高いサービスを作成する方法について多くのことを学びます。


10
ErlangはJavascriptより少し複雑だとは思いません。Erlangにはいかなる種類の継承もないので、どの関数を呼び出すかは常に確実です。Erlangには暗黙の型変換がないため、使用するデータの種類を常に確認できます。破壊的な割り当てはないため、コールバックの新しいコードによって内部状態が変更されたため、古いコードが壊れることはありません。
Dmitry Belyaev 2013年

51

Erlangについて話すことはできませんが、ノードについて言及されていないことがいくつかあります。

  • NodeはGoogleのV8エンジンを使用して、実際にjavascriptをマシンコードにコンパイルします。したがって、ノードは実際にはかなり高速です。つまり、これは、イベントドリブンプログラミングとノンブロッキングIOによって提供される速度の利点に加えてです。
  • Nodeにはかなり活発なコミュニティがあります。freenodeで彼らのIRCグループに飛び乗ってください、そしてあなたは私が何を意味するかを見るでしょう
  • 上記のコメントが関数型プログラミング言語を学ぶのに役立つという理由でErlangをプッシュしていることに気づきました。スキルセットを拡張し、そのうちの1つを身に付けることが重要であることに同意しますが、新しいプログラミングスタイルを学びたいという事実に基づいてプロジェクトを作成するべきではありません。
  • 一方、Javascriptはすでに、書きやすいパラダイムになっています。さらに、JavaScriptであるため、クライアント側のコードを作成すると、ルックアンドフィールの一貫性が保たれます。
  • ノードのコミュニティはすでに大量のモジュールを送り出しました!redis、mongodb、couch、およびあなたが持っているもののためのモジュールがあります。調べるべきもう1つの良いモジュールはExpressです(ノードのSinatraを考えてください)

実際にノードを書いたRyanDahlによるyahooのブログのビデオをチェックしてください。これは、ノードがどこにあり、どこに向かっているのかをよりよく理解するのに役立つと思います。

ノードはまだ開発後期段階にあるため、かなりの数の変更が行われていることに注意してください。変更により、以前のコードが破損しました。ただし、おそらく、APIがあまり変更されないことが期待できる時点です。だから、何か楽しいものを探しているなら、ノードは素晴らしい選択だと思います。


26
V8エンジンはJavaScriptをアセンブリではなくマシンコードにコンパイルすると思います。
Jonas

10
Javascriptの周りで多くの作業を行っても、その言語は複雑な問題の解決に少しでも適していません。言語自体は、型変換のこれらすべての特殊なケースでひどいです。そして、変数が何百もの異なる場所で変更されるコールバックスタイルと、何らかの割り当てが発生した場所を探す地獄。
ドミトリーベリャーエフ2013年

15

私は長年のErlangプログラマーであり、この質問からnode.jsを見るようになりました。かなり良さそうです。

複数のコアを利用するには、複数のプロセスを生成する必要があるようです。ただし、プロセッサアフィニティの設定については何もわかりません。Linuxでタスクセットを使用することもできますが、おそらくパラメーター化してプログラムに設定する必要があります。

また、プラットフォームのサポートが少し弱い可能性があることにも気づきました。具体的には、Cygwin forWindowsサポートの下で実行する必要があるようです。

でもよさそうだ。


編集

Node.jsはWindowsをネイティブにサポートするようになりました。


5
この答えは少し古いです。現在、Nodeはクロスプラットフォームであり、Windows用のCygwinを用意する必要はありません。また、Nodeには、TCPソケットを共有する、1台のマシンでのクラスタリングのサポートが組み込まれています。
Farid Nouri Neshat 2012

9

私は、複数のプロジェクトについて、あなたと同じ2つの選択肢を検討しています。

これまでのところ、特定のプロジェクトでそれらの間で決定するために私が思いついた最高のかみそりは、Javascriptを使用する必要があるかどうかです。移行しようとしている既存のシステムの1つは、すでにJavascriptで記述されているため、次のバージョンはnode.jsで実行される可能性があります。移行する既存のコードベースがないため、他のプロジェクトは一部のErlangWebフレームワークで実行されます。

もう1つの考慮事項は、Erlangは複数のコアだけでなく、データセンター全体に拡張できることです。node.jsに、どのマシン上にあるかを気にせずに別のJSプロセスにメッセージを送信できる組み込みのメカニズムはありませんが、それは最下位レベルのErlangに組み込まれています。問題が複数のマシンを必要とするほど大きくない場合、または複数の協調プロセスを必要としない場合、この利点は問題にならない可能性が高いため、無視する必要があります。

アーランは確かに飛び込む深いプールです。Webアプリの構築を開始する前に、まずスタンドアロンの関数型プログラムを作成することをお勧めします。Javascriptに慣れているように見えるので、さらに簡単な最初のステップは、より機能的なスタイルでJSをプログラミングすることです。jQueryまたはPrototypeを使用している場合は、すでにこのパスを開始しています。Erlangまたはその同類の1つ(Haskell、F#、Scala ...)の純粋な関数型プログラミングと関数型JSの間でバウンスしてみてください。

関数型プログラミングに慣れたら、多くのErlangWebフレームワークの1つを探してください。inetsこの後期段階のように、アプリを低レベルのものに直接書き込むべきではないでしょう。たとえば、窒素のようなものを見てください。


「Erlangはデータセンター全体に対応する」という点には、考慮すべき非常に重要な問題があることはよく言われません(セキュリティは大きな問題です)。ここでこれに関する章をチェックしてください:learnyousomeerlang.com/distribunomicon
jocull

9

私は個人的にErlangに行きますが、JavaScriptに対して少し偏見があることを認めます。私のアドバイスは、いくつかの点を評価することです。

  1. これらの言語のいずれかで既存のコードを再利用していますか(ソースコードとプログラマーの経験の両方の観点から!)
  2. アプリケーションを停止せずにオンザフライで更新する必要がありますか(これはErlangがデフォルトで勝つ場所です-そのランタイムはその場合のために設計されており、OTPには必要なすべてのツールが含まれています)
  3. 帯域幅ではなく、個別の同時操作の観点から、予想されるトラフィックはどのくらいですか?
  4. 各リクエストに対して行う操作はどの程度「並列」ですか。

Erlangは本当に微調整された並行性とネットワーク透過型の並列分散システムを持っています。プロジェクトが正確に何であるかに応じて、そのようなシステムの成熟した実装の可用性は、新しい言語の学習に関する問題を上回る可能性があります。使用できるErlangVMで動作する他の2つの言語、Ruby / PythonのようなReiaLisp-FlavoredErlangもあります。

さらに別のオプションは、特にErlangが一種の「ハブ」として使用されている場合に両方を使用することです。Node.jsにForeignFunction Interfaceシステムがあるかどうかはわかりませんが、ある場合、Erlangには、他のErlangプロセスと同じようにシステムとインターフェイスするための外部プロセス用のCライブラリがあります。


ドキュメントによると、Node.jsは外部アドオンにCとC ++を活用できます。nodejs.org/docs/v0.3.1/api/addons.html
Evan Plaice

Reiaが亡くなったように見えますが、代わりにエリクサーがあります... GroovyとJavaを思い出させます。ここではElixirとErlangになります。
stommepoes 2012年

@ EvanPlaice-それは私にあまり感銘を与えません。問題は、基本的に問題のあるものをC ++でコーディングし、それらを組み込みとして追加することです。実際に行っているのはエミュレーターの拡張であるFFIの多くはありません。(わかりました、個人的な好み;))erlangの場合に言及された外部ライブラリは、ノードとして表示される、または開いているポートを介して通信する他の言語で非同期プロセスを作成することです(構造化データを使用した双方向パイプを考えてください)。これらはすべて、非同期動作モードにうまく適合します。NIFもあります。これは基本的にNode.jsにあるものですが、お勧めしません。
p_l 2012年

1
@p_l私が理解していることから、ノードのアプローチは少し異なります。ノードは非同期IO呼び出し(つまりWeb要求)の処理に非常に優れていますが、シングルスレッド環境で実行されます。したがって、ディスパッチは得意ですが、CPUを集中的に使用する処理は得意ではありません。その根拠をカバーするために、ネイティブC / C ++コードを実行する別のプロセス/スレッドをフォークすることができます。非同期IO呼び出し(IPC |双方向パイプなど)だけを実行している場合、node.jsは負荷を処理できるはずです。同期呼び出しの待機に多くの時間を費やすようにコーディングされていない限り。
Evan Plaice 2012年

5

Erlangは、比較的ローエンドのサーバー(512MB4コア2.4GHzAMD VM)での展開に適しているようです。これは、仮想ホワイトボードサーバーアプリケーションのErlangとNode.jsの実装を比較したSyncPadの経験によるものです。


2
はい、node.jsには厄介なメモリリークの問題があるようです。Nodeはかなり新しく実験的であり、JavaScriptもV8エンジンもそのようなサーバーシナリオ用に設計されていません。一方、Erlangはそのためにボトムアップで設計されており、洗練されて成熟するまでに何年もかかりました。
ロルフ

2
そのリンクは死んだようだが、ここではWayBackMachineにあるweb.archive.org/web/20120902014555/http://blog.mysyncpad.com/...
jocull



0

ノードよりもErlangを優先します。並行性が必要な場合は、プロセスが軽量であるため、NodeをErlangまたはGolangに置き換えることができます。

アーランは習得が容易ではないため、多くの努力が必要ですが、そのコミュニティは活発であり、そこから助けを得ることができます。これが、人々がノードを好む理由にすぎません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.