为什么使用Akka

Akka是什么?


可扩展的实时事务处理

我们相信编写出正确的、具有容错性和可扩展性的并发程序太困难了。这多数是因为使用了错误的工具和错误的抽象级别。Akka就是为了改变这种状况而生的。通过使用Actor模型我们提升了抽象级别,为构建可扩展的、有弹性的响应式并发应用提供了一个更好的平台——详见《响应式宣言》 。在容错性方面我们采用了“let it crash”(让它崩溃)模型,该模型已经在电信行业构建出“自愈合”的应用和永不停机的系统,取得了巨大成功。Actor还为透明的分布式系统以及真正的可扩展高容错应用的基础进行了抽象。

Akka的特性

Actors

Actors为你提供:

  • 对并发/并行程序的简单的、高级别的抽象。
  • 异步、非阻塞、高性能的事件驱动编程模型。
  • 非常轻量的事件驱动处理(1G内存可容纳数百万个actors,每个Actor大小只有3百KB)。

容错性

  • 使用“let-it-crash”语义的监控层次体系。
  • 监控层次体系可以跨越多个JVM,从而提供真正的容错系统。
  • 非常适合编写永不停机、自愈合的高容错系统。

位置透明性

  • Akka的所有元素都为分布式环境而设计:所有actor只通过发送消息进行交互,所有操作都是异步的。

持久性

  • actor接收到的消息可以选择性的被持久化,并在actor启动或重启的时候重放。这使得actor能够恢复其状态,即使是在JVM崩溃或正在迁移到另外节点的情况下。

你不应该担心的事

一个actor系统管理它所配置使用的资源,运行它所包含的actor。 在一个系统中可能有上百万个actor,不用担心,内存一定是够用的,因为每个actor实例仅占差不多300个字节。自然地,一个大系统中消息处理的具体顺序是不受应用开发者控制的,但这并不是有意为之。放松些,让Akka去做幕后的繁重事务吧。

为什么使用Akka?


Akka平台提供哪些有竞争力的特性?

Akka提供可扩展的实时事务处理。

Akka为以下目标提供了一致的运行时与编程模型:

  • 垂直扩展(并发)
  • 水平扩展(远程调用)
  • 高容错

这个模型是唯一需要学习和掌握的,它具有高内聚和高一致的语义。

Akka是一种高度可扩展的软件,这不仅仅表现在性能方面,也表现在它所适用的应用的大小。Akka的核心——akka-actor是非常小的,可以方便地加入你的应用中,提供你所需要的异步无锁并行功能,不会有任何困扰。

你可以任意选择Akka的某些组件部分集成到你的应用中,也可以使用完整的包——Akka 微内核,它是一个独立的容器,可以直接部署你的Akka应用。随着CPU核数越来越多,即使你只使用一台主机,Akka也可作为一种性能卓越的选择。Akka还同时提供多种并发范型,允许用户选择正确的工具来完成工作。

什么场景下特别适合使用Akka?


我们看到Akka被成功运用在众多行业的众多企业中:

  • 投资业到商业银行
  • 零售业
  • 社会媒体
  • 仿真
  • 游戏和博彩
  • 汽车和交通系统
  • 卫生保健
  • 数据分析 等等等等。任何需要高吞吐率和低延迟的系统都是使用Akka的候选。

Actor使你能够进行服务失败管理(监控),负载管理(缓和策略、超时和处理隔离),以及水平和垂直方向上的可扩展性(增加cpu核数和/或增加更多的机器)管理。

集成Akka到现有应用?


如果已经有一个基于Servlet/SpringMvc的应用,好像没有好的理由切换到Actors/Akka,如果我们的应用如下:

  • 没有线程工作组,任务很快的在后端处理,没有耗时较长的计算;
  • 有频繁的方法调用,组件相互依赖比较多;
  • 没有足够的时间替换所有的Spring controller到Actor或者其他的Server(非tomcat)。

在一个简单的系统中,用Actor有什么坏处?

  • 有大量的消息(包装命令的类/来自actor)在组件传递,取代方法调用(OOP通过定义接口,有若干实现,但是Actor通过Final class);
  • 把字符串作为消息,也不是很好的解决方法--很难调试;
  • 在一些系统中(比如MVC应用),并没有太多需要同步的地方,往往只有两三个组件需要共享可变对象。通过java的Atomic包装类处理起来并不麻烦。

什么时候应当集成到现有应用?

  • 如果有大量的计算,可以通过Map-reduce的方式方法工作,eg:计算PI;
  • 系统有大量的客户端,即使逻辑很简单,当考虑性能和扩展性;
    • actor容易拓展,可以分割Actor 从一个到N个;
    • actor更安全的使用线程(并不需要1000个线程处理1000个客户端,往往只需要4个线程(四核))