Node.js або Erlang


86

Мені дуже подобаються ці інструменти, коли йдеться про рівень паралельності, з яким він може обробляти.

Erlang / OTP виглядає набагато стабільнішим рішенням, але вимагає набагато більше навчання та багато занурень у функціональну мовну парадигму. І схоже на те, що Erlang / OTP значно покращує роботу з багатоядерними процесорами (виправте мене, якщо я помиляюся).

Але що мені вибрати? Який з них кращий у короткостроковій та довгостроковій перспективі?

Моя мета - навчитись інструменту, який полегшує масштабування моїх веб-проектів під великим навантаженням, ніж традиційні мови.


Ви можете використовувати JavaScript як функціональну мову на сайті underscorejs.org
Тодд Мойсей

2
@ToddMoses ти впевнений, що прокоментував правильне запитання?
Флавієн Фолькен

Яблука та апельсини. Node.JS (за своєю суттю) є libevent (C) + взаємодія Javascript. Erlang - це цілком власна реалізація вводу-виводу. Node.JS створений для однопотокових програм. Ваша делема - ви хочете отримати роботу у Facebook / Google, або ви хочете зробити програмне забезпечення kickass.
Vans S

Відповіді:


87

Я спробував би Ерлангу. Незважаючи на те, що це буде крутіша крива навчання, ви отримаєте від цього більше, оскільки вивчатимете функціональну мову програмування. Окрім того, оскільки Erlang спеціально розроблений для створення надійних, одночасно працюючих систем, ви одночасно дізнаєтесь про створення високо масштабованих служб.


10
Я не думаю, що Erlang трохи складніший за Javascript. У Erlang немає жодного типу успадкування, тому ви завжди впевнені, яку функцію ви викликаєте. У Erlang немає неявного перетворення типів, тому ви завжди впевнені, які типи даних використовуєте. Немає руйнівного призначення, тому ви завжди впевнені, що у вас не буде зламаний якийсь старий шматок коду, оскільки якийсь новий код у зворотному виклику змінив ваш внутрішній стан.
Дмитро Бєляєв

51

Я не можу говорити за Ерланга, але кілька речей, про які не згадувалося про вузол:

  • Node використовує механізм V8 від Google, щоб фактично скомпілювати javascript у машинний код. Отже, вузол насправді досить швидкий. Тож це на додаток до переваг швидкості, які пропонують керовані подіями програмування та неблокуючий io.
  • Node має досить активну спільноту. Зайдіть до їхньої групи IRC на freenode, і ви зрозумієте, що я маю на увазі
  • Я помітив, що вищезазначені коментарі наполягають на тому, що Ерланг був корисним для вивчення мови функціонального програмування. Незважаючи на те, що я погоджуюсь, важливо розширити свій набір навичок і взяти одного з них під свій пояс, ви не повинні базувати проект на тому, що ви хочете вивчити новий стиль програмування
  • З іншого боку, Javascript вже є такою парадигмою, в якій вам комфортно писати! Плюс це javascript, тому, коли ви пишете код на стороні клієнта, він буде виглядати і виглядати послідовно.
  • Спільнота node вже викачала тонни модулів ! Є модулі для redis, mongodb, couch, і що у вас. Ще один хороший модуль для вивчення - Express (думаю, Sinatra для node)

Перегляньте відео у блозі yahoo Райана Даля, хлопця, який фактично написав node. Я думаю, це допоможе вам краще зрозуміти, де знаходиться вузол і куди він рухається.

Майте на увазі, що вузол все ще перебуває на пізніх стадіях розробки, і тому зазнав чимало змін - змін, які зламали попередній код. Однак, мовляв, це в момент, коли можна очікувати, що API не зміниться набагато більше. Тож якщо ви шукаєте щось цікаве, я б сказав, що node - чудовий вибір.


26
Я думаю, що движок V8 компілює JavaScript для машинного коду, а не для складання.
Йонас,

