【发布时间】:2015-02-23 19:34:15
【问题描述】:
如何在没有 Akka 的情况下实现简单的 Actor?对于许多(非固定计数)actor 实例、绿色线程、IoC(生命周期、基于 Props 的工厂、ActorRef 的)、监督、背压等,我不需要高性能。只需要顺序性(队列)+ 处理程序 + 状态+ 消息传递。
作为副作用,我实际上需要基于actor的小型管道(带有递归链接)+一些并行actor来优化DSP算法计算。它将在没有传递依赖关系的库中,所以我不希望(并且不能因为它是一个 jar 插件)推动用户创建和传递akkaSystem,该库应该具有尽可能简单和轻量级的界面。我不需要 IoC,因为它只是一个库(一组函数),而不是一个框架——所以它的算法复杂性比结构复杂。但是,我认为 Actor 是描述协议的好工具,实际上我可以将算法分解为少量异步交互的实体,因此它符合我的需求。
为什么不用 Akka
Akka 很重,也就是说:
- 这是一个外部依赖;
- 具有复杂的接口和实现;
- 对于库的用户不透明,例如 - 所有实例都由 akka 的 IoC 管理,因此不能保证一个逻辑参与者始终由同一个实例维护,重新启动将创建一个新实例;
- 需要额外的迁移支持,这与 scala 的迁移支持本身相当。
- 使用
jstack/jconsole/jvisualvm调试akka 的绿色线程也可能更难,因为一个actor 可以作用于任何线程。
当然,Akka 的 jar (1.9Mb) 和内存消耗(每 GB 250 万演员)一点也不重,因此您甚至可以在 Android 上运行它。但众所周知,您应该使用专门的工具来观察和分析用户可能不熟悉的演员(如 Typesafe Activator/Console)(我不会强迫他们学习)。对于企业项目来说一切都很好,因为它几乎总是有 IoC、一些专门的工具和持续迁移,但这对于一个简单的库来说并不是一个好方法。
附:关于依赖。我没有它们,我不想添加任何东西(我什至避免使用 scalaz,它实际上有点适合这里),因为它会导致大量维护 - 我必须保留我的简单库与 Akka 保持同步。
【问题讨论】:
-
你不想使用Akka的原因是什么?
-
Akka 不重
-
好的。查看“Scala 中的 FP”一书中的 Actor 实现:github.com/fpinscala/fpinscala/blob/master/answers/src/main/…
-
不知道您为什么将 Akka 称为 IoC 容器。它不是。它将
Actors 包装在ActorRefs 中的事实只是一个实现细节,它简化了生命周期管理和网络透明度,但它并没有“反转控制”。 -
@Vladimir Matveev O_o? IoC(一般意义上不仅仅是 IoD 或 DI)——实际上是从库代码中调用客户端代码。 1) Akka 通过重新实例化 Actor 来维护其生命周期,2)
system.actorOf- 是管理其创建(服务定位器)的工厂,3) 甚至从调度程序调用receive也是一种 IoC。 4)ActorRef的发明主要是因为你不能注入具有循环依赖的actor,所以它是 IoD 的一部分(由于网络抽象而次要)
标签: scala concurrency akka actor