【问题标题】:Node.Js in Erlang style?Erlang 风格的 Node.Js?
【发布时间】:2010-12-14 09:25:16
【问题描述】:

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

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

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

所以应该有可能让 Node.Js 服务器无需停机进行代码更新而无需大惊小怪,对吧?

【问题讨论】:

  • 我无法谈论代码更新,但我刚刚发现 a Node library 仿照 Erlang 的 OTP 主管。
  • 嗯。在4年前。我有点喜欢这个主意。

标签: erlang node.js message-passing robustness


【解决方案1】:

不完全正确。

  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

【讨论】:

    【解决方案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

    【讨论】:

    • 说实话,这个帖子非常具有误导性,首先没有提到他使用的是哪个版本的 Node.js。众所周知,2.x 在将字符串推送到套接字时存在大量问题(正如他所做的那样),并且在 V8 中使用 JSON 编码/解码时存在一些错误。字符串问题在较新的 3.x 版本中已修复。
    【解决方案3】:

    没有足够的积分来内联评论,但我想在 rvirding 的帖子中回复 Ivo Wetzel 的上述评论。 mysyncpad上有更新的博客,作者使用的是nodejs和v8开发者特别推荐的nodejs版本。

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

    【讨论】:

      【解决方案4】:

      我假设使用script module 你可以在不重新加载服务器的情况下执行 javascript。

      supervisor

      nodejs 的一个小主管脚本。 它运行你的程序,并监视 代码更改,因此您可以拥有热代码 重新加载行为,没有 担心内存泄漏和 确保你清理了所有的模块间 参考文献,并且没有全新的 需要系统。

      但是当它检测到文件更改时,它会再次重新加载(非常短的离线时间)。

      【讨论】:

      • 使用 Erlang 风格的消息,您可以热交换而无需重新加载任何内容。你甚至可以在激活新的消息循环之前转换本地状态
      • 我在谷歌搜索时也发现了这个 => romeda.org/blog/2010/01/hot-code-loading-in-nodejs.html。但也相信 ryan 想把它放在代码库中(但他又是一个忙碌的人)。但是现在我不相信它和 erlang 一样先进?
      • 我检查过了,这不是保存模块状态,所以你可以用它来修补静态、无状态的实用程序。
      猜你喜欢
      • 1970-01-01
      • 2010-09-06
      • 1970-01-01
      • 2012-04-14
      • 1970-01-01
      • 2011-01-06
      • 2011-04-30
      • 2021-08-27
      • 2011-03-01
      相关资源
      最近更新 更多