问题标签 [akka-remote-actor]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
775 浏览

playframework - 分布式播放框架应用程序中远程参与者系统之间的交叉通信

我试图找出构建我的应用程序的最佳方法,以便我可以以冗余方式从我的播放框架应用程序发送推送通知。

我想实现一个“休息期”,在用户修改数据后 30 秒向移动设备发送推送通知。如果用户在这 30 秒内进行了另一次修改,则需要取消原始通知并替换为应在最近一次修改后 30 秒发送的新通知,依此类推。

问题是我的 API 后端需要相互通信以确保它们不会在 30 秒内发送多个通知,因为它们是负载平衡的。例如:

  1. User1 进行了修改,该修改被发送到 API Server1。在 30 秒内触发通知。
  2. User1 在 5 秒后对同一记录进行第二次修改,最终被路由到 API Server2。另一个通知被触发在 30 秒后发送,因为它不知道 Server1 收到的信息。

这是不正确的行为 - User1 应该只收到一个通知,因为修改发生时数据没有“静止”30 秒。

由于我对 Akka 不是特别熟悉,这似乎是一个很好的学习机会。看起来我可以用 Akka 远程处理来解决这个问题。

这是我能想到的最简单的架构:

  • 在 API 的每个实例中创建一个 akka 系统(“通知”),并使用路由器将消息发送到每个 API 实例,每个 API 实例都有一个 Akka 演员(“通知演员”)

我的 application.conf 看起来像这样:

我正在像这样设置系统、演员和路由器:

当我需要发送通知时,我会告诉我的演员安排它。这样每个系统都可以保留键/值对中的 Cancelable 实例,并在数据在不同服务器上更新时取消通知:

Client.scala(近似值,可能有错别字)

NotificationController.scala(近似值,可能有错别字)

CancelNotification.scala(近似值,可能有错别字)

ScheduleNotification.scala(近似值,可能有错别字)

NotificationActor.scala(近似值,可能有错别字)

这在本地工作得很好,但是一旦我将它部署到我的测试环境(使用多台机器),其他所有消息似乎都丢失了。我认为这是因为它试图将这些消息发送到 Server2,但我在任何一个应用程序的日志文件中都没有看到任何错误。我尝试在我的 akka 配置中添加更多日志记录,但在 logs/application.log (默认播放框架日志)中没有看到任何额外的输出:

为什么 Server2 收不到消息?我可以在每个实例上使用来自所有服务器的演员来实例化一个演员系统吗?他们应该能够交叉通信吗?

此外,如果我对此过于复杂,我愿意接受其他解决方案。如果我能让它工作,这似乎是最简单的方法。

0 投票
0 回答
120 浏览

akka - Akka Remote 多连接

我有两台服务器 A 和 B。它们通过 Akka Remote 进行通信。服务器 B 中的 Actors 监视服务器 A 中的 Actor。当服务器 A 重新启动升级时,可能有两个由 B 向 A 发起的 tcp 连接。现在如果服务器 B 向服务器 A 发送消息。服务器 B 的 akka 日志显示请求的发送但没有收到回复。服务器 A 的 Akka 日志显示了请求的接收和响应的发送。我正在使用 Akka 2.3.12 那么会发生什么?我应该如何避免它?谢谢

0 投票
1 回答
116 浏览

scala - 如何为 netlogo 扩展打包 akka 项目?

我正在尝试制作一个基于 akka 的简单 NetLogo 扩展。但是,每当我尝试在 NetLogo 中加载扩展时,都会收到错误消息:

这显然意味着缺少某些配置。然后我继续将reference.conf 添加到我的资源文件夹中,但没有运气。

我尝试的最后一件事是使用 sbt-assemblty 插件,但我一直收到同样的错误。所以这是我的 build.sbt:

我有一个项目/assembly.sbt 内容:

我在根目录中有一个 assembly.sbt,内容如下:

