并发编程与大数据处理中的Scala应用
1. Akka Actor模型概述
ActorRefs具有很高的稳定性,是很好的依赖选择。当监督者重启一个Actor时,会将ActorRef重置为指向新的实例。若Actor未重启或恢复,发送到对应ActorRef的所有消息会被转发到ActorSystem.deadLetters,这是死亡Actor消息的归宿。因此,ActorRef之间的关系稳定可靠。
Akka Actor很轻量级,每个Actor约300字节,在单个大型JVM实例中可轻松创建数百万个。不过,跟踪大量自主Actor是个挑战,但如果大部分是无状态工作者,必要时也可管理。此外,Akka支持跨数千个节点的集群,以满足高可扩展性和可用性需求。
然而,Actor模型也存在一些问题。常见的批评是类型安全的缺失,Receive类型别名是PartialFunction[Any,Unit],无法限制Actor接收消息的类型,若发送意外消息,只能在运行时检测问题,编译器和类型系统无法保证逻辑正确性。而且,Actor之间的引用都是ActorRef,而非特定的Actor类型。虽然有人尝试提供更严格的类型,但目前尚未取得明显成功。不过,对大多数用户来说,模型的强大功能和灵活性弥补了类型安全的损失。
Actor模型并非真正的函数式编程模型,Receive返回Unit,一切通过副作用完成,并且在必要时会使用可变状态,如数据存储中。但这种可变状态的使用遵循严格原则,状态被封装在Actor内部,对状态的操作保证了线程安全,Actor之间的消息应为不可变对象,只是Scala和Akka无法强制这些原则,需要开发者自行遵守。
有趣的是,Actor模型与Alan Kay所倡导的面
超级会员免费看
订阅专栏 解锁全文
69

被折叠的 条评论
为什么被折叠?



