akka remote

2024-04-10 16:18
文章标签 remote akka

本文主要是介绍akka remote,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

http://www.soso.io/article/8715.html

Akka的设计目标就是为分布式准备的,因此所有Actor之间的交互都是通过消息,且所有动作都是异步的。这种做法就是为了确保Akka的所有功能无论是在单独的JVM,还是包含了成百上千机器的Cluster,都是可用的。

然而,本地与分布式总是存在区别,主要牵涉到两点:

消息需要支持序列号;

消息传递的可靠性问题;

为了保证本地处理与分布式处理的透明化,Akka几乎没有特别为Remoting Layer提供专门的API,区别仅在于配置。开发者只需遵循Actor设计的原则,然后在配置中指定Actor子树的远程配置即可。当然,在代码层面,Akka也提供了唯一与众不同的API,就是在包含部署信息的Props中,可以允许设置Deploy实例。不过,这件事情是可以配置的。倘若两者都设置了,配置文件优先。

若要支持Scale up,Akka提供了多个Actor子树以支持并行处理。然后以多种方式进行路由。开发者唯一要做的事情是声明一个确定的Actor作为“withRouter”,事实上就是创建一个路由Actor,它能够生成所需类型Children的数量值,该数量值是可以配置的。

Remote Actor

要调用Akka的Remote Actor,则需要对Remote Actor进行部署。首先,我们可以通过Akka的官方网站下载Akka的库。我这里下载的是2.2.3版本。下载后解压。与部署有关的目录包括bin和deploy。在bin目录下是运行Akka的脚本。而在deploy目录下,除了Readme文件外,此时为空。

现在,我们可以编写一个Remote Actor。Akka要求我们定义一个Actor,以及它对应的Application。Remote Actor与普通的Actor定义没有什么区别,例如:


package com.agiledon.akka import akka.actor.Actor class RemoteActor extends Actor { def receive = { case message: String => sender ! message + "got something" } 
} 

但对于Application而言,则要求派生自akka kernel下的Bootable。akka kernel是单独的一个包,并没有包含在akka-actor中。因此需要定义依赖,例如使用sbt:


libraryDependencies += "com.typesafe.akka" % "akka-actor_2.10" % "2.2.3" libraryDependencies += "com.typesafe.akka" % "akka-kernel_2.10" % "2.2.3" 

定义的Application如下所示:

package com.agiledon.akka import akka.kernel.Bootable 
import akka.actor.{Props, ActorSystem} 
import com.typesafe.config.ConfigFactory class RemoteNodeApplication extends Bootable { val system = ActorSystem("RemoteNodeApp", ConfigFactory.load().getConfig("RemoteSys")) def startup = { system.actorOf(Props[RemoteActor], name = "remoteActor") } def shutdown = { system.shutdown() } 
} 
我们需要实现startup与shutdown方法。而在Application中,会加载配置文件application.conf的配置信息创建ActorSystem。配置如下:RemoteSys { akka { actor { provider = "akka.remote.RemoteActorRefProvider" } remote { enabled-transports = ["akka.remote.netty.tcp"] netty.tcp { hostname = "192.168.3.34" port = 2552 } } } 
}

端口号2552也是Akka的默认端口号。

部署Remote Actor

application.conf文件应该放到resources目录下。编译打包。然后将编译得到的jar包拷贝到akka的deploy目录下。然后转移到bin目录下,执行akka脚本(windows下是执行akka.bat): ./akka com.agiledon.akka.RemoteNodeApplication

akka命令后面是application类的full name。如果一切正常,就可以显示界面

Client(Local) Actor

要调用部署了的Remote Actor,客户端的Actor可以通过将Remote Actor的address传递给actorSelection()方法(之前的版本为actorFor,目前已经被Deprecated),以此来获得Remote Actor的Ref。如下所示:


package com.agiledon.akka import akka.actor.{ActorLogging, Actor} 
import akka.util.Timeout 
import akka.pattern.ask 
import scala.concurrent.Await 
import scala.concurrent.duration._ class LocalActor extends Actor with ActorLogging { val remoteActor = context.actorSelection("akka.tcp://RemoteNodeApp@192.168.3.34:2552/user/remoteActor") implicit val timeout = Timeout(5 seconds) def receive = { case message: String => val future = (remoteActor ? message).mapTo[String] val result = Await.result(future, timeout.duration) log.info("Message received from server -> {}", result) } 
} 

同样需要定义配置文件,但无需指定hostname与port了:

LocalSys { akka { actor { provider = "akka.remote.RemoteActorRefProvider" } } 
}

编写Application,使其可以被运行以调用Remote Actor:

package com.agiledon.akka import akka.actor.{Props, ActorSystem} 
import com.typesafe.config.ConfigFactory object LocalNodeApplication extends App { val system = ActorSystem("LocalNodeApp", ConfigFactory.load().getConfig("LocalSys")) val localActor = system.actorOf(Props[LocalActor], name = "localActor") localActor ! "hello demo actor" Thread.sleep(4000) system.shutdown() } 

在客户端模块的根目录下创建build.sbt文件:

name := "actor-local" version := "1.0" scalaVersion := "2.10.2" libraryDependencies += "com.typesafe.akka" % "akka-actor_2.10" % "2.2.3" libraryDependencies += "com.typesafe.akka" % "akka-remote_2.10" % "2.2.3" 