在我的 scala 代码中,我有:

资源文件夹包含我目前不使用的 application.conf。用表达式“reference”greping jar tf 命令的输出,清楚地表明 reference.conf 存在:

在此处输入图像描述

如何为 netlogo 扩展打包这个 akka 示例?

注意:我已经包含 akka-actor 和 akka-remote 作为库依赖项。我在 OS X 平台上使用 Intellij 和 SBT 0.13.8。

编辑:接受 Ayush 的建议后,我从命令 sbt 程序集得到以下输出,但是仍然存在相同的异常:

在此处输入图像描述

0 投票
1 回答
906 浏览

networking - Akka 远程处理绑定到主机名而不是绑定主机名

语境

我正在尝试在节点上运行 akka 应用程序,并使用 akka 远程处理功能使其与其他节点一起工作。

我的节点有一个 IP 地址 ,10.254.55.10并且有一个外部 IP 10.10.10.44,重定向到前者。这个外部 IP 是我希望其他节点与我联系的一个。

从我的 akka 应用程序配置中提取:

我知道网络端一切正常,因为当我使用 netcat 监听我的 IP 时,我可以使用外部 IP 通过 telnet 向自己发送消息。

换句话说,在单独的 shell 中运行这两个命令时:

$ nc -l 10.254.55.10 2551

$ telnet 10.10.10.44 2551

我能够与自己通信,证明两个 IP 之间的网络重定向工作正常。

问题

启动应用程序时,它会因绑定错误而崩溃:

我认为导致它崩溃的原因是它试图绑定到本地不存在的IP(即10.10.10.44)。但是我首先不明白的是为什么akka甚至试图绑定到10.10.10.44,因为它不是我的绑定主机名(即10.254.55.10)。这个文档页面对我来说似乎很清楚,但它不起作用......

0 投票
1 回答
125 浏览

java - Akka Remote 和通过自定义反序列化拦截未知类

问题/背景。我需要向远程参与者发送一些消息。这些消息可能包含接收方未知的类的对象。而且我需要拦截这种情况以避免ClassNotFoundException。

一种解决方案可能在于在消息反序列化时拦截未知类。然后,该消息可能被不同的应用程序级消息替换,以便远程参与者可以与发送者沟通它没有所需的类。

我不知道这样的拦截是否可行,因为自定义反序列化器必须实现 akka.serialization.Serializer ,它具有以下方法

现在,问题源于为未知类的对象构建 Class 对象(由 Akka 完成)。

有没有办法在较低级别自定义 Akka 反序列化以适应我的需求?

其他解决方案

  • 该问题类似于以下 SO 问题中描述的问题,其中提出了不同的解决方案:将远程对象反序列化为最窄的可访问类 在那里有答案仍然很有用。但是,该解决方案对我来说还不够,因为虽然可以限制接口,但我仍然需要一个带有额外方法的类实现。
0 投票
1 回答
205 浏览

akka - Akka 中的反序列化和类加载 - NoClassDefFoundError

我正在尝试设置一个 Akka 系统,其中反序列化错误会触发交换缺失类的协议。为此,我使用了一个自定义的反序列化器,一旦它捕获到与缺失类相关的异常,它就会向应用程序参与者返回一条消息。

简单来说,远程系统 B 向系统 A 发送一个对象;如果在反序列化期间,系统 A 得到ClassNotFoundErrorNoClassDefFoundError,则系统 A 向系统 B 询问未定义类的字节码。当 A 收到 B 的响应(是一对类名加上一个 Array[Byte] 类型的对象)时,就可以注册该类,这样下次系统 B 将对象发送给系统 A 时,A 就可以对其进行反序列化正确。

现在有两种方法

1)系统B也发送所有与请求的类相关的类

2) 系统 B 只发送所请求类的字节码(没有它的依赖项)

