我最近一直在看akka,它令人印象深刻。看起来它具有 erlang 的大部分杀手级特性——位置透明性、监督层次结构等等。erlang 有没有 akka 没有的功能?
5 回答
免责声明:我是 Akka 的 PO
- Erlang 发送时复制 - Akka 使用共享内存(不可变对象)进行虚拟机内发送
- 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 中,进程保证大约每减少 1000 次切换。在像 Scala/Akka 这样的幼稚框架中,代理拥有一个调度程序,直到它完成接收工作。将死。游戏结束。Hasta la vista :) 伙计们,不要把时间浪费在伪技术上。我很震惊这里的人将 Scala 与 Erlang 进行比较。
还有许多其他所谓的“杀手级功能”,但这是我的建议,不要考虑功能,考虑启用特定语言的习语。Scala 窃取了“最佳功能”,Erlang 使您能够/使用正确的习惯用法来可靠地构建系统,并使用由这些正确习惯用法驱动的高级语言。当您学习 Erlang 时,您正在重建您的思想,您对分布式可靠系统的思考方式,Erlang 会教您并升级您。Scala 只是另一种命令式(哦,对不起,多范式,有趣的词)语言,它试图从其他语言中窃取好的特性。
几乎没有人提到进程隔离。如果不保证“你的线程不会弄乱我的垃圾”,分布式系统就更难推理了。(对于Erlang 的流程,它们已经够难了。)
AFAIK(鉴于我对 JVM 的直接经验有限,这并不遥远),只有 Erlang 实际上在 JVM 上获得了“正确”的进程隔离。Google 先生可以提供一些提示,告诉您在哪里可以找到 Fox 和 Candea(?)关于使用“微重启”技术(“面向恢复的计算”)的研究系统的研究。一位 Erlang 开发人员阅读了该研究并说了几件事:
- 欢迎来到俱乐部,你怎么花了这么长时间?
- 但是,JVM 让它变得非常非常难以加入。:-)
对我来说,在整个 Erlang 集群中进行热代码交换而不停机(例如make:all([netload]
:)是 Erlang 的杀手级功能之一。
但是让我们把你的问题反过来:akka 有什么 Erlang 没有的?当然,您可以向 Java 添加几十个扩展和库(scala、akka、spring、osgi,...),以尝试接近 Erlang。但重点在哪里?总而言之,所有这些扩展都比学习简单的 Erlang 语言复杂得多,现在已经证明了 2 多年,它可以完成这项工作,提供顶级的可扩展性和零停机时间。
Erlang 可能更适合更大的分布式系统(遵循 vjache 的回答),但对于普通服务器,当您只想使用多个 CPU 的全部功能时,Akka 是不错的选择——提供良好的抽象、性能和与 Java 生态系统的集成。