Чим система Node.js з парною відрізняється від акторської картини Akka?


93

Я Node.jsтрохи працював із ним і вважаю себе досить хорошою з Java. Але я щойно виявив Akkaі одразу зацікавився його акторським малюнком (з того, що я розумію).

Тепер, припускаючи, що мої навички JavaScript були нарівні з моїми навичками Scala / Java, я хочу зосередити увагу на практичності будь-якої системи. Особливо з точки зору веб-сервісів.

Як я зрозумів, Node чудово справляється з багатьма одночасними операціями. Я думаю, що хороший веб-сервіс Node для системи управління активами буде чудовим при обробці багатьох користувачів, які одночасно надсилають зміни (у великому, великому додатку до трафіку).

Але після прочитання про акторів в Акці це здається, що це буде вищим за те саме. І мені подобається ідея зменшити роботу до шматочків, що кусаються. Крім того, роки тому я посварився в Ерланге і закохався в систему передачі повідомлень, яку він використовує.

Я працюю над багатьма програмами, які мають справу зі складною бізнес-логікою, і я думаю, що настав час перейти важче в ту чи іншу. Особливо оновлення застарілих Struts та додатків C #.

У будь-якому випадку, уникаючи святих воєн, чим дві системи принципово відрізняються? Здається, обидва спрямовані на одну і ту ж мету. Можливо, архітектура «самолікування» Акки має перевагу.

EDIT

Схоже, я наближаюся до голосів. Будь ласка, не сприймайте це питання як "що краще, вузол чи акка?". Що я шукаю, - це принципові відмінності в бібліотеках, керованих подіями, як Node та заснованих на акторах, таких як Akka.


12
я проголосував за те, щоб сказати "йди геть" усім близьким виборцям :)
Неррв

@cbmeeks Чи можу я запитати, що ти вибрав і як ти йдеш із твоїм вибором?
Яс

Відповіді:


64

Не вдаючись до деталей (про яких я знаю занадто мало у випадку Node.js), головна відмінність полягає в тому, що Node.js підтримує лише паралельність без паралелізму, тоді як Akka підтримує обоє. Обидві системи повністю керовані подіями і можуть масштабуватися до великих навантажень на роботі, але відсутність паралелізму ускладнює Node.js (тобто паралелізм явно кодується за допомогою запуску декількох вузлів і відповідного диспетчеризації запитів; тому він нестійкий під час виконання) , в той час як в Akka це досить просто завдяки його регульованим багатопотоковим виконавцям. Враховуючи невеликі поодинокі одиниці роботи (виклики актора), Акка автоматично паралельно виконує виконання для вас.

