Node.Js в стиле Erlang?

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

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

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

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


person Roger Johansson    schedule 14.12.2010    source источник
comment
Я не могу говорить об обновлениях кода, но я только что нашел библиотеку Node, созданную по образцу OTP-супервизора Erlang.   -  person David Braun    schedule 20.09.2013
comment
Хм. 4 года назад. Мне нравится эта идея.   -  person Montagist    schedule 01.04.2014


Ответы (4)


Не совсем правильно.

  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

person Ivo Wetzel    schedule 14.12.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

person rvirding    schedule 14.12.2010
comment
Честно говоря, этот пост вводит в заблуждение, во-первых, в нем не упоминается, какую версию Node.js он использовал. Широко известно, что у версии 2.x серьезные проблемы с отправкой строк в сокеты (именно то, что он сделал) и что в V8 есть некоторые ошибки с кодированием/декодированием JSON. Проблема со строками исправлена ​​в новых сборках 3.x. - person Ivo Wetzel; 14.12.2010

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

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

person mwt    schedule 15.12.2010

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

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

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

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

person Alfred    schedule 14.12.2010
comment
С сообщениями в стиле Erlang вы можете выполнять горячую замену без перезагрузки чего-либо. вы даже можете преобразовать локальное состояние перед активацией нового цикла сообщений - person Roger Johansson; 14.12.2010
comment
Я также нашел это, когда гуглил =› romeda.org/ blog/2010/01/hot-code-loading-in-nodejs.html. Но также поверьте, что Райан хочет поместить это в кодовую базу (но опять же, он занятой человек). но пока я не верю, что он такой же продвинутый, как erlang? - person Alfred; 14.12.2010
comment
Я проверил это, это не сохраняет состояние модуля, поэтому все, для чего вы можете использовать его, - это исправление статических утилит без сохранения состояния. - person Ivo Wetzel; 14.12.2010