99

我已经工作Node.js了一段时间,并认为自己对 Java 非常擅长。但我刚刚发现Akka并立即对它的演员模式感兴趣(据我了解)。

现在,假设我的 JavaScript 技能与我的 Scala/Java 技能相当,我想专注于任一系统的实用性。特别是在网络服务方面。

据我了解,Node 非常擅长处理许多并发操作。我想资产管理系统的一个好的 Node Web 服务将擅长处理同时提交更改的许多用户(在大型、高流量的应用程序中)。

但是在阅读了 Akka 中的演员之后,它似乎会在同一件事上表现出色。我喜欢将工作减少到一口大小的想法。另外,几年前我涉足 Erlang 并爱上了它使用的消息传递系统。

我从事许多处理复杂业务逻辑的应用程序,我认为是时候更深入地研究其中一个了。尤其是升级遗留的 Struts 和 C# 应用程序。

反正避免圣战,两个系统有什么本质区别?似乎两者都朝着同一个目标。也许 Akka 的“自我修复”架构具有优势。

编辑

看起来我的选票很接近。请不要将此问题视为“哪个更好,node 还是 akka?”。我正在寻找的是事件驱动库(如 Node)和基于 actor 的库(如 Akka)的根本区别。

4

3 回答 3

70

在不深入细节的情况下(我对 Node.js 知之甚少),主要区别在于 Node.js 仅支持没有并行性的并发,而 Akka 两者都支持。这两个系统都是完全事件驱动的,并且可以扩展到大的工作负载,但是在 Node.js 中缺乏并行性使得它变得困难(即并行性是通过启动多个节点并相应地分派请求来显式编码的;因此它在运行时不灵活) ,而在 Akka 中由于其可调的多线程执行程序而非常容易。给定小的独立工作单元(actor 调用),Akka 将自动为您并行执行。

另一个重要的区别是 Akka 包含一个以结构化方式处理故障的系统(通过让每个 Actor 由其父级监督,这是强制性的),而 Node.js 依赖于作者将错误条件从回调传递到回调的约定。潜在的问题是异步系统不能使用基于同步堆栈的系统所采用的标准异常方法,因为在回调错误发生时,“调用”代码将转移到不同的任务。将故障处理内置到系统中使得构建在该系统上的应用程序更有可能是健壮的。

以上内容并不详尽,我相信还有很多不同之处。

于 2012-12-16T10:10:52.557 回答
8

我还没有使用 Akka,但它似乎类似于 erlang,但在 java 中。在 erlang 中,所有进程都像 Akka 中的演员,它们有邮箱,你可以在它们之间发送消息,你有监督者等。

Node.js 使用协作并发。这意味着您在允许时具有并发性(例如,当您调用 io 操作或某些异步事件时)。当您进行一些长时间的操作(在长循环中计算某些东西)时,整个系统都会阻塞。

Erlang 使用抢先式任务切换。当您有长循环时,系统可以暂停它以运行其他操作并在一段时间后继续。对于大规模并发,如果您只执行短操作,Node.js 就很好。两者都支持数百万客户端:http: //blog.caustik.com/2012/08/19/node-js-w1m-concurrent-connections/ http://blog.whatsapp.com/index.php/2012/01/ 2011 年是 100 万/

在java中,您需要线程来执行任何并发性,否则您不能像erlang那样在函数内部暂停执行(实际上erlang在函数调用之间暂停,但这适用于所有函数)。您可以在消息之间暂停执行。

于 2012-12-15T09:49:29.433 回答
6

我不确定这是一个公平的比较。我将其更多地阅读为“基于事件的系统与参与者模型相比如何?”。Nodejs 可以支持演员模型,就像 Scala 在 Akka 中所做的那样,或者 C# 在 Orleans 中所做的那样,实际上查看nactor,似乎有人已经在尝试它了。

至于事件系统与参与者模型的比较,我会让更聪明的人来描述它。关于 Actor 模型的几点简要说明:

  • Actor模型是基于消息的
  • Actor 模型往往在分布式系统(集群)中表现良好。当然,基于事件的系统可以是分布式的,但我认为参与者模型在分布式计算方面具有内置的分布。新请求可以路由到不同筒仓中的新参与者,但不确定这在基于事件的情况下如何工作。
  • Actor 模型支持失败,如果集群 1 出现故障,观察者通常可以找到不同的筒仓来完成工作

另外,看看戏剧。这是另一个 nodejs 演员模型实现。

于 2014-04-08T17:19:04.427 回答