Node.js与Akka的actor模式有什么不同?

我已经和Node.js一起工作了一段时间,认为自己对Java很好。 但是我刚刚发现了Akka ,并立即对其演员模式感兴趣(据我所知)。

现在,假设我的JavaScript技能与我的Scala / Java技能相当,我想把重点放在两个系统的实用性上。 特别是在Web服务方面。

我的理解是,Node在处理许多并发操作方面非常出色。 我想象一下,一个好的Node资源pipe理系统的Web服务在处理很多用户同时提交更改(在一个大型的,大stream量的应用程序中)方面会很出色。

但是在阅读完Akka的演员之后,它会觉得它会在同样的事情上performance出色。 我喜欢把工作减less到一口大小的想法。 此外,多年前我涉足Erlang,并爱上了它所使用的消息传递系统。

我在处理复杂业务逻辑的许多应用程序上工作,我认为是时候跳入一个或另一个。 尤其是升级传统的Struts和C#应用程序。

无论如何,避免圣战,这两个体系有什么根本的不同呢? 看起来两者都是为了同一个目标。 也许Akka的“自我修复”架构具有优势。

编辑

看起来我正在接近选票。 请不要把这个问题当作“哪个更好,节点还是阿卡?”。 我正在寻找的是像Node这样的基于事件驱动的库和Akka等基于actor的基本差异。

没有深入细节(关于Node.js我知道得太less),主要区别在于Node.js只支持没有并行性的并发,而Akka支持并发。 这两个系统都是完全事件驱动的,可以扩展到较大的工作负载,但缺乏并行性会使Node.js变得困难(也就是说,通过启动多个节点并相应地调度请求来明确编码并行性;因此在运行时是不灵活的) ,而Akka则因其可调式multithreading执行程序而非常简单。 鉴于小型孤立的工作单元(演员调用),Akka将自动并行执行。

另一个重要的区别是Akka包含了一个系统来处理失败的结构化方式(通过让每个actor受其父代监督),而Node.js依赖于作者的约定将错误条件从callback传递到callback。 根本的问题是,asynchronous系统不能使用基于同步堆栈的系统所采用的标准的exception方法,因为在callback的错误发生时,“调用”代码将会转移到不同的任务上。 系统内置故障处理function使得构build在该系统上的应用程序更加可靠。

以上并不意味着详尽无遗,我相信有更多的差异。

我还没有使用Akka,但它似乎是Erlang,但在Java中。 在erlang中,所有进程都像Akka中的angular色,他们有邮箱,可以在他们之间发送消息,你有主pipe等。

Node.js使用协同并发。 这意味着当你允许的时候你有并发(例如当你调用io操作或者一些asynchronous事件时)。 当你有一些长时间的操作(计算长循环中的东西)整个系统块。

Erlang使用抢占式任务切换。 当你有很长的循环,系统可以暂停它来运行其他操作,并在一段时间后继续。 对于大规模并发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暂停,但是这与所有函数有关)。 您可以暂停消息之间的执行。

我不确定这是一个公平的比较绘制。 我更多地把它看作是“一个基于平衡的系统如何与一个演员模型进行比较?”。 Nodejs可以像Scala在Akka中一样支持一个actor模型,或者在Orleans中支持C#,实际上可以检查nactor ,有人看起来已经在尝试它了。

至于如何比较系统模型与演员模型,我会让更聪明的人来描述它。 关于Actor模型的几点简要介绍:

  • Actor模型是基于消息的
  • Actor模型往往适用于分布式系统(集群)。 当然,基于事件的系统可以被分配,但是我认为这个actor模型在分配计算方面有内置的分布。 一个新的请求可以路由到一个新的演员在不同的筒仓,不知道这将如何在基于事件的工作。
  • Actor模型支持的失败在于,如果嗨群集1下降,观察者通常可以find一个不同的筒仓来完成工作

另外,看看戏 。 这是另一个nodejs actor模型的实现。