Как Node.js система событий отличается от шаблона актера Akka?

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

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

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

Но после прочтения об актерах в Акке, это швы, это будет превосходить то же самое. И мне нравится идея сократить работу до кусков размера. Кроме того, несколько лет назад я баловался в Эрланге и влюбился в систему передачи сообщений, которую он использовал.

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

В любом случае, избегая священных войн, как две системы принципиально отличаются? Кажется, оба направлены на достижение одной и той же цели. Возможно, что у Akka "самовосстанавливающаяся" архитектура имеет преимущество.

ИЗМЕНИТЬ

Похоже, я получаю близкие голоса. Пожалуйста, не принимайте этот вопрос как "который лучше, Node или akka?". Я ищу основные различия в библиотеках, управляемых событиями, таких как Node и актерах, таких как Akka.

Ответ 1

Не вдаваясь в подробности (о которых я мало знаю в случае Node.js), основное отличие состоит в том, что Node.js поддерживает только concurrency без parallelism, в то время как Akka поддерживает оба. Обе системы полностью управляются событиями и могут масштабироваться до больших рабочих нагрузок, но отсутствие parallelism затрудняет работу в Node.js(т.е. parallelism явно кодируется путем запуска нескольких узлов и отправки запросов соответственно; поэтому он негибкий во время исполнения), в то время как в Akka довольно легко благодаря перестраиваемым многопоточным исполнителям. Учитывая небольшие изолированные единицы работы (актерские призывы), Akka автоматически раскроет вам выполнение.

Еще одно существенное различие заключается в том, что Akka включает в себя систему для обработки сбоев структурированным способом (при условии, что каждый действующий субъект контролируется его родителем, что является обязательным), тогда как Node.js полагается на соглашения для авторов об отправке условий ошибки из обратный вызов обратного вызова. Основная проблема заключается в том, что асинхронные системы не могут использовать стандартный подход исключений, используемых синхронными системами на основе стека, потому что "вызывающий" код будет переходить к различным задачам к моменту возникновения ошибки обратных вызовов. Имея встроенную систему обработки ошибок, более вероятно, что приложения, построенные на этой системе, надежны.

Вышеизложенное не должно быть исчерпывающим, я уверен, что есть намного больше различий.

Ответ 2

Я еще не использовал Akka, но, похоже, это erlang-like, но в java. В erlang все процессы похожи на актеров в Акке, у них есть почтовые ящики, вы можете отправлять сообщения между ними, у вас есть супервизоры и т.д.

Node.js использует кооперативный concurrency. Это означает, что вы разрешаете concurrency (например, когда вы вызываете операцию io или какое-то асинхронное событие). Когда у вас есть длинная операция (вычисление чего-то в длинном цикле), все системные блоки.

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

В java вам нужны потоки для любого concurrency, иначе вы не сможете приостановить выполнение внутри функции, которую erlang делает (на самом деле erlang делает паузу между вызовами функций, но это происходит со всеми функциями). Вы можете приостановить выполнение сообщений.

Ответ 3

Я не уверен, что это справедливое сравнение с ничьей. Я читал это больше как "как система, основанная на событиях, сравнивается с моделью актера?". Nodejs может поддерживать актерскую модель так же, как Scala делает в Akka, или С# делает в Орлеане, фактически проверяет nactor, появляется кто-то уже попробовать.

Что касается сопоставления событийной модели с моделью актера, я бы позволил более мудрым людям описать ее. Несколько кратких примеров о модели Актера:

  • Модель актера основана на сообщениях
  • Модели актеров, как правило, преуспевают в распределенных системах (кластерах). Разумеется, системы, основанные на событиях, могут быть распределены, но я думаю, что модель актера имеет встроенный дистрибутив для распределения вычислений. Новый запрос может быть перенаправлен новому актеру в другом бункере, не уверен, как это будет работать на основе событий.
  • Модель Actor поддерживает отказ в том, что, если hey кластер 1 apperas будет недоступен, наблюдатель может вообще найти другой силос для выполнения работы.

Кроме того, проверьте drama. Это еще одна реализация модели актера nodejs.