10
Стільки роботи над Javascript не робить мову навіть трохи придатною для вирішення складних проблем. Сама мова жахлива з усіма тими особливими випадками перетворення типів. І стиль зворотного виклику, коли змінні змінюються в сотнях різних місць, і біс на пошуки місця, де відбулося якесь призначення.
Дмитро Бєляєв

15

Я давній програміст Erlang, і це запитання спонукало мене заглянути на node.js. Це виглядає до біса добре.

Здається, вам потрібно створити кілька процесів, щоб скористатися перевагами кількох ядер. Однак я не бачу нічого про встановлення спорідненості процесора. Ви можете використовувати набір завдань на Linux, але, мабуть, його слід параметризувати та встановити в програмі.

Я також помітив, що підтримка платформи може бути трохи слабшою. Зокрема, схоже, вам потрібно буде запустити систему Cygwin для підтримки Windows.

Хоча виглядає добре.


Редагувати

Node.js тепер має вбудовану підтримку Windows.


5
Ця відповідь трохи стара. Зараз Node є крос-платформним, не потрібно мати Cygwin для Windows. А Node має вбудовану підтримку кластеризації на одній машині, спільно використовуючи сокети TCP.
Farid Nouri Neshat

9

Я розглядаю ті самі дві альтернативи, якими ви є, для багатьох проектів.

На сьогодні найкраща бритва, яку я придумав, щоб вирішити між ними для даного проекту, - чи потрібно мені використовувати Javascript. Одна існуюча система, яку я хочу перенести, вже написана в Javascript, тому її наступна версія, швидше за все, буде зроблена в node.js. Інші проекти будуть виконуватися в якійсь веб-структурі Erlang, оскільки не існує існуючої бази коду для міграції.

Інша думка полягає в тому, що Erlang масштабується далеко за межі кількох ядер, він може масштабуватися до цілого центру обробки даних. Я не бачу вбудованого механізму в node.js, який дозволяє мені надсилати повідомлення іншому процесу JS, не дбаючи про те, на якій машині він знаходиться, але це вбудовано прямо в Erlang на найнижчих рівнях. Якщо ваша проблема недостатньо велика, щоб потребувати декількох машин, або якщо вона не вимагає кількох взаємодіючих процесів, ця перевага, швидше за все, не матиме значення, тому вам слід її ігнорувати.

