经典Actor模型
Akka
Akka致力于将具有行业实力的Actor模型引入JVM运行时,以弥补JVM本身未设计任何对Actor的支持;Akka最早是基于Scala Actors,不过后来 其更迭的速度远胜于Scala Actors。Akka为Actor提供了具有Java和Scala绑定的编程接口,该接口看起来类似于Scala Actors,但是在处理消息的方式上具有不同的语义。
Akka的接收操作定义了一个全局消息处理程序,该处理程序不会在收到不匹配的消息时阻止,而是仅在可以处理匹配的消息时才触发。如果没有匹配的模式来处理消息,它也不会在Actor的邮箱中留下消息。该消息将被简单地丢弃,并将事件发布到系统。Akka的接口还提供了更强的封装,以避免暴露对Actor的直接引用。Akka actor具有有限的ActorRef接口,该接口仅提供用于向其actor发送消息或将消息转发到其actor的方法,此外还要进行检查以确保在创建actor之后无法直接访问Actor子类的实例。在某种程度上,这解决了Scala Actors中可能会在actor上调用公共方法的问题,从而打破了程序员对消息传递的期望。这个系统不是完美的,但是在大多数情况下,它限制了程序员仅使用有限的接口将消息发送给参与者。
与Scala Actor相比,Akka运行时还提供了性能优势。运行时对参与者处理的许多或所有消息使用单个连续关闭,并提供更改此全局连续的方法。与Scala Actors的延续模型使用控制流异常会导致额外的开销相比,可以在JVM上更有效地实现此功能。此外,非阻塞消息插入和任务计划操作用于提高性能。Akka是经典Actor模型血统的生产就绪结果。它是积极开发并实际用于构建可伸缩系统的。本章稍后将详细介绍Akka的生产用法。Akka已经足够成功,已被移植到其他语言/运行时。有一个Akka.NET项目,使用C#和F#将Akka编程模型引入.NET和Mono。Akka甚至已作为基于Scala.js的Akka.js移植到JavaScript。