Akka简介
Akka是什么:“Akka是在JVM上构建高并发、分布式、弹性消息驱动应用的开源工具包”。弹性意味着要积极响应失败情况,从失败中恢复的能力。
其实Akka的定义很符合响应式领域模型,这个模型有几个基本特征:
1、弹性。面对失败的响应能力
2、伸缩性。不同负载情况下的响应
3、消息驱动。高内聚低耦合,通过异步消息隔离
4、响应能力。限定延迟
如果一个Akka设计的比较好,可以很容易满足响应式模型的基本要求。毕竟Akka也是围绕失败来做设计的。Akka通过消息驱动和其他完美(至少我认为)的设计,支持了高响应性、高容错性、高可伸缩性。这几个特性对于分布式系统来说还是相当重要的。
Akka actor
actor实现了状态不共享、基于异步消息传递机制的Actor模型。这个可以类比OOP中的对象来理解,但要注意区别。每一个actor都有一个ActorRef与之关联,有点类似于OOP对象的指针。所有的消息都必须通过ActorRef发送,Actor模型的消息驱动本质就是通过使用它来实现的。本质来说,actor可以接收的消息就是对外暴露接口的输入,返回的消息就是接口的输出。
remoting
Akka让actor的位置变得透明,使用ActorRef发送消息时,并不需要关心对应的actor是在本地还是在其他机器上。如果设计得当,通过修改配置就可以使系统变成分布式。
clustering
在Akka中设计集群系统也会非常简单,毕竟actor的位置是透明的,你只需要做的可能就是给集群设置一个或多个节点。actor系统使用gossip协议的变体管理集群的成员。集群中节点的生命周期的变化都会以消息的方式通知其他节点。
集群分片
sharding的想法最初被应用于数据库中,当单个数据集过大,无法被包容在单个节点中时,需要进行分片处理。集群分片,无形中水平扩展了系统的处理能力。
集群单例
集群的另一个重要的技术点就是集群单例,即在集群中始终有且只有一个特定的actor实例,它的位置不重要,重要的是只能有一个。如果要自己实现一个集群单例的节点,感觉还是挺复杂的,但Akka居然自带这个功能,只能说太牛逼了。
Akka HTTP
提供了一种在Akka之上构建HTTP API的方法,如果你要问这有什么用,毕竟已经有那么多的HTTP库了,那你好好看看Akka提供了那么多的功能,就知道原因了。
TestKit
TestKit专门用来测试akka系统。具体的功能或者特性,读者可以自己探讨
Akka Streams
Akka Streams提供了一个更高级别API来与actor进行交互,同时提供自动处理“背压”(back pressure)的机制。简单点来说,Akka Streams就是基于actor的DSL,并提供一些基础的特性。如果一个分布式系统支持背压机制,还是很牛掰的,毕竟这个机制单独实现还挺麻烦的。
消息传递
Actor模型指定消息传递应该是actor进行通信的唯一方式,并且所有操作都应该是为了响应此消息传递才发生的。Akka中有三个消息传递机制,分别代表不同的设计模式。
1、tell。就是 fire and forget 消息机制,它不会阻塞当前代码,不等待任何响应。连是否发送成功都不期望,就是尽可能的发送消息。
2、ask。这个跟调用OOP对象的方法有点类似,给目标actor发送消息,阻塞当前代码等待响应,且一定会有响应。超时后返回null也是一种响应。
3、发布/订阅。各个actor之间通过引用事件总线来发布消息,即消息的接受者必须订阅该类型的消息,然后才能接收其他actor发布的同类型的所有消息。各个actor并不知道对方的存在。事件总线有点类似于消息中转站的功能。
actor 系统
actor系统为actor提供通信的基础功能,例如位置透明、创建actor等
这一章节书籍的作者介绍了Akka的各个技术细节,但还是有很多没有讲到的。例如位置透明具体怎么用呢?集群开发的基本设计模式是神马,随着后面章节,才会慢慢了解Akka构建分布式系统的巨大威力。