【问题标题】:How to create actors transparently across an Akka cluster如何在 Akka 集群中透明地创建 Actor
【发布时间】:2017-12-04 07:58:08
【问题描述】:

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

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

Master Actor 启动 Monitor Actor 和 Supervisor Actor。

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

Supervisor actor在收到Monitor actor注册设备的消息时启动设备actor。

代码在 github 上here 可用。

在单个 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 

我还尝试将 Master Actor 作为集群中的单例 Actor 运行,但它最终会在启动 Master 的节点上运行单个 Actor 树。

所以,我的问题是,我如何通过调用 context.actorOf(DeviceActor.props(deviceId)) 在集群中创建一个参与者,而不用仔细设计集群单例和集群分片的参与者树?

【问题讨论】:

  • akka-cluster-sharding 可能是您需要的。
  • 谢谢@Horsiath。我一开始误解了 Akka 集群分片的作用,虽然很简洁,但您的回复帮助我指出了正确的方向:)

标签: scala akka cluster-computing actor


【解决方案1】:

你描述的是Akka cluster sharding的确切定义。

当您需要将参与者分布在集群中的多个节点上并希望能够使用它们的逻辑标识符与它们进行交互但不必关心它们在集群中的物理位置时,集群分片很有用,这也可能会改变随着时间的推移。

设置起来非常简单,尤其是在您已经拥有集群的情况下。 Monitor 将是一个 Cluster Singleton,因此集群上只有一个活着的,并且每个 Device 都是由设备 ID 标识的 entity

【讨论】:

  • 非常感谢@ghostdogpr,现在我完全理解了集群分片的工作原理。我期待 Akka 集群完成所有工作,但目前似乎不可能。我根据您的建议修改了我的代码,现在它适用于集群中的所有机器。代码可以在这里看到:github.com/aries-zhang/akka-demo/tree/cluster-sharding 供那些想作为参考阅读的人阅读。
  • 对于像我一样困惑的 Akka 初学者的另一个好材料:michalplachta.com/2016/01/23/…
猜你喜欢
  • 2016-02-06
  • 2018-07-17
  • 2018-07-02
  • 1970-01-01
  • 1970-01-01
  • 2016-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多