akka与Erlang相比如何?

rye*_*guy 95 erlang akka

我最近一直在关注akka,这令人印象深刻.看起来它具有erlang的大部分杀手级功能 - 位置透明度,监督层次结构等等.有没有任何功能erlang有akka没有?

Vik*_*ang 123

免责声明:我是Akka的PO

  • Erlang执行copy-on-send - Akka使用共享内存(不可变对象)进行VM内发送
  • Erlang执行每个进程GC - Akka使用JVM GC
  • Erlang有OTP - Akka与整个Java生态系统集成(Apache Camel,JAX-RS等)
  • Erlang为您完成流程调度 - Akka允许您使用具有无限配置机会的许多不同Dispatchers
  • Erlang执行热代码重新加载 - Akka可以支持它,但由于JVM类加载,它的灵活性较低

那些是我头脑中的那些.

另一方面,使用Akka意味着您可以使用Scala,Java,Groovy或JRuby来编写应用程序.

  • Erlang对象也是不可变的,并发模型不需要在同一节点内进行copy-on-send._________ge对象的BEAM发送引用.资料来源:[由@rvirdig提供的答案](http://stackoverflow.com/questions/1798455/concurrency-how-does-shared-memory-vs-message-passing-handle-large-data-structu/1801214#1801214 ). (38认同)
  • Erlang执行copy-on-send以提高GC的效率 - 它可以在每个进程的基础上工作.这就是为什么Erlang应用程序中没有巨大的GC暂停,而不是JVM/Akka应用程序. (26认同)
  • @MaX Erlang通常比Java慢5倍,因为缺少JIT支持.但Erlang没有GC暂停,它专为并发和7*24电信应用而设计,Erlang更关注流程公平性,避免饥饿和死锁,它不是为像JVM这样的吞吐量而设计的.所以,它真的是橙色和苹果. (6认同)
  • 好吧,安德烈,这取决于你正在使用的JVM/GC.http://www.azulsystems.com/products/zing/whatisit (4认同)
  • Erlang每个进程都有一个减号,即使你处于繁忙的繁重计算循环中,Erlang VM也可以暂停进程并让其他饥饿的进程占用更多的CPU周期.这是JVM不提供的一个非常重要的功能. (4认同)
  • 有单独的过程堆和复制发送**秤**! (2认同)

小智 74

在Erlang过程中,保证大约每1000次减少一次.在这样一个天真的框架中,Scala/Akka代理拥有一个调度程序,直到它完成接收工作.将军.游戏结束.Hasta la vista :)人们,不要在伪技术上浪费你的时间.我震惊的是,这里的人比较Scala和Erlang.

还有许多其他所谓的"杀手特征",但这里是我的建议,不要在功能方面思考,考虑能够使特定语言的习语.Scala窃取"最佳功能",Erlang使用正确的习惯用来实现您可靠地构建系统,使用高级语言来驱动这些正确的习语.当你学习Erlang时,你正在重建你的思想,思考分布式可靠系统的方式,Erlang会教你并升级你.Scala只是另一种命令(哦,抱歉,多范式,有趣的词)语言试图窃取其他语言的好功能.

  • Erlang使所有IO隐式异步的方式非常优雅.Async IO可以在Scala中使用NIO API完成,它看起来不像我的格式,但是不太优雅的解决方案. (9认同)
  • 你到底在说什么?!如何处理1000个直接任务比圆形调度更好,甚至是最小的邮箱调度! (7认同)
  • @vjache - 我同意.我作为一名java程序员多年来一直教会我,你在某些时候必须调查你下面的层.Scala/Akka似乎只是许多其他层(例如.nio,netty等)之上的另一层,所有这些都需要在某些时候理解.即使我刚刚开始使用Erlang,看起来我将需要更少的层来完成工作.在Erlang中进行分布式编程对Scala/Akka来说感觉轻松得多,可能与python是用于Web应用程序的java的替代方案类似. (7认同)
  • @vjache你是对的! (4认同)
  • @ErikAllik他意味着1000"减少".把减少想象成执行一些代码的代币(它不是,但它可以解释......).在减少1000次之后,调度程序切换到不同的进程.更多信息,请访问http://erlang.org/pipermail/erlang-questions/2001-April/003132.html (2认同)

Sco*_*hie 39

几乎没有人提到过程隔离.如果没有"你的线程不能搞乱我的垃圾"的保证,分布式系统就更难以推理了.(对于 Erlang的流程,他们已经足够困难了.)

AFAIK(由于我对JVM的直接经验有限,并不是很远),只有Erlang实际上在JVM上获得了"正确"的进程隔离.谷歌先生可以提供一些关于Fox和Candea(?)在使用"微重启"技术("恢复导向计算")的研究系统上的研究结果的一些提示.一位Erlang开发人员阅读了该研究并说了几件事:

  1. 欢迎来到俱乐部,你花了这么长时间?
  2. 尽管如此,JVM非常难以加入.:-)


Rum*_*ilz 14

对我来说,热代码交换整个Erlang集群而不停机(例如make:all([netload]:)是Erlang杀手功能之一.

但是让我们改回你的问题:akka对Erlang没有什么影响?当然,您可以向Java添加许多扩展和库(scala,akka,spring,osgi,...)以尝试接近Erlang.但重点在哪里?总而言之,所有这些扩展都比学习20多年来已经证明的简单Erlang语言复杂得多,它可以提供顶级可扩展性,零停机时间.

  • IMO,Scala在语法层面上比Erlang语言要好得多.它有对象,特征,正确的命名空间,正确的类型安全,没有丑陋的记录语法等.社区更大,我可以使用所有可用的Java工具,它只是感觉更精致. (30认同)
  • @ryeguy:"语法级别的语言更好"......嗯,为"语法"定义"更好".当我比较语言时,语法是最无关紧要的因素(因为它只是一个品味问题或者你使用的是什么). (15认同)
  • @ryeguy不同的语义,不同的语法. (4认同)
  • @ryeguy编程语言的语法几乎无关紧要; 重要的是它的语义.Erlang是一个功能性PL,当然它没有对象.特征,类型安全等是由于Scala是强类型语言,而Erlang是动态类型的; 这是一个设计选择.不过,如果你想让Erlang的好处更具现代感,我会邀请你去看看Elixir;) (4认同)
  • 如果你需要在不同的代码版本之间维护状态,热代码交换会变得很痛苦,最后在启动时更容易关闭进程并迁移状态 (3认同)

kod*_*ark 5

Erlang 可能更适合更大的分布式系统(遵循 vjache 的回答),但对于普通服务器,当您只想使用多个 CPU 的全部功能时,Akka 是不错的选择——提供良好的抽象、性能和与 Java 生态系统的集成。