上一章akka学习之actor引用,路径和地址介绍了如何使用actor路径来让actor的位置变得透明。但是一些特殊的特性有必要再额外介绍下,因为在不同的编程语言,平台和技术环境中,远程透明的意思非常也不一样。
默认分布式
在akka中,每件事情的设计目的都是工作在分布式环境中的:所有actor之间的交互都是通过纯粹的消息传递来实现的所有的事件都是异步的。akka所做的工作是确保不管在单机还是几百台机器组成的集群中,所有的方法都能被找到。实现这个功能的关键是通过最优路径的方式从远程到本地,而不是通过一般从本地到远程的方法。
哪种方式会打破透明性
akka的正确性并不依赖于应用需要正确的使用它,因为分布式执行的设计已经对什么是可能的行为做出了限制。最明显的一点是,在网络中传输的消息必须是可串行化的,而一个没有这么明显的例子如果一个actor是在远程节点中创建时,作为actor工厂的闭包也包含在里面(比如props)。
另一个重要的结果是,所有的交互事件都必须是异步的。因为在一个计算机网络中,消息到达接收者可能需要几分钟,而且在网络中消息的丢失率比在同一个jvm中要更高,同一个jvm中的丢失率几乎为0(没有硬性保证)。
如何使用远程
我们说akka是路径透明性的原因是因为akka中几乎没有远程调用层的API:它只是通过配置来驱动。你只需要根据前面章节中列出的提纲来写你的代码,然后再配置文件中指定actor子树的远程部署。通过这种方式,你的应用可以不用改变代码就能扩展出去。而唯一影响远程部署的可编程API接口是Props包含了可指定部署实例的属性,它与通过配置文件指定远程部署等效(如果两种都有,那么配置文件优先)。
点对点网络(p2p) VS 客户端-服务器(C/S)模式
akka远程通信采用的是p2p模式来连接各个actor系统,这也是actor集群的基础。这种p2p的设计思想主要来源于下面两个:
1.actor系统之间的通信是对称的:系统A可以连接到系统B,那么系统B也能独立的连上系统A.
2.根据连接模式,通信系统的角色是对称的:没有哪个系统是只能发起连接的,也没有哪个系统是只能接受连接的。
p2p模式带来的结果是通过预定义系统角色或者使用网络地址转换和负载均衡来创建纯C/S模式是不可能的。对于C/S模式最好使用HTTP和akka I/O。
通过路由来横向扩展标记点
除了在同一系统的不同机器运行不同的部分之外,也可能通过支持创建多个actor子树横向扩展到多核处理,以便支持并发处理,就像一个搜索引擎可以并行的处理多个请求一样。多个actor实例可以通过不同的方式被路由到,比如轮询的方式。为了实现路由的目的,开发者唯一要做的事情是声明一个路由actor,然后,创建出来的路由actor会创建出一定数目(数目可以配置)的目标actor,并且更加配置的路由方式路由到这些目标actor。一旦一个路由actor在配置文件中被声明之后,它的配置可以被任意的override,包括把它与某些子actor的远程部署相混合。