akka 与 Erlang 相比如何? [关闭]
Posted
技术标签:
【中文标题】akka 与 Erlang 相比如何? [关闭]【英文标题】:How does akka compare to Erlang? [closed] 【发布时间】:2011-05-28 07:45:07 【问题描述】:我最近一直在看 akka,它令人印象深刻。看起来它具有 erlang 的大部分杀手级特性——位置透明性、监督层次结构等等。 erlang 有没有 akka 没有的功能?
【问题讨论】:
观看这部电影关于 erlang 的实践。可惜没有关于 scala youtube.com/watch?v=G0eBDWigORY 【参考方案1】:免责声明:我是 Akka 的 PO
Erlang 执行发送时复制 - Akka 使用 共享内存(不可变对象) 虚拟机内发送 Erlang 执行每个进程的 GC - Akka 使用 JVM GC Erlang 拥有OTP - Akka 与整个 Java 生态系统(Apache Camel、JAX-RS、 等等等等) Erlang 做这个过程 为您安排 - Akka 允许您 使用许多不同的调度程序 无限配置 机会 Erlang 做热代码 reload - Akka 可以支持它,但是 由于 JVM,它不太灵活 类加载那些是我脑海中的那些。
另一方面,使用 Akka 意味着您可以使用 Scala、Java、Groovy 或 JRuby 来编写应用程序。
【讨论】:
Erlang 对象也是不可变的,并发模型不需要在同一节点内进行发送时复制。 large 对象的 BEAM 发送一个引用。来源:这个SO answer by @rvirdig。 Erlang 执行 copy-on-send 以提高 GC 效率——它可以在每个进程的基础上工作。这就是为什么在 Erlang 应用程序中没有巨大的 GC 暂停而不是 JVM/Akka 应用程序的原因。 嗯,Andrey,这取决于您使用的 JVM / GC。 azulsystems.com/products/zing/whatisit Erlang 对每个进程都有一个减少数,即使您处于繁忙的繁重计算循环中,Erlang VM 也可以暂停该进程并让其他饥饿的进程占用更多的 CPU 周期。这是 JVM 没有提供的一个非常重要的特性。 @MaX Erlang 通常比 Java 慢 5 倍,因为缺乏 JIT 支持。但是 Erlang 没有 GC 暂停,它是为并发和 7*24 电信应用而设计的,Erlang 更关心进程公平性,避免饥饿和死锁,它不像 JVM 那样为吞吐量而设计。所以,它真的是橙子和苹果。【参考方案2】:在 Erlang 中,进程保证大约每减少 1000 次切换。在像 Scala/Akka 这样的幼稚框架中,代理拥有一个调度程序,直到它完成接收工作。将死。游戏结束。 Hasta la vista :) 伙计们,不要把时间浪费在伪技术上。我很震惊这里的人将 Scala 与 Erlang 进行比较。
还有许多其他所谓的“杀手级功能”,但这是我的建议,不要从功能的角度考虑,要考虑启用特定语言的习语。 Scala 窃取了“最佳功能”,Erlang 使您能够/使用正确的习惯用法来可靠地构建系统,并使用由这些正确习惯用法驱动的高级语言。当您学习 Erlang 时,您正在重建您的思想,您对分布式可靠系统的思考方式,Erlang 会教您并升级您。 Scala 只是另一种命令式(哦,对不起,多范式,有趣的词)语言,它试图从其他语言中窃取好的特性。
【讨论】:
Erlang 使所有 IO 隐式异步的方式非常优雅。异步 IO 可以使用 Scala 中的 NIO API 来完成,这在我看来并不像 check-mate,而是一个不太优雅的解决方案。 你到底在说什么?!如何处理 1000 个直接任务比轮询调度更好,甚至接近最小邮箱调度!! @vjache - 我同意。我作为一名 Java 程序员多年的经验告诉我,在某些时候你必须调查你下面的层。 Scala/Akka 似乎只是许多其他层(例如 nio、netty 等)之上的另一层,所有这些你都需要在某个时候理解。尽管我才刚刚开始使用 Erlang,但看起来我需要了解的层更少才能完成工作。 Erlang 中的分布式编程感觉比 Scala/Akka 轻得多,这可能类似于 python 是 web 应用程序中 java 的更轻量级替代品。 @FUD:也许他的意思是 1000 条 Erlang 指令?他不可能意味着 1000 条消息... @ErikAllik 他的意思是 1000 次“减少”。将减少视为执行一些代码的标记(不是,但它可以解释......)。减少 1000 次后,调度程序切换到不同的进程。更多信息erlang.org/pipermail/erlang-questions/2001-April/003132.html【参考方案3】:几乎没有人提到进程隔离。如果不保证“你的线程不会弄乱我的垃圾”,分布式系统就更难推理了。 (他们已经够难了 Erlang 的流程。)
AFAIK(考虑到我对 JVM 的直接经验有限,这并不遥远),实际上只有 Erlang 在 JVM 上获得了“正确”的进程隔离。 Google 先生可以提供一些提示,告诉您在哪里可以找到 Fox 和 Candea(?)关于使用“微重启”技术(“面向恢复的计算”)的研究系统的研究。一位 Erlang 开发人员阅读了该研究并说了几句话:
-
欢迎来到俱乐部,您花了这么长时间?
尽管如此,JVM 让它变得非常非常难以加入。 :-)
【讨论】:
进程隔离确实超级好。然而,即使是 Erlang 也不能幸免于 NIF 出错。【参考方案4】:对我来说,无需停机即可在整个 Erlang 集群中进行热代码交换(例如:make:all([netload]
)是 Erlang 的杀手级功能之一。
但是让我们把你的问题反过来:akka 有什么 Erlang 没有的? 当然,您可以在 Java 中添加数十个扩展和库(scala、akka、spring、osgi,...),以尝试接近 Erlang。但重点在哪里?总而言之,所有这些扩展都比学习简单的 Erlang 语言复杂得多,现在已经证明了 2 多年,它可以完成这项工作,提供***的可扩展性和零停机时间。
【讨论】:
IMO,Scala 在语法层面上是一种比 Erlang 更好的语言。它有对象、特征、适当的命名空间、适当的类型安全、没有丑陋的记录语法等。社区更大,我可以使用所有可用的 Java 工具,而且感觉更精致。 @ryeguy:“语法级别更好的语言”......嗯,为“语法”定义“更好”。当我比较语言时,语法是最不相关的因素(因为这只是品味或你使用的问题)。 @ryeguy 不同的语义,不同的语法。 如果您需要在不同代码版本之间维护状态,那么热代码交换会变得很痛苦,最终关闭进程并在启动时迁移状态会更容易 @ryeguy 编程语言的语法几乎无关紧要。重要的是它的语义。 Erlang 是一个函数式 PL,所以它当然没有对象。特性、类型安全等是由于 Scala 是一种强类型语言,而 Erlang 是动态类型的;这是一个设计选择。不过,如果您希望 Erlang 的好处具有更现代的感觉,我会邀请您看一下 Elixir ;)【参考方案5】:Erlang 可能更适合更大的分布式系统(遵循 vjache 的回答),但对于普通服务器,当您只想使用多个 CPU 的全部功能时,Akka 是不错的选择——提供良好的抽象、性能和与 Java 生态系统的集成。
【讨论】:
以上是关于akka 与 Erlang 相比如何? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
与 Scala / Akka Actor 相比,Java 线程有多重?
Erlang 接受 SSL 连接真的很慢(与 C++ 相比)