【发布时间】: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