Node.js如何使系统与Akka的演员模式不同?

cbm*_*eks 92 events node.js actor akka

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

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

据我所知,Node非常适合处理许多并发操作.我想资产管理系统的一个好的Node网络服务可以很好地处理许多用户同时提交更改(在大型,繁忙的流量应用程序中).

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

我处理许多处理复杂业务逻辑的应用程序,我认为现在是时候把它们加入到一个或另一个中.特别是升级传统的Struts和C#应用程序.

无论如何,避免神圣的战争,两个系统如何根本不同?它们似乎都面向同一个目标.也许Akka的"自我修复"架构具有优势.

编辑

看起来我正在接近投票.请不要将此问题视为"哪个更好,节点还是akka?".我正在寻找的是事件驱动库(如Node和基于演员的库,如Akka)的根本区别.

Rol*_*uhn 63

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

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

以上并不是详尽无遗的,我相信还有很多不同之处.

  • 是的,两者都是不错的选择.Play适合作为一个框架,为您提供完全集成的开发体验,但这意味着Play将运行您的应用程序.如果您想在Akka应用程序中嵌入一个瘦REST层,喷涂会更好.请注意,Spray将在未来几个月内成为akka-http. (3认同)
  • 如果我决定使用 AKKA 构建宁静的 Web 应用程序,您认为使用 PLAY-FRAMEWORK 或 SPRAY 的最佳方式是什么? (2认同)
  • 并且还要指出,您可以使用Scala/Java获得静态类型语言的所有优点,并且在javascript中没有回调地狱.Java/Scala比javascript更容易调试. (2认同)
  • 在与节点的并行性方面,应该提到的是,您可以使用其[cluster](http://nodejs.org/api/cluster.html)核心API在运行时分叉进程.它会像平行演员那样做. (2认同)
  • 在我看来,2012年的答案现在非常过时,因为很多事情都发生了变化,尤其是Node.在Node中查看https://www.npmjs.com/package/webworker-threads web worker,您可以将阻塞的intesive工作移到parrellel进程(所有这些都在同一个Node进程中). (2认同)
  • 简而言之,Akka 可以轻松构建 Node.JS(如果需要的话可以运行单线程),但反之则不然。另外,错误管理也更加优越。因此,Akka 是一个超集,比 Node.JS 强大得多。Akka Streams 更强大,Akka HTTP 也是如此。 (2认同)

yet*_*ehe 8

我还没有使用Akka,但它似乎是像erlang一样但在java中.在erlang中,所有进程都像Akka中的actor,它们有邮箱,你可以在它们之间发送消息,你有监督等.

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/ 1百万是那么2011 /

在java中你需要线程来做任何并发,否则你不能在erlang所做的函数内暂停执行(实际上erlang在函数调用之间暂停,但这与所有函数有关).您可以暂停消息之间的执行.


ste*_*bot 6

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

至于一个系统与演员模型的比较,我会让更聪明的人描述它.关于Actor模型的一些简要说明:

  • 演员模型是基于消息的
  • 演员模型往往适用于分布式系统(集群).基于事件的系统可以是分布式的,但我认为参与者模型在分配计算方面具有内置的分布.可以将新请求路由到不同孤岛中的新actor,但不确定这在基于事件的情况下如何工作.
  • Actor模型支持失败,如果hey cluster 1出现故障,观察者通常可以找到一个不同的silo来完成工作

另外,看看戏剧.它是另一个nodejs actor模型实现.

  • 尝试用nodejs建立一个集群,你需要docker、kubernetes并构建分布式系统。还尝试在nodejs中设置多1个核心的使用。Akka 就是为了处理这些问题而设计的。Nodejs 本身的成熟度、安全性以及需要另一个框架来做某事的编码方式,是 Nodejs 本身不能用于大型分布式系统的一点,但至少只能以 MSA 的方式使用。无论如何我的意见。 (2认同)