Node.Js в стиле Erlang? - PullRequest
       65

Node.Js в стиле Erlang?

6 голосов
/ 14 декабря 2010

Я полный нуб, когда дело доходит до Node.Js и Erlang.Но разве невозможно создать приложение Node.js, которое имитирует поведение Эрланга?

Например, вы передаете сообщения json через распределенный серверный парк node.js и даже передаете новый код на эти серверы без использованияв автономном режиме, как и erlang.

Если у вас есть обратный вызов обработчика сообщений, который активируется при получении сообщения, тогда этот обработчик сообщений может проверить, является ли сообщение сообщением обновления кода, и, таким образом, заменить себя (текущий обработчик).) с новым кодом.

Так что должно быть возможно иметь серверы Node.Js без простоев для обновления кода без чрезмерной суеты, верно?

Ответы [ 4 ]

5 голосов
/ 14 декабря 2010

Не совсем верно.

  1. Да, вы можете распространять сообщения JSON
  2. Часть с горячей заменой кода немного сложнее, позвольте мне объяснить ...

Хорошо, во-первых, вам, очевидно, нужно провести валидацию и т. Д., Это не должно быть большой проблемой. Первая небольшая проблема возникает из-за JSON, который не допускает никакого кода / функций JS, поэтому вы можете обойти это, отправив данные в виде строки.

Следующая проблема, когда вы хотите заменить функцию / метод, вам нужно убедиться, что она сохраняет свою область видимости, чтобы вновь скомпилированные функции имели доступ к тем же вещам.

С некоторой темной магией eval это определенно возможно , но не ожидайте, что она будет настолько же естественной, как в Эрланге:

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% случаев и областей применения. Кроме того, синтаксис ужасен, поэтому я хотел бы предложить, если вы хотите горячую замену, оставайтесь с Эрлангом.

Помните: Правильный инструмент для правильной работы.

Обновление
Там не будет ничего лучше, чем в ближайшем будущем, см .:
https://github.com/ry/node/issues/issue/46#issue/46/comment/610779

2 голосов
/ 14 декабря 2010

Вот блог, сравнивающий опыт использования 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

1 голос
/ 15 декабря 2010

У меня недостаточно очков, чтобы комментировать, но я хотел ответить на комментарий Иво Ветцеля выше на посту rvirding. На mysyncpad есть обновленный блог, где автор использует версию nodejs, специально рекомендованную разработчиками nodejs и v8.

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

0 голосов
/ 14 декабря 2010

Я предполагаю, что с модулем сценария вы можете выполнить JavaScript без перезагрузки сервера.

руководитель

Небольшой скрипт-супервизор для nodejs. Он запускает вашу программу и следит за изменения кода, так что вы можете иметь горячий код перегрузка, без беспокоиться о утечках памяти и делать уверен, что вы очистите все межмодуль ссылки, и без совершенно нового требуется система.

Но затем он снова перезагрузится (очень короткое время в автономном режиме), когда обнаружит изменения файла.

...