问题标签 [akka-cluster]

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 回答
2878 浏览

scala - 集群中参与者之间的 Akka 和状态

我正在研究我的 bc 论文项目,它应该是一个用 scala 和 Akka 编写的 Minecraft 服务器。服务器应该可以轻松地部署在云中或集群上(不确定我是否使用了正确的术语......它应该在多个节点上运行)。但是,我是akka的新手,我一直想知道如何实现这样的事情。我现在要解决的问题是如何在不同节点上的参与者之间共享状态。我的第一个想法是让 Camel actor 从 minecraft 客户端读取 tcp 流,然后将其发送到负载均衡器,负载均衡器将选择一个处理请求的节点,然后通过 tcp 向客户端发送一些响应。假设我有一个 AuthenticationService 实现参与者,它检查用户提供的凭据是否有效。每个节点都会有这样的参与者(或者可能更多),并且所有参与者都应该始终拥有完全相同的用户数据库(或状态)。我的问题是,保持这种状态的最佳方法是什么?我想出了一些我能想到的解决方案,但我还没有做过这样的事情,所以请指出错误:

解决方案#1:将状态保存在数据库中。这对于这个身份验证示例可能非常有效,其中状态仅由用户名和密码列表表示,但在状态包含不能轻易分解为整数和字符串的对象的情况下,它可能不起作用。

解决方案#2:每次对某个参与者的请求会改变其状态时,该参与者将在处理该请求后,将有关更改的信息广播给所有其他相同类型的参与者,这些参与者将根据原始演员发送的信息。这似乎非常低效且相当笨拙。

解决方案#3:让某个节点充当某种状态节点,其中会有代表整个服务器状态的参与者。除了此类节点中的参与者之外,任何其他参与者都没有状态,并且每次需要一些数据时都会询问“状态节点”中的参与者。这似乎也效率低下,而且有点防错。

所以你有它。我真正喜欢的唯一解决方案是第一个,但就像我说的那样,它可能只适用于非常有限的问题子集(当状态可以分解为 redis 结构时)。更有经验的大师的任何回应都会非常感激。问候,托马斯·赫尔曼

0 投票
1 回答
1059 浏览

java - Akka 集群 Java API 示例

我对测试 2.0-SNAPSHOT Akka 集群功能非常感兴趣,但出于我的目的,我想在 Java 中执行此操作。

我已经阅读了这里的示例:http: //letitcrash.posterous.com/clustered-actors-with-cloudy-akka

但是 API 似乎已经发生了足够的变化(Cluster.startLocalCluster() 不再存在?),而且文档也很稀疏(意料之中),以至于我的修修补补变得非常缓慢。

有人知道一个小型示例应用程序,它通过 Java 中的 Akka 集群支持几个本地节点吗?

非常感谢。

0 投票
3 回答
7299 浏览

playframework - 发现集群中的 Akka actor

最近,我一直在尝试围绕 Akka 和基于 actor 的系统的概念展开思考。虽然我现在对 Akka 基础知识有了很好的理解,但在集群和远程 Actor 方面,我仍然在一些事情上苦苦挣扎。

我将尝试使用Play Framework 2.0 附带的 WebSocket 聊天示例来说明这个问题:有一个角色持有 WebSocket,并保留了当前连接用户的列表。演员基本上在技术上和逻辑上都代表了聊天室。只要在单个服务器上运行一个聊天室,它就可以很好地工作。

现在我试图理解当我们谈论在服务器集群上运行的许多动态聊天室(可以随时打开/关闭新房间)时,如何扩展这个示例(添加或删除单个节点)根据当前需求)。在这种情况下,用户 A 可以连接到服务器 1,而用户 B 连接到服务器 2。两者可能在同一个聊天室中交谈。在每台服务器上,仍然会有一个参与者(对于每个聊天室?),它持有 WebSocket 实例以接收和发布事件(消息)给正确的用户。但从逻辑上讲,服务器 1 或服务器 2 上应该只有一个聊天室参与者保存当前连接的用户(或类似任务)的列表。

您将如何实现这一点,最好是在“纯 akka”中并且不添加像 ZeroMQ 或 RabbitMQ 这样的额外消息传递系统?

到目前为止,这是我想出的,请让我知道这是否有意义:

  1. 用户 A 连接到服务器 1,并且分配了一个持有他的 WebSocket 的演员。
  2. 参与者检查(使用路由器?EventBus?其他东西?)活动聊天室的“聊天室参与者”是否存在于任何连接的集群节点上。因为它不是,它会以某种方式请求创建一个新的聊天室参与者,并将向/从这个参与者发送和接收未来的聊天消息。
  3. 用户 B 在服务器 2 上连接,并且也为他的 WebSocket 分配了一个演员。
  4. 它还检查请求的聊天室的参与者是否存在于某处,并在服务器 1 上找到它。
  5. 服务器 1 上的聊天室参与者现在充当给定聊天室的中心,向所有“连接”的聊天成员参与者发送消息并分发传入的参与者。

如果服务器 2 出现故障,则必须以某种方式在服务器 2 上重新创建/移动聊天室参与者,尽管这不是我现在主要关心的问题。我最想知道的是,演员的这种动态发现如何传播到各种基本独立的机器上,可以使用 Akka 的工具集来完成。

我已经查看 Akka 的文档很长一段时间了,所以也许我在这里遗漏了明显的东西。如果是这样,请赐教:-)

0 投票
1 回答
200 浏览

java - Akka 2.1.0-RC 集群路由器因找不到路由问题而终止

我正在编写一个 java/scala akka 概念证明,目前我在集群环境中摸索演员的概念。

规格