现在,让我们关注方法 2 并考虑以下场景

  • 1)B ===obj:X==> A(B将X类的对象发送给A)
  • 2) 假设 X 取决于 Y,Z
  • 3) B <====X?==== A (A 向 B 询问班级 X)
  • 4)B =====X====> B(B向A提供X类;A注册X类)
  • 5) B ===obj:X==> A (A 因缺少依赖项 Y 而出错)
  • 6) B <====Y?==== A
  • 7)B =====Y====> A(A注册Y类)
  • 8) B ===obj:X==> A
  • 9) B <====Z?==== A
  • 10)B =====Z====> A(A注册Z类)
  • 10) B ===obj:X==> A(OK,终于A可以反序列化X类的对象了)

我认为这样的协议应该可以工作,但在实践中,由于以下原因,我在步骤 5-7 中得到了一个循环

NoClassDefFoundError: Lexamples/DemoDecentralizedAkkaPlatformCmdLineMain2$AggregateProgram$$anonfun$main$3$$anonfun$apply$5;

我要注册以下课程:examples.DemoDecentralizedAkkaPlatformCmdLineMain2$AggregateProgram$$anonfun$main$3$$anonfun$apply$5

但是我不断收到 NoClassDefFoundError。

请注意,我去掉了开头的“L”和尾随的“;” 来自类名,以及将“/”替换为“.”。否则,我会在系统 B 上收到错误。

我很抱歉这个问题的表述如此复杂。

0 投票
0 回答
128 浏览

akka - 如何对分布在 akka 集群中的参与者进行分组?

有没有办法对分布在 akka 集群中的参与者进行分组,并为每个组设置最大参与者数量?我正在寻找的是类似于集群中节点的 akka角色,但更细粒度,即跨节点分布的角色角色。

谢谢

0 投票
2 回答
1486 浏览

scala - AKKA 远程演员错误

我正在尝试通过以下方式运行 AKKA 远程示例

远程actor在机器中启动(ip地址为192.168.1.7);但是当我从我的机器启动本地演员时,它无法连接到远程演员。请找到本地和远程参与者系统配置:

当地的:

偏僻的:

本地系统中用于连接远程参与者的代码:

当我启动本地系统时,我收到以下消息:

0 投票
1 回答
59 浏览

akka - 从 RemotingShutdownEvent 检索节点地址

我们目前正在从 Akka 2.0.4 更新到 2.4.2(我知道,这是一个很大的飞跃,但没有人想过逐步进行)。

无论如何,在旧代码库中,我们的主节点连接到一些有时会失败的远程从节点(“为什么”仍有待调查)。当一个slave死掉时,master会收到一个RemoteClientShutdown事件,我们可以从中提取getRemoteAddress并相应地处理它(例如,每封指向故障节点地址的电子邮件通知管理员)。

在版本 2.4.2 中,该类被RemotingShutdownEventRemoteClientShutdown替换(至少我认为是这样),作为一个对象,它不携带有关事件源的任何特定信息。

我检查了迁移指南以及当前文档,但找不到有关如何解决此问题的信息。根据事件总线文档,提取此类信息的唯一方法是在消息中提供它(“请注意,事件总线不保留已发布消息的发送者。如果您需要对原始发送者的引用,则必须在消息中提供它”)。

我应该以某种方式覆盖远程系统关闭时发送的消息吗?或者有没有其他推荐的方法来解决它?我希望这个问题不是太新手,我对 Akka 还是很陌生。

0 投票
2 回答
1109 浏览

akka - Akka Remote:获取自动生成的端口

我有一个 Java 客户端,它获取一个自动生成的端口。启动actor系统后,我想访问端口。

端口必须已经设置,因为之后的日志输出ActorSystem.create(...)是这样的:

如果我尝试通过配置来获取它actorSystem.settings().config().getValue("akka.remote.netty.tcp.port"),我仍然会得到之前定义的 0。

有谁知道如何访问此端口(示例中为 58735)?