【问题标题】:How are the multiple Actors implementation in Scala different?Scala 中的多个 Actor 实现有何不同?
【发布时间】:2011-08-25 05:13:20
【问题描述】:

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

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

【问题讨论】:

标签: scala actor akka


【解决方案1】:

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

Test code & results 用于 JVM 1.8.0_x 上的平均延迟和吞吐量。

【讨论】:

  • 哇,我很惊讶 Scalaz 在延迟和吞吐量方面可以与 Akka 竞争。
【解决方案2】:

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

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

有几个地方等我有空的时候再补上。

设计理念

  • Scalaz 演员

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

  • 电梯演员

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

  • Scala 演员

    在 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) 反应堆:否

状态隔离级别

如果用户在 他们的演员,他们可以从 外面?

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

演员类型

  • Scalaz 演员:Actor[A] extends A => ()
  • 电梯演员:LiftActor, SpecializeLiftActor[T]
  • Scala 演员:Reactor[T]Actor extends Reactor[Any]
  • Akka 演员:Actor[Any]

演员生命周期管理

Scalaz 演员 电梯演员 Scala 演员 Akka 演员 手动启动 否 否 是 是 手动停止 否 否 否 是 Restart-on-failure 不适用 是 是 可按参与者实例配置 重新启动语义 n/a 重新运行 actor 通过重新分配将 actor 恢复到稳定状态并 行为丢弃旧实例 重新启动可配置性 不适用 不适用 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。还有Promise中的Kleisli作文。

消息回复模式

待定

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

消息处理

支持嵌套接收?

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

消息执行机制

待定

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

分布/远程参与者

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

操作方法

待定

Scalaz 演员 电梯演员 Scala 演员 Akka 演员 定义演员 创建一个演员实例 启动一个actor实例 停止一个actor实例

【讨论】:

  • 优秀的文章谢谢。有人测量过内存占用和性能吗?
  • 链接已损坏,请用当前链接编辑? (我对 Scala 一无所知,所以我对“当前”的判断很差。)
  • @yzorg 在这一点上,我会选择 Akka 演员。 Scala Actors 正在被弃用,Scalaz/Lift Actors 在他们的领域之外从未流行过。
【解决方案3】:
  • scala.actors 是在 Scala 中实现 Erlang 风格并发的第一次认真尝试,它启发了其他库设计者做出更好(在某些情况下)和更高性能的实现。最大的问题(至少对我而言)是,不像 Erlang 进程,辅以 OTP(允许构建容错系统),scala.actors 只提供一个良好的基础,一组稳定的原语,必须用于构建更高级别的框架 - 最终,您必须在上面编写自己的主管、actor 目录、有限状态机等的演员。

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

  • Scalaz。通常我在所有项目的依赖项列表中都有这个库,但由于某种原因,我不能使用 Akka、非阻塞 Scalaz Promises(使用所有的好处,比如sequence) 与标准演员相结合,正在挽救这一天。但是,我从未使用 Scalaz 演员来替代 scala.actorsAkka

【讨论】:

    猜你喜欢
    • 2011-02-23
    • 2010-11-03
    • 2023-03-28
    • 1970-01-01
    • 2014-09-18
    • 2011-12-20
    • 1970-01-01
    • 2017-07-04
    • 1970-01-01
    相关资源
    最近更新 更多