7

Node.JsとErlangの両方に関して、私は完全な初心者です。しかし、Erlangの動作をエミュレートするNode.jsアプリを構築することは可能ではないでしょうか?

たとえば、分散されたnode.jsサーバーパークを介してjsonメッセージを渡し、erlangのように、オフラインにせずにそれらのサーバーに新しいコードを渡すこともできます。

メッセージの受信時にアクティブ化されるメッセージハンドラコールバックがある場合、このメッセージハンドラは、メッセージがコード更新メッセージであるかどうかを確認し、それ自体(現在のハンドラ)を新しいコードに置き換えることができます。

したがって、コード更新のダウンタイムがなく、大騒ぎせずにNode.Jsサーバーを使用できるはずです。

4

4 に答える 4

5

完全に正しくありません。

  1. はい、JSONメッセージを配布できます
  2. ホットコード置換の部分はもう少し複雑です...説明させてください...

OK、最初に検証などを実施する必要がありますが、それは大きな問題ではありません。最初の小さな問題はJSONから発生しますが、JSONではJSコード/関数が許可されていません。データを文字列として送信することで、この問題を回避できます。

次の問題は、関数/メソッドを置き換える場合、新しくコンパイルされた関数が同じものにアクセスできるように、スコープが保持されていることを確認する必要があります。

いくつかのダークevalマジックでこれは確かに可能ですが、Erlangのように自然に近いとは思わないでください。

var Script = process.binding('evals').Script;

var hello = 'Hello World';
var test = 42;
function Swappable(initCode) {
    this.execute = function() {}
    this.swap = function(code) {
        this.execute = eval('func = ' + code);
    }
    this.swap(initCode);
}

// Note: Swappable's scope is limited, it won't inherit the local scope in which it was created...
var foo = new Swappable('function(){console.log(hello);return function(){console.log(test)}}')
var cb = foo.execute();
cb();

foo.swap('function(){console.log("Huh, old world?");return function(){console.log(test * test)}}');
var cb = foo.execute();
cb();
console.log(bar.execute());
foo.execute();

出力

Hello World
42
Huh, old world?
1764

これは、すべてのケースとスコープで100%機能することが保証されているわけではありません。また、構文がひどいので、ホットスワップが必要な場合は、Erlangを使用することをお勧めします。

覚えておいてください:適切な仕事のための適切なツール。

更新
近い将来、これよりも優れたものはありません
。https ://github.com/ry/node/issues/issue/46#issue/46/comment/610779を参照してください。

于 2010-12-14T10:21:14.373 に答える
2

ErlangとNode.jsを使用した経験を比較したブログは次のとおりです。

http://blog.mysyncpad.com/post/2073441622/node-js-vs-erlang-syncpads-experience

これは、意図的に速度を比較しない別の比較です。

http://jlouisramblings.blogspot.com/2010/12/differences-between-nodejs-and-erlang_14.html

于 2010-12-14T13:44:14.667 に答える
1

インラインでコメントするのに十分なポイントがありませんが、rvirdingの投稿で上記のIvoWetzelのコメントに返信したいと思います。mysyncpadに更新されたブログがあり、作成者はnodejsおよびv8開発者によって特に推奨されているバージョンのnodejsを使用しています。

http://blog.mysyncpad.com/post/2143658273/syncpad-node-js-server-revisited

于 2010-12-15T19:25:49.047 に答える
0

スクリプトモジュールを使用すると、サーバーをリロードせずにjavascriptを実行できると思います。

スーパーバイザー

nodejs用の小さなスーパーバイザースクリプト。プログラムを実行し、コードの変更を監視するため、メモリリークを心配したり、モジュール間のすべての参照をクリーンアップしたりすることなく、まったく新しいrequireシステムを使用せずに、ホットコードのリロードのような動作を行うことができます。

ただし、ファイルの変更を検出すると、再度リロードします(オフラインで非常に短時間)。

于 2010-12-14T09:59:53.120 に答える