76

随着 Scala 2.9.0 的发布,Typesafe Stack 也发布了,它结合了 Scala 语言和 Akka 框架。现在,虽然 Scala 在其标准库中有演员,但 Akka 使用自己的实现。而且,如果我们寻找其他实现,我们还会发现 Lift 和 Scalaz 也有实现!

那么,这些实现之间有什么区别呢?

4

3 回答 3

95

这个答案真的不是我的。由 Viktor Klang(Akka 成名)在 David Pollak(Lift 成名)、Jason Zaugg(Scalaz 成名)、Philipp Haller(Scala Actors 成名)的帮助下制作。

我在这里所做的只是格式化它(如果 Stack Overflow 支持表,这会更容易)。

有几个地方我会在以后有更多时间时填写。

设计理念

  • 斯卡拉兹演员

    最小的复杂性。最大的通用性、模块化和可扩展性。

  • 电梯演员

    最小的复杂性,由 JVM 收集垃圾,而不用担心显式的生命周期,与其他 Scala 和 Java 程序一致的错误处理行为,轻量级/小内存占用,邮箱,静态类似于 Scala Actors 和 Erlang Actors,高性能。

  • 斯卡拉演员

    在 Scala 中提供完整的 Erlang actor 模型,轻量级/小内存占用。

  • 阿卡演员

    简单且透明可分发、高性能、轻量级和高度适应性。

版本控制

                    Scalaz 演员 电梯演员 Scala 演员 Akka 演员
当前稳定版本。5 2.1 2.9.0 0.10
最小 Scala 版本。2.8 2.7.7 2.8
最低 Java 版本。1.5 1.5 1.6

演员模型支持

                    Scalaz 演员 电梯演员 Scala 演员 Akka 演员
产生新演员 是 是 是 是
演员内心
发送消息到 是 是 是 是
知名演员
改变行为 Actors 是 Yes Yes: 嵌套 Yes:
对于下一条消息不可变反应/接收成为/不成为
监督 未提供 否 演员:是,是
(link/trapExit) 反应堆:否

状态隔离级别

如果用户在其 Actor 上定义了公共方法,它们是否可以从外部调用?

  • 斯卡拉兹演员:不适用。演员是一个密封的特质。
  • 电梯演员:是的
  • 斯卡拉演员:是的
  • Akka Actors:不,actor 实例被屏蔽在 ActorRef 后面。

演员类型

  • 斯卡拉兹演员:Actor[A] extends A => ()
  • 电梯演员:LiftActor,SpecializeLiftActor[T]
  • 斯卡拉演员:Reactor[T],Actor extends Reactor[Any]
  • 阿卡演员:Actor[Any]

演员生命周期管理

                    Scalaz 演员 电梯演员 Scala 演员 Akka 演员
手动启动 否 否 是 是
手动停止 否 否 否 是
Restart-on-failure 不适用 是 是 可按参与者实例配置
重新启动语义 n/a 重新运行 actor 通过重新分配将 actor 恢复到稳定状态并
                                                    行为丢弃旧实例
重新启动可配置性 n/an/a X 次,Y 时间内 X 次
提供生命周期钩子 没有生命周期行为 preStart、postStop、preRestart、postRestart

消息发送模式

                    Scalaz 演员 电梯演员 Scala 演员 Akka 演员
火忘记了!消息演员!味精演员!味精演员参考!味精
                    一个消息)
发送 - 接收 - 回复(见 1)演员!?味精演员!?味精演员参考!味精
                                    演员!!味精
发送 - 接收 - 未来(见 2)演员!味精演员参考!味精
发送承诺结果(消息)。future.onComplete(f => to !f.result)
未来(演员)
用 actor comap f 组合 actor 否 否 否
功能(见 3)

(1) 任何函数 f 都成为这样的参与者:

val a: Msg => Promise[Rep] = f.promise
val reply: Rep = a(msg).get

(2) 任何函数 f 都成为这样的参与者:

val a = f.promise
val replyFuture = a(message)

(3) 逆变函子:actor comap f。也有 Kleisli 作文Promise

消息回复模式

待定

                    Scalaz 演员 电梯演员 Scala 演员 Akka 演员
回复消息中的发件人
回复消息

消息处理

支持嵌套接收?

  • 斯卡拉兹演员:--
  • 电梯演员:是的(有一点手工编码)。
  • Scala Actors:是的,基于线程的接收和基于事件的反应。
  • Akka Actors:不,嵌套接收会随着时间的推移导致内存泄漏和性能下降。

消息执行机制

待定

                    Scalaz 演员 电梯演员 Scala 演员 Akka 演员
执行机制名称
执行机制是
可配置
执行机制可以
在每个参与者的基础上指定
执行机制的生命周期
必须明确管理
每个actor执行线程
机制
事件驱动的执行机制
邮箱类型
支持临时邮箱
支持持久邮箱

分布/远程参与者

                    Scalaz 演员 电梯演员 Scala 演员 Akka 演员
透明遥控器 不适用 否 是 是
演员
传输协议 n/an/a Java Akka 远程协议
                                                    序列化(TCP 之上的 Protobuf)
                                                    在 TCP 之上
动态集群 n/an/an/a 在商业产品中

操作指南

待定

                    Scalaz 演员 电梯演员 Scala 演员 Akka 演员
定义演员
创建一个演员实例
启动一个actor实例
停止一个actor实例
于 2011-05-13T20:53:58.520 回答
23
  • scala.actors是在 Scala 中实现 Erlang 风格并发的第一次认真尝试,它启发了其他库设计者做出更好(在某些情况下)和更高性能的实现。最大的问题(至少对我而言)是,不像 Erlang 进程,辅以OTP(允许构建容错系统),scala.actors只提供了一个良好的基础,一组必须用于构建的稳定原语一个更高级的框架——归根结底,你必须在演员的基础上编写自己的监督者、演员目录、有限状态机等。

  • Akka来救援了,它为基于 actor 的开发提供了一个功能齐全的堆栈:更惯用的 actor、一组用于协调的高级抽象(负载平衡器、actor 池等)和构建容错系统(监督者) ,从OTP等移植),易于配置的调度程序(调度程序)等。抱歉,如果我听起来很粗鲁,但我认为,在2.9.0+中不会有合并- 我宁愿期待Akka演员逐渐取代 stdlib 实现。

  • 斯卡拉兹。通常我在所有项目的依赖项列表中都有这个库,当由于某种原因我不能使用Akka时,非阻塞Scalaz Promises(具有所有优点,比如sequence)结合标准演员正在保存天。但是,我从未使用Scalaz actor 来替代scala.actorsAkka

于 2011-05-13T21:13:16.773 回答
2

演员:Scala 2.10 vs Akka 2.3 vs Lift 2.6 vs Scalaz 7.1

在 JVM 1.8.0_x 上测试平均延迟和吞吐量的代码结果

于 2012-04-02T10:24:28.930 回答