akka介绍之-akka-remote介绍

akka-remote介绍

 

既然akka是构建分布式高并发的计算和运行框架,当然要离不开远程通信,akka的remote模块就是专门支持分布式的远程调用。

说到分布式应用,大家肯定想到以下几个耳熟能详的技术实现

  • RPCRemote Procedure Call Protocol
  • Web Service
  • RMI Remote Method Invocation
  • JMSJava Messaging Service

 

PRC调用框架或者WS以及RMI都是堵塞式的远程过程调用,请求-响应模式。

JMS是异步通信,发送消息进行通信,在通信过程中,线程不会被阻塞,不必等待请求回应,所以是一个异步操作且是松耦合不需要接口声明,返回的数据类型可以是各种各样,比如JSONXML等。

JMS的通信方式有两种:

  1. 点对点形式

顾名思义,点对点可以理解为两个服务器的定点通信,发送者和接收者都能明确知道对方是谁,大致模型如下:

akka介绍之-akka-remote介绍

  1. 发布-订阅模式

也就是多个消费者可以订阅一个消息如下图所示:

akka介绍之-akka-remote介绍

 

akka是基于消息的异步的分布式高并发计算框架,既有JMS基于消息的异步调用的特点,又有RPC的请求响应模式,同时它让远程过程调用变得十分简单。

下面是一个具体的AKKA-remote的例子。

创建远程服务端

  1. 首先定义一个remoteActor,和定义本地的actor一样,如下图所示:

akka介绍之-akka-remote介绍

  1. 在classpath路径下添加一个application.conf文件,配置该actor系统为提供远程调用功能,如下图示,只需要几个简单配置即可:

akka介绍之-akka-remote介绍

 

  1. 启动该actor,提供远程服务,如下图所示:

我们的名字叫app的akka系统已经提供服务并监听在127.0.0.1:2554上。

akka介绍之-akka-remote介绍

 

创建调用端

  1. 在classpath路径下添加配置文件application.conf,如同创建远程端一样。host和port不能和远程端冲突。

如下图所示:我们在8084端口上创建客户端的通讯端口。

akka介绍之-akka-remote介绍

 

  1. 通过ActorSystem的actorSelection(remotepath)获取远程actor的引用,然后就可以像操作本地actor一样,向它发送消息,如下图所示:

我们启动了客户的系统,并且获取远程actor的引用,并向它投递一个消息。

akka介绍之-akka-remote介绍

从以上的步骤和结果看出可以看出,Akka的远程通信跟JMS的点对点模式似乎更相似一点,但是它有不需要我们维护消息队列,而是使用Actor自身的邮箱,另外我们利用context.actorSelection获取的ActorRef,可以看成远程Actor的副本,这个又和RMI相关概念类似,所以说Akka远程通信的形式上像是RMI和JMS的结合,当然底层还是通过TCP、UDP等相关网络协议进行数据传输的,从配置文件的相应内容便可以看出。