7

对于 Node.Js 和 Erlang,我完全是个菜鸟。但是是否有可能构建一个模拟 Erlang 行为的 Node.js 应用程序?

例如,您通过分布式 node.js 服务器公园传递 json 消息,甚至将新代码传递到那些不离线的服务器,就像 erlang 一样。

如果您有一个在收到消息时激活的消息处理程序回调,则此消息处理程序可以检查该消息是否是代码更新消息,从而将其自身(当前处理程序)替换为新代码。

所以应该有可能让 Node.Js 服务器没有停机时间来进行代码更新而不必大惊小怪,对吧?

4

4 回答 4

5

不完全正确。

  1. 是的,您可以分发 JSON 消息
  2. 热代码替换的部分有点复杂,让我解释一下......

好的,首先您显然需要进行验证等,这应该不是一个大问题。第一个小问题来自 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 的帖子中回复 Ivo Wetzel 的评论。在 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 回答