转移到客户端模块的根目录下,执行sbt命令,进入SBT。执行compile命令编译客户端模块actor-local。然后执行run。

https://my.oschina.net/u/1182761/blog/160587

1.

Exception in thread "main" java.lang.ClassNotFoundException: akka.remote.RemoteActorRefProvider 

原因:缺少akka-remote-2.0.2.jar包
2.

 Exception in thread "main" java.lang.NoClassDefFoundError: com/google/protobuf/MessageLite

原因:缺少protobuf-java-2.4.1.jar包

3.

Caused by: java.lang.ClassNotFoundException: org.jboss.netty.util.HashedWheelTimer

原因:缺少netty-3.3.0.Final包

4.

Exception in thread "main" org.jboss.netty.channel.ChannelException: Failed to bind to: /192.168.1.101:2553

原因:配置文件中的IP地址没有写对!

5.当建立好的连接,有一方退出时,另一方会爆出错误! 还未解决。。。
拟解决方法:当这个异常java.io.IOException出现时,将其捕获,并作出相应的提示即可。
解决方法:通过在ActorSystem中注册相应的监听事件,然后在对应actor的onReceive方法中进行捕获即可~

6.

Exception in thread "main" com.typesafe.config.ConfigException$Missing: No configuration setting found for key 'serverApplication'

IP地址写的不对!

7.

java.nio.channels.ClosedChannelException:null

指定IP端的ActorSystem没有启动,或者是IP写错!

这篇关于akka remote的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/891539

相关文章

Docker远程连接和Docker Remote Api

在Docker生态系统中一共有3种API:Registry API、Docker Hub API、Docker Remote API 这三种API都是RESTful风格的。这里Remote API是通过程序与Docker进行集成和交互的核心内容。 Docker Remote API是由Docker守护进程提供的。默认情况下,Docker守护进程会绑定到一个所在宿主机的套接字:unix:///v

【VSCode v1.93.0】手动配置远程remote-ssh

开发环境 VS Code版本:1.93.0 (Windows) Ubuntu版本:20.04 使用VS Code 插件remote-ssh远程访问Ubuntu服务器中的代码,若Ubuntu无法联网,在连接的时候会报错: Could not establish connection to "xxxx": Failed to download VS Code Server(Failed to

Unity Adressables 使用说明(四)分发远程内容(Distribute Remote Content)

概述 远程分发内容可以减少应用程序的初始下载大小和安装时间。你还可以更新远程分发的资源,而无需重新发布应用程序或游戏。 当你将远程 URL 分配为 Group 的加载路径(Load Path)时,Addressables 系统会从该 URL 加载组中的资源。当你启用Build Remote Catalog选项时,Addressables 会在 Remote Catalog 中查找任何远程资源的

ssh问题:Connection closed by foreign host. Disconnected from remote host

放通一个远程ip能够ssh服务器,但是报错: Connection closed by foreign host.   Disconnected from remote host。。。   解决办法: firewall防火墙放通ip。 /etc/ssh/sshd_config文件修改,运行root用户密码登,再重启sshd服务。 /etc/hosts.allow和/etc/hos

Linux - SSH: WARNING REMOTE HOST IDENTIFICATION HAS CHANGED

一、问题     通过 SSH 登录节点时遇到的问题 二、方案     通过 vi ~/.ssh/known_hosts 删除对应节点 ip 的 rsa 信息即可

在SourceTree建立GitHub远程Remote文件

1: 在GitHub新建⼀個newPository,可以取任何名字(有严格项目规定的要建成private!) 2: 在Source Tree找到Setting, 點擊進⼊ 3:在Remotes裏點Add 4: 添個名字任意的如test或後⾯面的origin,然後點RL/ path後的地球icon 5: 搜索在github裏建⽴的名字,選中點OK 6:一直點擊OK

Microsoft Remote Desktop for Mac 正版免费下载最新版 使用方法

一、下载地址 https://install.appcenter.ms/orgs/rdmacios-k2vy/apps/microsoft-remote-desktop-for-mac/distribution_groups/all-users-of-microsoft-remote-desktop-for-mac 安装   二、使用方法 1. 连接信息     2.

The remote endpoint was in state [TEXT_FULL_WRITING] which is an invalid state for called method 已解决

前面有个webSocket自动断开连接的问题,已解决,请见博客: webSocket java.io.EOFException: null 增加心跳机制解决 然后又报了一个错: java.lang.IllegalStateException: The remote endpoint was in state [TEXT_FULL_WRITING] which is an invalid st

Redis(Remote Dictionary Server)

Redis(Remote Dictionary Server),即远程字典服务,是一个开源的、使用ANSI C语言编写的、支持网络的、可基于内存亦可持久化的日志型Key-Value数据库。以下是关于Redis的详细介绍: 一、Redis的特点 数据类型丰富:Redis支持多种数据类型,包括字符串(String)、哈希(Hash)、列表(List)、集合(Set)和有序集合(Sorted Set

RabbitMQ练习(Remote procedure call (RPC))

1、RabbitMQ教程 《RabbitMQ Tutorials》https://www.rabbitmq.com/tutorials 2、环境准备 参考:《RabbitMQ练习(Hello World)》。 确保RabbitMQ、Sender、Receiver容器正常安装和启动。 root@k0test1:~# docker run -it --rm --name rabbitmq