Ерланг - справді глибокий басейн, в який можна зануритися. Я б запропонував спершу написати самостійну функціональну програму, перш ніж починати створювати веб-програми. Ще простішим першим кроком, оскільки вам здається, що вам комфортно з Javascript, є спробувати програмувати JS у більш функціональному стилі. Якщо ви використовуєте jQuery або Prototype, ви вже почали цей шлях. Спробуйте підстрибнути між чистим функціональним програмуванням в Erlang або одним із його родичів (Haskell, F #, Scala ...) та функціональним JS.

Після того, як ви почуєтесь з функціональним програмуванням, знайдіть одну з багатьох веб-платформ Erlang; ви, мабуть, не повинні писати свій додаток безпосередньо на щось низькорівневе, як inetsна цьому пізньому етапі. Наприклад, подивіться на щось на зразок азоту .


Часто не згадується, що точка "Ерланг масштабується до цілого центру обробки даних" має врахувати кілька дуже важливих проблем (безпека є великою). Перегляньте розділ про це тут: Learnyousomeerlang.com/distribunomicon
jocull

9

Незважаючи на те, що я особисто піду за Erlang, я визнаю, що я трохи упереджений до JavaScript. Моя порада полягає в тому, що ви оцінюєте кілька пунктів:

  1. Ви повторно використовуєте існуючий код на будь-якій із цих мов (як з точки зору вихідного коду, так і досвіду програміста!)
  2. Вам потрібні / потрібні оновлення на льоту, не зупиняючи програму (Тут Erlang виграє за замовчуванням - час її роботи був розроблений саме для цього випадку, а OTP містить усі необхідні інструменти)
  3. Наскільки великий очікуваний трафік з точки зору окремих, одночасних операцій, а не пропускної здатності?
  4. Наскільки паралельними є операції, які ви виконуєте для кожного запиту?

Erlang має справді відрегульовану паралельну та прозору паралельно розподілену систему, що забезпечує паралельність та мережу. Залежно від того, що саме являє собою проект, доступність зрілої реалізації такої системи може переважати будь-які питання щодо вивчення нової мови. Є також дві інші мови, які працюють на Erlang VM, якими ви можете скористатися - Rubia / Python-подібний Reia та Erlang із смаком Lisp .

Ще одним варіантом є використання обох, особливо з тим, що Ерланг використовується як свого роду "хаб". Я не впевнений, чи має Node.js систему зовнішнього функціонального інтерфейсу, але якщо вона є, у Erlang є бібліотека C для зовнішніх процесів для взаємодії з системою, як і будь-який інший процес Erlang.


Згідно з документами, Node.js може використовувати C і C ++ для зовнішніх аддонів. nodejs.org/docs/v0.3.1/api/addons.html
Еван Плейс,

Схоже, Рейя померла, але на її місці еліксир ... він нагадує мені про Groovy та Java; тут це були б Еліксир та Ерланг.
stommepoes

@EvanPlaice - Це мене не дуже вражає. Справа в тому, що ви в основному кодуєте проблематичну річ на C ++ і додаєте їх як вбудовані. Не так багато FFI - це те, що ви насправді робите, розширюючи емулятор. (Гаразд, особисті уподобання;)) Згадана зовнішня бібліотека на випадок erlang полягає у створенні асинхронних процесів іншими мовами, які відображаються як вузли АБО, що розмовляють через відкритий порт (думайте про двонаправлену трубу зі структурованими даними). Все це чудово вписується в асинхронний режим роботи. Існують також NIF-файли, що є, по суті, тим, що Node.js має, але не рекомендується.
p_l

1
@p_l Від того, що я розумію, підхід до вузлів дещо відрізняється. Хоча вузол дуже добре обробляє асинхронні виклики вводу-виводу (тобто веб-запити), він працює в однопотоковому середовищі. Тож він чудово підходить для диспетчеризації, але не дуже хороший у процесорі, що вимагає інтенсивного використання процесора. Щоб покрити цю землю, ви можете відмовитися від іншого процесу / потоку, який запускає власний код C / C ++. Якщо все, що ви робите, - це асинхронні виклики вводу-виводу (колишні IPC | двонаправлені труби), тоді node.js повинен мати можливість обробляти навантаження. Поки не закодовано витрачати багато часу на очікування синхронних дзвінків.
Еван Плейс

5

Схоже, Erlang працює ефективніше для розгортання на відносно низькому рівні сервера (512 Мб 4-ядерний AMD VM на 2,4 ГГц). Це випливає з досвіду SyncPad порівняння реалізацій Erlang та Node.js їх віртуальної серверної програми на дошці.


2
Так, схоже, у node.js є неприємна проблема витоку пам'яті. Node є досить новим та експериментальним, і ні JavaScript, ні движок V8 не були розроблені для таких сценаріїв сервера. Ерланг, з іншого боку, був розроблений саме для цього знизу вгору і мав багато років на вдосконалення та дозрівання.
Рольф

2
Це посилання здається мертвим, але ось воно на WayBackMachine web.archive.org/web/20120902014555/http://blog.mysyncpad.com/…
jocull

4

Існує ще одна мова на тій самій віртуальній машині, якою є erlang -> Elixir

Це дуже цікава альтернатива Ерлангу, перевірте цю.

Також у нього є швидкозростаючий веб-фреймворк, заснований на ньому-> Phoenix Framework



0

Я віддаю перевагу Erlang перед Node. Якщо вам потрібна паралельність, Node можна замінити Erlang або Golang через їх легкі процеси.

Ерланг непростий у вивченні, тому вимагає великих зусиль, але його спільнота активна, тому з цим можна отримати допомогу, це лише причина, чому люди віддають перевагу Node.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.