1.1 什么是 Akka
Akka 虽然是用 Scala 语言写的,但是 Scala 和 Java 都可以用。 它的主要目标是使高性能,高可靠性和可扩展性的编程更容易。 Actors 最重要的一点:使得程序员只关注于如何最高效地实现解决方案,而不是被迫管理诸如批处理及资源管理之类的问题。 大多数解决方案,都是同时围绕着这两大轴心:扩展容量,同时增加应用的能力。 Actors 使得程序员只关注任务本身;当需求增长或改变时,由系统提供扩展方法。
对于需要实时,或者软实时的系统,各组件同步地依赖于不可用的服务,这样的模型恰似被掌声打断的表演。 轻易创建进程或线程来处理每个请求,长期来说是不合理的。 当容器部署线程池时,一旦执行线程调用了相应的代码,只要它愿意,没什么阻止它执行,包括潜在地等待一些其他系统组件。 随着云计算的流行,真正分布式计算迅速变成现实。 这意味利用其他服务迅速组装应用有了更多的机会,同时也意味着,依赖那些服务使得简单的串行编程由于性能问题不再可行。
考虑一下我们的需求:
- 同时处理多个请求;
- 并发地与服务或客户交互;
- 响应异步交互;
- 事件驱动的编程模型。
使用 Akka,现在我们可以完成这些,正如本书中的例子所示。 本章的例子会展示 Akka 如何提供了并发和容错。 然后我们会用大量的例子展示其余项。
Akka 项目组将他们创造出来的结果称为工具箱,而不是框架。 框架是一种机制,去提各种具体元素(如 UI,或 Web 服务层)。 Akka 提供了渲染栈中任意部分的一组工具,且提供了联系这些部分的组件。 它通过特定的架构配置来完成如上所述的任务,这些配置使得寻求方案接口的人可以简单地调用方法,而不用担心消息入队,这些工作已经由 Akka 无缝完成了。
Akka 的模块作为 Jar 文件分发;你可以像使用其他库一样使用它们。 项目组已经花了很多精力来使模块之间的依赖最小。 除了 scala 的标准库,akka-actor 模块不再依赖其他库;实际上,从 2.10 开始,Akka 随 Scala 一起发布。 项目组提供了如下模块来方便 Akka 在栈中各个部分的使用:远程处理,集群处理,事务和数据流的并发(接下来会看到)。 还有专门关于与其他系统集成的模块,如 Camel 和 ZeroMQ 模块。 图 1.1 展示了 Akka 栈中的主要元素,以及客户代码中如何屏蔽大部分的细节。

Akka 还提供了一个运行时。 运行时的核心是基本的 actor 服务,以及灵活的配置。 你可以用一个称作 Play-mini 的微内核来部署你的应用。 使用少量代码,就可以完成强大的功能,而且运行时的开销非常小,你肯定会被震惊,被它可以扩展性震惊。
那典型的 Akka 应用是有什么组成的?答案是,Actors。 Akka 是基于 Actor 编程模型,我们会在本书中进行详细讨论。 Actors 的历史可以上溯到四十年前。 它是作为一种能让多台机器/CPU 一起工作来解决大问题的方法出现的。 但是它也受到了早期对象语言遭遇到的问题的启发,并发展成“进程演算”的概念,被函数式语言 Erlang 和 Fantom 接受。 但是,Akka 同时实现了 Actor 模型的语言,和运行时。 下一节中,我们通过展示 Actor 编程模型如何让并发变得更简单,开始对 Akka 的探索。
根据本书的目标,我们坚信,当你看到这些问题的解决方案的 Akka 版时,你会被他们的优越,实现过程中的易用与优雅。 下一节中,我们来看看令一切成为可能的 Akka 的各个元素。