当前位置: 首页 > 知识库问答 >
问题:

如何在Akka集群中透明地创建参与者

戚祺
2023-03-14

我有一个演员系统,如下图所示。

Master
|
|--Monitor
|
|--Supervisor
      |
      |--Device #1
      |--Device #2
      |-- ...
      |--Device #N

主演员启动监控演员和监控演员。

Monitor actor会发出一条消息,告诉自己每30秒检查一次设备资源清册。对于资源清册中存在的每个设备,它会向Supervisor actor发送一条消息以注册该设备。

主管参与者在收到来自监视器参与者的消息以注册设备时启动设备参与者。

代码可以在github上找到。

在单个JVM实例中,一切都运行得很好,但当涉及到集群模式时,我开始感到困惑。

正如我所期望的,使用以下配置,前面的actor树应该在集群机器中透明地运行。所有的参与者都应该在集群中创建,我不应该关心参与者是在哪台机器上创建的。

实例#1中:

akka {
  actor {
    provider = "cluster"
  }
  remote {
    log-remote-lifecycle-events = off
    netty.tcp {
      hostname = "127.0.0.1"
      port = 2551
    }
  }

  cluster {
    seed-nodes = [
      "akka.tcp://example@127.0.0.1:2551",
    ]
  }
}

在实例#2上:

akka {
  actor {
    provider = "cluster"
  }
  remote {
    log-remote-lifecycle-events = off
    netty.tcp {
      hostname = "127.0.0.1"
      port = 2552
    }
  }

  cluster {
    seed-nodes = [
      "akka.tcp://example@127.0.0.1:2551",
    ]
  }
}

我所期望的是:

Master (On node 1)
|
|--Monitor (On node 2)
|
|--Supervisor (On node 2)
      |
      |--Device #1 (On node 1)
      |--Device #2 (On node 1)
      |-- ...
      |--Device #N (On node 2)

但是,它最终在集群中运行两个相同的actor树:每个节点分别运行一个actor树,如下图所示:

Node 1             |   Node2
                   | 
Master             |   Master
|                  |   |
|--Monitor         |   |--Monitor  
|                  |   | 
|--Supervisor      |   |--Supervisor 
    |              |       |      
    |--Device #1   |       |--Device #1
    |--Device #2   |       |--Device #2
    |-- ...        |       |-- ... 
    |--Device #N   |       |--Device #N 

我还尝试在集群中以单例参与者的身份运行主参与者,但它最终在启动主参与者的节点上运行单参与者树。

所以,我的问题是,我如何通过调用context.actor(DeviceActor.props(deviceId))来创建跨集群的演员,而不需要仔细设计带有集群单例和集群分片的演员树?

共有1个答案

卫君博
2023-03-14

你所描述的是Akka集群分片的确切定义。

当您需要将参与者分布在集群中的多个节点上,并希望能够使用其逻辑标识符与他们交互,但不必关心他们在集群中的物理位置(这也可能随时间而改变)时,集群分片非常有用。

设置它非常简单,特别是如果您已经有了集群。监视器将是一个集群单例,因此集群上只有一个活动的,并且每个设备都是由设备ID标识的实体。

 类似资料:
  • 我遇到了一个场景,我需要检查特定的参与者是否存在,这可以通过ActorSystem完成。actorSelection方法,指定参与者路径 但是,当本地节点上存在此类参与者时,此方法可以正常工作。若actor系统由多个节点组成,并且actor存在于另一个节点上,则该方法告诉我们actor不存在。若我给出指定远程参与者系统的字符串,那个么这个方法可以工作。但在actorSelection方法中指定远程

  • 我希望能够从集群的一个Akka节点创建一个actor,这样actor就可以生存,而不管创建它的节点是否正在运行。 这是我试图处理的场景: 节点A启动。 节点B启动。 节点A和B形成群集。 节点A创建FooActor。 节点A终止。 节点B仍然能够搜索并找到节点A创建的FooActor 节点B会杀死fooactor。 此时,当节点A终止时,它创建的参与者将丢失。 你能告诉我这是否可能使一个参与者比创

  • 我的用例是,我想建立一个运行Akka Actors的节点集群。每个参与者都是同一参与者的实例,用于处理与特定用户的WebSocket连接。每个参与者都将使用唯一的路径注册自己。在非集群设置中,我可以简单地通过其路径调用actor,如其中,是actor实例的唯一名称。我必须将消息传递给这些参与者,这样他们才能将消息发送回各自的WebSocket客户端。 显然Akka集群提供了各种设置:http://

  • 我正在尝试脚本创建视频使用ImageMagick创建一些覆盖,然后放在一个视频的顶部。 如果我尝试直接使用ImageMagick创建的图像,透明度会被绘制为不透明。 我已经使用ImageMagick绘制命令创建了一个透明的PNG。当加载到GIMP中并进行检查时,PNG具有alpha通道,并且每个透明像素看起来具有透明度:RGBA=0,0,0,0 我可以通过获取覆盖图像,在GIMP中加载它,然后选择

  • 我的fxml文件中只有一个带有ImageView的AnchorPane,其中包含png图像 我到处找了,但找不到任何解决办法,任何帮助都不胜感激。谢谢

  • 我有一个akka集群项目: https://github.com/roclas/akka-distributed-hash 它基本上是跨集群节点的分布式HashMap。 我希望能够读取(使用tcpdump或wireshark或类似工具)不同虚拟机中参与者之间交换的消息。 我怎么能这么做? 执行TCP转储时,我只看到“集群消息”,但看不到不同虚拟机中不同参与者交换的消息。 如果我在端口2551上启动