Ще одна відмінність важливості полягає в тому, що Akka включає систему для управління несправностями структуровано (шляхом контролю за кожним актором його батьком, що є обов'язковим), тоді як Node.js покладається на умови, що автори передають умови помилок від зворотного дзвінка до зворотного дзвінка. Основна проблема полягає в тому, що асинхронні системи не можуть використовувати стандартний підхід винятків, використовуваних синхронними системами на основі стека, оскільки код "виклику" перейде на різні завдання до моменту виникнення помилки зворотного виклику. Вбудована в систему поводження з помилками робить більше ймовірним, що додатки, побудовані на цій системі, є надійними.

Наведене не означає вичерпного, я впевнений, що різниць набагато більше.


1
Чи вважаєте ви, що найкращим способом використовувати PLAY-FRAMEWORK або SPRAY, якщо я вирішу використовувати AKKA для створення спокійних веб-додатків?
SES

3
Так, обидва - хороший вибір. Гра підходить як рамка, яка дає вам повністю інтегрований досвід розробки, але це означає, що Play буде працювати з вашою програмою. Спрей краще, якщо ви хочете, щоб у вашій програмі Akka був просто вбудований тонкий шар REST. Зверніть увагу, що спрей стане akka-http у найближчі місяці.
Роланд Кун

2
А також, щоб зазначити, ви отримуєте всю користь статично набраної мови за допомогою Scala / Java та без зворотного дзвінка в JavaScript. Java / Scala було б простіше налагодити, ніж JavaScript.
Chirdeep Tomar

2
З точки зору паралелізму з вузлом слід зазначити, що ви можете розщедрити процеси під час виконання за допомогою API його ядра кластера . Це зробить те, що ви маєте на увазі під паралельними акторами.
ядро

2
Мені здається, ця відповідь від 2012 року дуже датується, оскільки багато з них змінилися, особливо з Node з тих пір. Подивіться на npmjs.com/package/webworker-threads веб-працівників у Node, ви можете перенести блокування інтенсивної роботи на паралельний процес (все, перебуваючи в тому ж самому вузлі).
Марк Пешак - Trilon.io

8

Я ще не використовував Akka, але, здається, він схожий на ерланг, але в Java. Насправді всі процеси схожі на акторів в Akka, у них є поштові скриньки, ви можете надсилати повідомлення між ними, у вас є керівники тощо.

Node.js використовує спільну сумісність. Це означає, що у вас є сумісність, коли ви це дозволяєте (наприклад, коли ви викликаєте операцію io або якусь асинхронну подію). Коли у вас є тривала робота (обчислення чогось у довгому циклі), цілі системні блоки.

Ерланг використовує попереджувальну комутацію завдань. Коли у вас довгий цикл, система може призупинити його для запуску іншої операції та продовжити через деякий час. Для великої одночасності Node.js добре, якщо ви робите лише короткі операції. Обидва підтримують мільйони клієнтів: http://blog.caustik.com/2012/08/19/node-js-w1m-concurrent-connections/ http://blog.whatsapp.com/index.php/2012/01/ 1 мільйон - це так 2011 рік /

У Java вам потрібні нитки, щоб зробити будь-яку сумісність, інакше ви не можете призупинити виконання всередині функції, яка виконує erlang (насправді erlang робить паузу між викликами функцій, але це має всі функції). Ви можете призупинити виконання між повідомленнями.


Гаразд, тому припускаючи, що мені потрібно записувати файли журналів з багатьох різних джерел. Кожен раз, коли програма генерує запис у журналі, мені також потрібно надсилати цей запис до іншої програми для запису. Я припускаю, що це може бути тривалим процесом, оскільки у додатку можуть бути очікування часу, помилки http тощо. Отже, у цьому прикладі зависання письмово до БД спричинить зависання всієї моєї системи Node? Чи зазнаватиме АККА те саме питання чи я просто не отримую кореляцію?
cbmeeks

1
Жоден з них не постраждає, оскільки доступ до db зазвичай реалізується як асинхронний у таких випадках. Але якби вам якось вдалося зробити так, щоб синхронна бібліотека робила це, вони обоє заморожуються.
yetihehe

Дякую. Я дуже намагаюся не перетворювати це на node vs akkaдискусію, але у мене є справжня проблема, яку мені потрібно вирішити. Я б сказав, що мої навички Java / JavaScript досить близькі, але у мене дуже мало досвіду роботи з Node і жодного з AKKA (або Scala). Але у мене є декілька додатків (внутрішніх на даний момент, але зовнішніх пізніше), і люди шукають способів пошуку цих масивних журналів. Неможливо використовувати зовнішні параметри сторонніх розробників через проблеми конфіденційності. Здається, що або впорався б із роботою. Але мені подобається, що повідомлення AKKA передається, щоб я міг це вивчити. Плюс Java висувається тут більше, ніж JS. Дякую.
cbmeeks

Якщо вам потрібен пошук масивних журналів, спробуйте переглянути logstash або greylog2.
Тоддіус Жо

6

Я не впевнений, що це справедливе порівняння. Я читав це більше як "як система, що базується на рівній основі, порівнюється з акторською моделлю?". Nodejs може підтримувати модель актора так само, як Скала в Акці, або C # в Орлеані, насправді перевіряйте нактора , хтось, здається, вже намагається це зробити.

Щодо того, як порівнюють парні системи та моделі акторів, я б дозволю мудрішим людям описати це. Кілька коротких моментів про модель Актора:

  • Акторська модель заснована на повідомленні
  • Моделі акторів, як правило, добре поєднуються з розподіленими системами (кластерами). Впевнені системи на основі подій можуть бути розповсюджені, але я думаю, що модель актора має вбудовану дистрибуцію щодо розподілу обчислень. Новий запит може бути перенаправлений до нового актора в іншому силосі, не впевнений, як це буде працювати у випадку подій.
  • Модель Actor підтримує невдачу в тому, що, якщо прискорене зменшення апеляцій кластера 1, спостерігач, як правило, може знайти інший силос для виконання роботи

Також перевірити драму . Це ще одна реалізація моделі актора nodejs.


1
спробуйте налаштувати кластер з nodejs, вам потрібні докер, kubernetees та створити розподілену систему. Також спробуйте налаштувати використання ще 1 ядра в nodejs. Акке хочеться з цим боротися. також зрілість самих nodejs, безпека та спосіб кодування, що вимагає іншого фреймворку, щоб зробити щось, - це те, що nodejs сам по собі не може бути використаний для великої розподіленої системи, а лише принаймні в режимі MSA. Моя думка все одно.
Раффаелло
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.