首页 文章

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

提问于
浏览
91

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

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

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

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

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

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

EDIT

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

3 回答

  • 5

    我不确定这是一个公平的比较 . 我更多地读这个"how does an evented based system compare with an actor model?" . Nodejs可以支持一个actor模型,就像Scala在Akka中所做的那样,或者C#在奥尔良做的事实上,实际上检查了nactor,有人似乎已经在尝试它了 .

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

    • 演员模型是基于消息的

    • 演员模型往往适用于分布式系统(集群) . 基于事件的系统可以是分布式的,但我认为参与者模型在分配计算方面具有内置的分布 . 可以将新请求路由到不同孤岛中的新actor,但不确定这在基于事件的情况下如何工作 .

    • Actor模型支持失败,如果嘿群集1出现故障,观察者通常可以找到一个不同的孤岛来完成工作

    另外,请查看drama . 它是另一个nodejs actor模型实现 .

  • 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-million-is-so-2011/

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

  • 59

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

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

    以上并不是详尽无遗的,我相信会有更多的差异 .

相关问题