Akka与Erlang相比如何?[关闭]


97

我最近一直在看akka,它给人留下了深刻的印象。它似乎具有erlang的大多数杀手级功能-位置透明性,监管层次结构等。erlang是否具有akka没有的任何功能?


在实践中观看有关erlang的电影。太糟糕了,没有关于scala的信息youtube.com/watch?v=G0eBDWigORY
mhstnsc

Answers:


123

免责声明:我是Akka的PO

  • Erlang会进行发送时复制-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编写应用程序。


39
Erlang对象也是不可变的,并且并发模型不需要在同一节点内发送时复制。大型对象的BEAM 发送参考。来源:@rvirdig提供的SO答案
FooF,2012年

26
Erlang确实进行了拷贝复制,以提高GC的效率-它可以在每个过程的基础上工作。这就是为什么与JVM / Akka应用程序相比,Erlang应用程序中没有大量GC暂停的原因。
andreypopp 2012年

4
好吧,安德烈,这取决于您所使用的JVM / GC。azulsystems.com/products/zing/whatisit
维克多·巴生

4
即使您正忙于繁重的计算循环,Erlang也会减少每个进程的数量,Erlang VM可以暂停该进程并让其他饥饿的进程占用更多的CPU周期。这是JVM不提供的非常重要的功能。
丹尼尔(Daniel)

6
@MaX Erlang通常比Java慢5倍,因为缺少JIT支持。但是Erlang没有GC暂停,它是为并发和7 * 24电信应用程序而设计的,Erlang更加关注进程的公平性,避免了饥饿和死锁,它不是像JVM那样为吞吐量而设计的。所以,它真的是橙色和苹果。
丹尼尔(Daniel)

74

在Erlang中,保证大约每减少1000次切换一次。在这样一个天真的框架中,例如Scala / Akka代理拥有一个调度程序,直到它完成接收工作为止。将军。游戏结束。Hasta la vista :)人们,不要把时间浪费在伪技术上。我很震惊,这里的人们将Scala与Erlang进行了比较。

此外,还有许多其他所谓的“杀手级功能”,但这是我的建议,不要以功能为出发点,请考虑启用特定语言的成语。Scala窃取了“最佳功能”,Erlang使用正确的习惯用法来启用/实施正确的习惯用法,以可靠地构建系统,并使用从这些正确习惯用法驱动的高级语言。当您学习Erlang时,您将在重新建立思维,以自己的方式思考分布式可靠系统,Erlang会教您并进行升级。Scala只是另一种命令性语言(哦,对不起,多范式,有趣的单词),它试图从其他语言中窃取良好的功能。


9
使所有IO隐式异步的Erlang方法非常优雅。异步IO可以使用Scala中的NIO API来完成,这对我来说似乎不像是对偶,但解决方案不太好。
HRJ

7
你到底在说什么?与轮循调度甚至是最小的邮箱调度相比,如何处理1000个直接任务更好!
FUD

8
@vjache-我同意。我作为Java程序员的多年经验告诉我,您将不得不在某些时候研究下一层。Scala / Akka似乎只是许多其他层(例如nio,netty等)之上的另一层,您有时需要了解所有这些层。即使我才刚刚开始使用Erlang,看起来完成工作所需的层数也会减少。Erlang中的分布式编程比Scala / Akka轻得多,可能类似于python是Web应用程序中java的更轻巧的替代品。
克里斯·斯诺

@FUD:也许他的意思是1000条Erlang指令?他本来就不希望发送1000条消息...
Erik Kaplun 2014年

2
@ErikAllik他的意思是“减少” 1000次。可以将减少视为执行一些代码的令牌(不是,但这确实可以解释……)。减少1000次后,调度程序将切换到其他进程。有关更多信息,请访问erlang.org/pipermail/erlang-questions/2001-April/003132.html
神盾

40

几乎没有人提到进程隔离。如果不能保证“您的线程不会惹上我的垃圾”,那么分布式系统就很难推理了。(使用 Erlang的过程已经很困难了。)

AFAIK(考虑到我有限的直接使用JVM的经验,这并不算遥遥),只有Erlang实际上在JVM上获得了“正确”的进程隔离。Google先生可以为Fox和Candea(?)在使用“微重启”技术(“面向恢复的计算”)的研究系统上提供研究建议。一位Erlang开发人员阅读了该研究并说了几句话:

  1. 欢迎来到俱乐部,您花了这么长时间吗?
  2. 但是,JVM使它变得非常难以连接。:-)

进程隔离确实非常好。但是,即使是Erlang也无法避免NIF出现问题。
维克多·巴生

14

对我而言,在整个Erlang集群中进行热代码交换而不会造成停机(例如make:all([netload]:)是Erlang的杀手级功能之一。

但是,让我们扭转一下您的问题:Akka没有Erlang的什么?当然,您可以向Java添加数十个扩展和库(scala,akka,spring,osgi等),以尝试接近Erlang。但是,重点在哪里?总而言之,所有这些扩展都比学习简单的Erlang语言要复杂得多,Erlang语言已经证明了20多年,可以在零停机时间内提供最高的可扩展性。


30
IMO,Scala在语法级别比Erlang更好。它具有对象,特征,适当的名称空间,适当的类型安全性,没有丑陋的记录语法等。社区更大,我可以使用所有可用的Java工具,而且感觉更加优美。
ryeguy 2010年

15
@ryeguy:“在语法级别上更好的语言” ...嗯,为“语法”定义“更好”。当我比较语言时,语法是最不相关的因素(因为这仅取决于您的口味或使用习惯)。
Peer Stritzinger 2010年

4
@ryeguy不同的语义,不同的语法。
rvirding 2010年

3
如果您需要维护不同代码版本之间的状态,则热代码交换会变得很痛苦,最终,在启动时更容易关闭进程并迁移状态
OlegYch 2013年

4
@ryeguy编程语言的语法几乎无关紧要。重要的是它的语义。Erlang是一个功能性PL,因此它当然没有对象。特性,类型安全性等归因于Scala是强类型语言,而Erlang是动态类型。这是一种设计选择。不过,如果您希望以更现代的感觉来体验Erlang的好处,我将邀请您来看看Elixir;)
Aegis 2014年

5

Erlang可能适用于较大的分布式系统(遵循vjache的回答),但是对于普通服务器,如果您只想使用多个CPU的全部功能,那么Akka是一个不错的选择-提供良好的抽象性,性能以及与Java生态系统的集成。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.