对于 Node.Js 和 Erlang,我完全是个菜鸟。但是是否有可能构建一个模拟 Erlang 行为的 Node.js 应用程序?
例如,您通过分布式 node.js 服务器公园传递 json 消息,甚至将新代码传递到那些不离线的服务器,就像 erlang 一样。
如果您有一个在收到消息时激活的消息处理程序回调,则此消息处理程序可以检查该消息是否是代码更新消息,从而将其自身(当前处理程序)替换为新代码。
所以应该有可能让 Node.Js 服务器没有停机时间来进行代码更新而不必大惊小怪,对吧?
对于 Node.Js 和 Erlang,我完全是个菜鸟。但是是否有可能构建一个模拟 Erlang 行为的 Node.js 应用程序?
例如,您通过分布式 node.js 服务器公园传递 json 消息,甚至将新代码传递到那些不离线的服务器,就像 erlang 一样。
如果您有一个在收到消息时激活的消息处理程序回调,则此消息处理程序可以检查该消息是否是代码更新消息,从而将其自身(当前处理程序)替换为新代码。
所以应该有可能让 Node.Js 服务器没有停机时间来进行代码更新而不必大惊小怪,对吧?
不完全正确。
好的,首先您显然需要进行验证等,这应该不是一个大问题。第一个小问题来自 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
这是一个比较使用 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
没有足够的积分来在线评论,但我想在 rvirding 的帖子中回复 Ivo Wetzel 的评论。在 mysyncpad 上有一个更新的博客,其中作者使用了 nodejs 和 v8 开发人员特别推荐的 nodejs 版本。
http://blog.mysyncpad.com/post/2143658273/syncpad-node-js-server-revisited