我有一个特定的情况,系统将相同的消息发送到多个节点。我的工作是不丢弃任何这些消息,只将 1 条消息传递给后端系统。就像具有负载平衡/故障转移功能的独特过滤器一样。

主意

我正在考虑在 2 个节点上使用 2 个“前端”actor,系统会将消息发送到前端路由器(比如说循环),该路由器发送到发送到后端的前端actor。

另一个后备解决方案是使用 only-leader-send-to-backend 系统,他们都收到相同的消息,只有领导者将其转发。

问题

我面临的问题(见代码)是我希望路由器使用现有的前端参与者作为集群上的路由。这在示例代码中失败了,因为路由器仅在本地通过routees-path(配置设置)查找路由,没有找到任何并死掉。

我也没有成功配置路由器在集群节点上部署路由。它总是会在本地部署它们。

我在这里有示例代码http://ge.tt/2UHUqoQ/v/0?c。有 2 个入口点 * TransformationSample.App2 - 运行两个实例,每个实例带有命令行参数 2551 和 2552(种子节点) * TransformationSample.App1 - 运行一个不带命令行参数的实例

App1 是尝试创建路由器并与之通信的应用程序,但路由器终止,因为它无法在本地找到前端路由器。我将问题固定到 akka.cluster.routing.ClusterRouteeProvider 类 createRoutees 方法第 178 行https://github.com/akka/akka/blob/releasing-2.1.0-RC1/akka-cluster/src/main/scala /akka/cluster/routing/ClusterRouterConfig.scala

结束时

我可能在这里做错了什么,请原谅我的 scala(这是我编写它的第一个项目)。

我希望这个路由器工作的原因是因为概念验证的下一步是使用类似的设置对后端系统进行负载平衡,其中前端参与者将与(单独的)后端集群路由器进行通信,该路由器发送与后端演员循环工作。

这是过度设计吗?我们必须对前端进行故障转移,在后端进行负载平衡。

0 投票
1 回答
810 浏览

akka - Akka 2.2 ClusterSingletonManager 将 HandOverToMe 发送到 [None]

我正在使用 Akka 2.2 contrib 的项目ClusterSingletonManager来保证集群中始终存在一种且只有一种特定类型的参与者(主)。但是,我观察到一种奇怪的行为(顺便说一句,这可能是意料之中的,但不明白为什么)。每当 master 退出集群并稍后加入时,都会发生以下操作序列:

为什么它试图发送HandOverToMeto [None]?它需要大约 20 秒(20 次重试)才能成为新的领导者,尽管在这种特殊情况下,前一个是众所周知的......

0 投票
1 回答
2094 浏览

scala - 在 Akka 的 ClusterRouter 中向路由广播消息

我正在尝试向ClusterRouter配置中的所有路由广播消息。我已经尝试了两种选择。这个:

和这个:

但是对于他们两个来说,只有一个slaves接收到消息。想法?


为了理解为什么我认为第一次尝试应该奏效,必须AdaptiveLoadBalancingRounter.scalaAdaptiveLoadBalancingRouterLiketrait 中查看 的Route创建时间:

0 投票
1 回答
806 浏览

akka - Akka Cluster 移除心跳连接消息

INFO 消息是什么

在 Akka 集群中是什么意思?我似乎在文档中找不到任何东西。在测试机器上运行大量带有actor的JVM时,我看到了这一点,但不确定这是否是一个需要某种Akka或Linux调整的坏信号。

Oracle JDK 1.7 上的 Akka 2.1.4

更新: 遵循@cmbaxter 的建议,我调查了调整心跳的选项。我发现增加/减少与心跳相关的时间对“删除最佳连接”消息的存在没有影响。但是,我注意到 'monitored-by-nr-of-members' 配置设置。我现在相信这些消息表明来自特定节点的心跳监控正在从一个 ActorSystem 传递到另一个。因此,他们表示当前系统只是说明它不再是它自己的责任,而不是表示任何类型的连接警告。实际上,在系统启动期间,第一个节点收到大量“第一次心跳”,但随后根据“成员监控”设置删除了其中的大部分,

0 投票
2 回答
1041 浏览

akka - Akka 集群 - 强制参与者停留在特定的机器上

我有一个 akka 应用程序,我将在许多机器上部署它。我希望这些应用程序中的每一个都通过使用分布式发布/订阅事件总线功能相互通信。

但是,如果我将系统设置为集群,那么我担心一个应用程序的参与者可能会在与他们启动的节点不同的节点上创建。

仅在启动它所属的应用程序的机器上创建参与者非常重要。

基本上,我不想要演员的弹性或集群,我只想要分布式发布/订阅。我可以看到像单例或角色这样的选项,这里提到了http://letitcrash.com/tagged/spotlight22,但我想知道推荐的方法是什么。

0 投票
2 回答
1800 浏览

akka - Akka Singleton - 不接受消息

是我愚蠢 - 我没有将索引器道具传递给系统创建。我会在这里留下答案,以防有人从中受益*

我正在创建一个单例并发送这样的消息:

注释掉的行显示了工作正常的非单例道具

当我运行该应用程序时,我收到以下错误:

所有其他功能都停止工作,这与暗示“coreIndexer”演员没有收到“start_indexing”消息的消息相关

更多代码:

看起来我正在向经理而不是单身人士发送消息。但是,当我向单例发送消息时,什么也没有发生:

0 投票
3 回答
4778 浏览

java - 单个 PC 中的多个 akka 系统

我们如何在一台 PC 上运行多个 akka 节点?目前,我在我的application.conf文件中关注。对于每个系统,我添加了不同的端口号,但是,我不能启动多个实例。错误说,Address already in use failed to bind

application.conf文件

更新:多个 akka 节点意味着,我有不同的独立服务器应用程序,它将使用 akka 与远程主节点通信。